Ste*_*son 27 cordova cordova-3
我目前正在使用Cordova 3.4.0和CLI来构建我的项目,使用以下命令来定位android:
cordova build android
Run Code Online (Sandbox Code Playgroud)
要么
cordova build android --release
Run Code Online (Sandbox Code Playgroud)
我的config.xml具有以下指定:
<widget id="com.example.myapp"
version="0.0.3"
versionCode="2"
...
>
</widget>
Run Code Online (Sandbox Code Playgroud)
myapp/platforms/android中生成的AndroidManifest.xml 不会使用config.xml中指定的版本和版本代码进行更新.它保持默认值:
<manifest
android:versionCode="1"
android:versionName="1.0"
...
</manifest>
Run Code Online (Sandbox Code Playgroud)
这是一个错误吗?或者是否有其他方法我应该在config.xml中为Android指定versionCode和versionName?甚至可能,在构建之前是否有一个钩子可用于使用正确的版本更新AndroidManifest.xml?
我希望每次我希望它更改时,我不必手动更新它:
出于这些原因,我希望在config.xml中设置版本号.有任何想法吗?
谢谢
小智 56
最后,Cordova 3.5.0-0.2.4我将此属性添加到<widget>节点 config.xml
android-versionCode="10"
Run Code Online (Sandbox Code Playgroud)
并且AndroidManifest.xml已正确更新为
android:versionCode="10"
Run Code Online (Sandbox Code Playgroud)
根据MichaelOryl的回答,我使用了cordova 3.4并使用bash工具 XMLStarlet实现了一些功能
基本上它从AndroidManifest.xml中的config.xml复制versionCode属性的值
而不是运行这个:
cordova build android --release
Run Code Online (Sandbox Code Playgroud)
运行[应该成为一个脚本]:
cordova prepare android
# grab version code from config.xml
VERSION_CODE=$(xmlstarlet sel -t -v "//@versionCode" "config.xml")
# write correct version code in manifest
xmlstarlet ed -L -u "/manifest/@android:versionCode" -v "$VERSION_CODE" "platform/android/AndroidManifest.xml"
cordova compile android --release
Run Code Online (Sandbox Code Playgroud)
这样当我升级到cordova 3.5时,我可以重用通常的'cordova build android --release'
versionName在这里不应该是一个问题,因为它从config.xml复制到platforms/android中的AndroidManifest.xml文件(至少在Cordova 3.4.0上).那部分我没有问题.
但是,增加versionCode是一项非常重要的任务.实际上,我添加到Grunt的Gruntfile.js中的一系列任务.
这是字符串替换任务." grunt string-replace:versionCode "将增加存储在package.json中的versionCode." grunt string-replace:androidVersionCode "将获取该值并将其放入platforms/android/AndroidManifest.xml文件中:
// STRING-REPLACE
'string-replace': {
versionCode: { // update the version code stored in package.json
options: {
replacements: [
{
pattern: /['"]androidVersionCode['"]:.*?['"](\d*)['"]/ig,
replacement: function (match, p1, offset, string) {
return '"androidVersionCode": "' + (parseInt(p1) + 1) + '"';
}
}
]
},
files: {
'package.json': 'package.json'
}
},
androidVersionCode: { // update the version code stored in AndroidManifest.xml
options: {
replacements: [
{
pattern: /android:versionCode=['"](\d*)['"]/ig,
replacement: function (match, p1, offset, string) {
var pkg = grunt.file.readJSON('package.json');
grunt.log.writeln("pkg.androidVersionCode: " + pkg.androidVersionCode);
grunt.log.writeln('Returning: ' + 'android:versionCode="' + pkg.androidVersionCode + '"');
return 'android:versionCode="' + pkg.androidVersionCode + '"';
}
}
]
},
files: {
'platforms/android/AndroidManifest.xml': 'platforms/android/AndroidManifest.xml'
}
}
}
Run Code Online (Sandbox Code Playgroud)
它需要在使用之前从Gruntfile.js文件中调用它,当然(以及npm install grunt-string-replace):
grunt.loadNpmTasks('grunt-string-replace');
Run Code Online (Sandbox Code Playgroud)
您需要在package.json文件中添加如下所示的行,以便全部工作:
"androidVersionCode": "13", // or whatever value is current for you
Run Code Online (Sandbox Code Playgroud)
它将通过上面的string-replace:versionCode任务增加.我将行放在以"version"开头的行之后的package.json中:
让这个工作的一个重要技巧是确保不要调用"cordova build android"而是调用"cordova prepare android",然后"grunt replace-string:androidVersionCode",然后"cordova compile android".构建只是调用"prepare"然后"编译"的快捷方式,而这两个任务之间就是必须修改AndroidManifest.xml文件以防止它被覆盖.
我的构建过程要复杂得多,因为我实际上是使用grunt-bump为grunt增加package.json中的版本值,然后使用xmlpoke为Grunt 将其注入config.xml ,使用string-replace将其注入我的about页面.我使用grunt-shell来实际调用所有Cordova构建步骤,以便将所有内容复制到它所在的位置并以正确的顺序运行.
如果这有帮助,请告诉我.
| 归档时间: |
|
| 查看次数: |
19271 次 |
| 最近记录: |