cordova platform add:添加第二个平台会删除现有插件和平台的节点模块
cordova platform add: adding second platform removes node modules for existing plugins and platforms
我基本上是在做以下事情:
cordova plugin add pluginA
cordova plugin add pluginC
cordova plugin add pluginX
cordova platform add android
添加完成后,这将安装插件和 cordova-android@8.1.0,它与 pluginA、pluginB 和 pluginC 一起存在于节点模块中。然后我做:-
cordova platform add ios@5
安装 cordova-ios,但从 node_modules 中删除 cordova-android 模块和所有插件模块。不删除平台,只删除节点模块。
打开 npm 计时后,我可以看到 运行 以下 npm 命令,并且该 npm 命令删除了 cordova-android 和插件
1 verbose cli [
1 verbose cli '/usr/local/bin/node',
1 verbose cli '/usr/local/bin/npm',
1 verbose cli 'install',
1 verbose cli 'cordova-ios@5',
1 verbose cli '--production',
1 verbose cli '--save-exact'
1 verbose cli ]
我已经成功地通过基本的项目设置重现了这个问题,基于我切入骨头的真实项目:
mkdir issue && cd issue && {
mkdir www
echo '{}' > build.json
cat >config.xml <<-EOF
<?xml version='1.0' encoding='utf-8'?>
<widget id="com.example.mobile.test" version="0.0.1" android-versionCode="1"
xmlns="http://www.w3.org/ns/widgets" xmlns:cdv="http://cordova.apache.org/ns/1.0"
xmlns:android="http://schemas.android.com/apk/res/android">
<name>Test Client</name>
<description>Test Client</description>
<author email="user@email.com" href="http://www.yourcompany.com">Your Company</author>
<content src="index.html" />
<engine name="ios" spec="5" />
</widget>
EOF
cordova --verbose platform add --save android
cordova --verbose platform add --save ios@5
test ! -d node_modules/cordova-android \
&& echo "cordova-android has been removed"
}
从 ~/.npm/_logs
我可以看到执行了以下 npm 命令:
/usr/local/bin/node /usr/local/bin/npm view cordova-custom-config --json
/usr/local/bin/node /usr/local/bin/npm install cordova-custom-config --production --save
/usr/local/bin/node /usr/local/bin/npm install cordova-android@^8.0.0 --production --save-exact
/usr/local/bin/node /usr/local/bin/npm install cordova-ios@5 --production --save-exact
并且从安装 cordova-ios@5 的 npm 日志可以看出 npm 决定卸载 cordova-android
97 silly diffTrees remove cordova-android@8.1.0
98 silly diffTrees remove cordova-custom-config@5.1.0
NPM 版本信息:
2 info using npm@6.14.8
3 info using node@v14.15.1
此外,作为参考,使用这些命令启用 npm 日志记录:
npm config set timing true
npm config set logs-max 10000
该行为是由 config.xml
中的单个 <engine/>
节点触发的。指定两个引擎或根本不指定引擎,添加第二个平台时不会删除模块。
<engine name="ios" spec="5" />
<engine name="android" spec="8" />
以下 config.xml
有效。
<?xml version='1.0' encoding='utf-8'?>
<widget id="com.example.mobile.test" version="0.0.1" android-versionCode="1"
xmlns="http://www.w3.org/ns/widgets" xmlns:cdv="http://cordova.apache.org/ns/1.0"
xmlns:android="http://schemas.android.com/apk/res/android">
<name>Test Client</name>
<description>Test Client</description>
<author email="user@email.com" href="http://www.yourcompany.com">Your Company</author>
<content src="index.html" />
</widget>
为什么 <engine/>
节点正在影响 npm
删除那些我不知道的模块。
以下脚本有效,插件和 cordova 平台都完好无损。
mkdir issue && cd issue && {
mkdir www
echo "{}" >build.json
cat >config.xml <<-EOF
<?xml version='1.0' encoding='utf-8'?>
<widget id="com.example.mobile.test" version="0.0.1" android-versionCode="1"
xmlns="http://www.w3.org/ns/widgets" xmlns:cdv="http://cordova.apache.org/ns/1.0"
xmlns:android="http://schemas.android.com/apk/res/android">
<name>Test Client</name>
<description>Test Client</description>
<author email="user@email.com" href="http://www.yourcompany.com">Your Company</author>
<content src="index.html" />
</widget>
EOF
cordova plugin add cordova-custom-config
cordova platform add --save android
cordova platform add --save ios@5
}
我基本上是在做以下事情:
cordova plugin add pluginA
cordova plugin add pluginC
cordova plugin add pluginX
cordova platform add android
添加完成后,这将安装插件和 cordova-android@8.1.0,它与 pluginA、pluginB 和 pluginC 一起存在于节点模块中。然后我做:-
cordova platform add ios@5
安装 cordova-ios,但从 node_modules 中删除 cordova-android 模块和所有插件模块。不删除平台,只删除节点模块。
打开 npm 计时后,我可以看到 运行 以下 npm 命令,并且该 npm 命令删除了 cordova-android 和插件
1 verbose cli [
1 verbose cli '/usr/local/bin/node',
1 verbose cli '/usr/local/bin/npm',
1 verbose cli 'install',
1 verbose cli 'cordova-ios@5',
1 verbose cli '--production',
1 verbose cli '--save-exact'
1 verbose cli ]
我已经成功地通过基本的项目设置重现了这个问题,基于我切入骨头的真实项目:
mkdir issue && cd issue && {
mkdir www
echo '{}' > build.json
cat >config.xml <<-EOF
<?xml version='1.0' encoding='utf-8'?>
<widget id="com.example.mobile.test" version="0.0.1" android-versionCode="1"
xmlns="http://www.w3.org/ns/widgets" xmlns:cdv="http://cordova.apache.org/ns/1.0"
xmlns:android="http://schemas.android.com/apk/res/android">
<name>Test Client</name>
<description>Test Client</description>
<author email="user@email.com" href="http://www.yourcompany.com">Your Company</author>
<content src="index.html" />
<engine name="ios" spec="5" />
</widget>
EOF
cordova --verbose platform add --save android
cordova --verbose platform add --save ios@5
test ! -d node_modules/cordova-android \
&& echo "cordova-android has been removed"
}
从 ~/.npm/_logs
我可以看到执行了以下 npm 命令:
/usr/local/bin/node /usr/local/bin/npm view cordova-custom-config --json
/usr/local/bin/node /usr/local/bin/npm install cordova-custom-config --production --save
/usr/local/bin/node /usr/local/bin/npm install cordova-android@^8.0.0 --production --save-exact
/usr/local/bin/node /usr/local/bin/npm install cordova-ios@5 --production --save-exact
并且从安装 cordova-ios@5 的 npm 日志可以看出 npm 决定卸载 cordova-android
97 silly diffTrees remove cordova-android@8.1.0
98 silly diffTrees remove cordova-custom-config@5.1.0
NPM 版本信息:
2 info using npm@6.14.8
3 info using node@v14.15.1
此外,作为参考,使用这些命令启用 npm 日志记录:
npm config set timing true
npm config set logs-max 10000
该行为是由 config.xml
中的单个 <engine/>
节点触发的。指定两个引擎或根本不指定引擎,添加第二个平台时不会删除模块。
<engine name="ios" spec="5" />
<engine name="android" spec="8" />
以下 config.xml
有效。
<?xml version='1.0' encoding='utf-8'?>
<widget id="com.example.mobile.test" version="0.0.1" android-versionCode="1"
xmlns="http://www.w3.org/ns/widgets" xmlns:cdv="http://cordova.apache.org/ns/1.0"
xmlns:android="http://schemas.android.com/apk/res/android">
<name>Test Client</name>
<description>Test Client</description>
<author email="user@email.com" href="http://www.yourcompany.com">Your Company</author>
<content src="index.html" />
</widget>
为什么 <engine/>
节点正在影响 npm
删除那些我不知道的模块。
以下脚本有效,插件和 cordova 平台都完好无损。
mkdir issue && cd issue && {
mkdir www
echo "{}" >build.json
cat >config.xml <<-EOF
<?xml version='1.0' encoding='utf-8'?>
<widget id="com.example.mobile.test" version="0.0.1" android-versionCode="1"
xmlns="http://www.w3.org/ns/widgets" xmlns:cdv="http://cordova.apache.org/ns/1.0"
xmlns:android="http://schemas.android.com/apk/res/android">
<name>Test Client</name>
<description>Test Client</description>
<author email="user@email.com" href="http://www.yourcompany.com">Your Company</author>
<content src="index.html" />
</widget>
EOF
cordova plugin add cordova-custom-config
cordova platform add --save android
cordova platform add --save ios@5
}