【问题标题】:Cordova: How to set Platform-specific config.xml file which is not overwritten after cordova build?Cordova:如何设置特定于平台的 config.xml 文件,该文件在 cordova 构建后不会被覆盖?
【发布时间】:2014-05-17 00:28:10
【问题描述】:
我在两个平台 ios 和 android 上使用 Cordova。当我改变我的
Project/config.xml
会合并到
Project/platforms/android/res/xml/config.xml
Project/platforms/ios/Project/config.xml
在进行 cordova 构建之后。
如何设置不会被 cordova build 覆盖的平台特定设置?
【问题讨论】:
标签:
javascript
android
ios
cordova
【解决方案2】:
你需要一个科尔多瓦钩。我强烈建议您查看此链接:Cordova Hooks
更具体地说:
- 在应用的 hooks/ 顶级文件夹中,创建一个名为“after_prepare”的子文件夹。
- 在 hooks/after_prepare 中,创建您的平台知道如何运行的可执行脚本(例如,在 Linux 上:创建 BASH 脚本;在 Windows 上:创建 BAT 文件;在任何平台上:创建 Node.js 脚本)。假设您想要一个 bash 脚本:
创建一个“after_prepare”cordova 钩子脚本文件
mkdir -p hooks/after_prepare
touch hooks/after_prepare/change_my_configxml.sh
chmod 755 hooks/after_prepare/change_my_configxml.sh
edit hooks/after_prepare_change_my_configxml.sh
钩子/after_prepare/change_my_configxml.sh
#!/bin/bash
echo ${CORDOVA_VERSION};
echo ${CORDOVA_PLATFORMS};
echo ${CORDOVA_PLUGINS};
echo ${CORDOVA_HOOK};
echo ${CORDOVA_CMDLINE};
# == put commands to make your config xml changes here ==
# == replace this statement with your own ==
sed "s/index\.html/http:\/\/my.example.com\?platform=ios\&cordova=3.4.0/" platforms/ios/www/config.xml > config.tmp && mv -f -v config.tmp platforms/ios/www/config.xml
请注意,cordova 挂钩最初放置在 .cordova/hooks/... 中,但最近它们已移至顶级 hooks/ 文件夹。
编辑:
这是一个完整的脚本,用于创建和运行两个略有不同的 cordova 应用程序。有趣的是,iOS 平台文件夹的 config.xml 中的属性似乎被忽略了,因此此脚本在处理 iOS 时会更新顶级 config.xml。
createMultiPlatformCordovaApp.sh
#!/bin/bash
# ==== Create cordova apps with different URLs for android and iOS
cordova create appFolder com.example.myApp "My App"
cd appFolder/
cordova platform add ios
cordova platform add android
# ==== make an after_prepare hook script
mkdir -p hooks/after_prepare
touch hooks/after_prepare/change_my_configxml.sh
chmod 755 hooks/after_prepare/change_my_configxml.sh
# ==== start of hook script content ====
echo '#!/bin/bash
echo "CORDOVA_VERSION: ${CORDOVA_VERSION}";
echo "CORDOVA_PLATFORMS: ${CORDOVA_PLATFORMS}";
echo "CORDOVA_PLUGINS: ${CORDOVA_PLUGINS}";
echo "CORDOVA_HOOK: ${CORDOVA_HOOK}";
echo "CORDOVA_CMDLINE: ${CORDOVA_CMDLINE}";
# == put commands to make your config xml changes here ==
# == replace these statement with your own ==
if [ ! -f platforms/android/res/xml/config.xml ]
then
cp -v -f config.xml platforms/android/res/xml/config.xml;
fi
if [[ ${CORDOVA_PLATFORMS} == android ]]; then
sed -E "s/<content src=\"[^\"]+\"/<content src=\"http:\/\/www.google.com\/search\?q=Google%20Nexus%205\&hl=xx-bork\"/" platforms/android/res/xml/config.xml > config.tmp && mv -f -v config.tmp platforms/android/res/xml/config.xml
fi
if [[ ${CORDOVA_PLATFORMS} == ios ]]; then
sed -E "s/<content src=\"[^\"]+\"/<content src=\"http:\/\/www.google.com\/search\?q=iPad%20Retina\&hl=xx-bork\"/" config.xml > config.tmp && mv -f -v config.tmp config.xml
fi
' > hooks/after_prepare/change_my_configxml.sh
# ==== end of hook script content ====
cordova prepare android
cordova build android
cordova emulate android
cordova prepare ios
cordova build ios
cordova emulate ios
【解决方案3】:
由于我还没有找到更好的方法,我建议将 config.xml 文件根据需要保存在其他位置,并编写一个执行 cordova prepare 的脚本,然后将 config.xml 文件复制到它应该在编译之前运行,然后运行cordova compile。 cordova buld 只是执行 cordova prepare 后跟 cordova compile,因此在这两个步骤之间执行此复制的脚本等同于 cordova build,但会保留您的自定义文件。
如果您使用的是 xcode IDE,您可以在 iOS 项目的构建中添加一个 pre-action 脚本:
- 选择产品 > 方案 > 编辑方案
- 从左侧选择 Build > Pre-actions
- 单击 + 并选择“新建运行脚本操作”
对于脚本,您可以输入:
cordova prepare
- cp 命令复制您保存的 config.xml 以及您要复制的任何其他内容。
- 您想做的任何其他事情。
之后,从 xcode 内部进行构建将刷新您的公共代码文件,保留您对文件的编辑,然后进行构建。
这显然是一种解决方法,但它确实具有您可以将不同版本的 config.xml 和任何其他文件复制到不同平台目录的优点。
其中一个警告是,当您使用 Cordova 工具对 config.xml 或您通过准备保留的任何其他文件进行更改时,您必须小心。特别是,您必须记住在添加或删除插件时更新您的自定义 config.xml 文件。
我希望 Cordova 工具开发人员要么添加对这种合理需求的支持,要么改进文档(如果它实际上已经被支持),因为这样。
【解决方案4】:
将platform 文件夹添加到您的存储库中,编辑platform 文件夹中的文件不是更简单吗?在您的常规构建中,您只调用cordova compile 而不是cordova build,以防止覆盖您的platform 文件。