N.B。这是一个React Native项目。
使用Android和Gradle,我能够解析JSON文件并读取值,以便在构建期间动态地将版本应用到应用程序。
JSON文件如下所示:
{
"name": "AwesomeApp",
"displayName": "Awesome",
"version": {
"major": 3,
"minor": 2,
"patch": 1
}
}
最简单的形式是Gradle文件:
def jsonFile = file('../../app.json')
def parsedJson = new groovy.json.JsonSlurper().parseText(jsonFile.text)
def versionMajor = parsedJson.version.major
def versionMinor = parsedJson.version.minor
def versionPatch = parsedJson.version.patch
def appVersionCode = versionMajor * 10000 + versionMinor * 100 + versionPatch
def appVersionName = "${versionMajor}.${versionMinor}.${versionPatch}"
然后在构建中,我可以将其设置为使用动态设置版本:
android {
compileSdkVersion 26
buildToolsVersion '26.0.1'
defaultConfig {
applicationId "com.awesome.app"
...
versionCode appVersionCode
versionName appVersionName
...
}
}
如何使用iOS和Xcode实现相同目标?我知道我们需要修改CFBundleShortVersionString
和构建阶段似乎是动态设置版本的最佳方式,但这些似乎都是某种CI工具的增量/部分而不是读取显式设置的JSON文件。
任何帮助都将不胜感激。
(注意如果我错过任何明显可能导致投票结果的事情让我知道,我可以相应地修改问题 - 群体点击否定并不能真正帮助那些提出有效问题的海报 - >对不起这是基于我之前问过的一个问题。)
答案 0 :(得分:0)
通过Node脚本完成此操作,我在Xcode构建阶段的运行脚本中调用:
构建阶段脚本:
AppVersion=$(/usr/libexec/PlistBuddy -c "Print CFBundleShortVersionString" "${TARGET_BUILD_DIR}/${INFOPLIST_PATH}")
APP_VERSION="$AppVersion" node ${PROJECT_DIR}/../iOSVersioning.js
<强> iOSVersioning.js:强>
const { exec } = require('child_process');
const APP_VERSION = process.env.APP_VERSION;
const version = require('../app.json').version;
const versionName = `${version.major}.${version.minor}.${version.patch}`;
if (APP_VERSION == versionName) {
process.exit();
}
exec(
`/usr/libexec/PlistBuddy -c "Set :CFBundleShortVersionString ${versionName}" "${TARGET_BUILD_DIR}/${INFOPLIST_PATH}"`,
(err, stdout, stderr) => {
if (err) {
console.log('Failed to apply the app version.');
process.exit(1);
}
console.log(`Applied app verion: ${versionName}`);
}
);