React Native – 将package.json中的自动版本名称转换为Android构build清单

目前我有一个反应原生的应用程序,我有这个问题是非常耗时更新每个版本或提交的版本。

另外,我还有Sentry,因此每次构build时,都会得到相同的版本,所以一些崩溃很难确定它们来自哪里。

最后,手动更新版本容易出错。

我怎样才能设置我的构build生成一个自动版本,每次我build立和忘记所有这个手动任务?

自从我和这个工作了好几天以后,我决定和大家分享我是如何做到的,因为这可以帮助别人。

使用的工具:

  1. GitVersion :我们将使用GitVersion自动生成一个语义版本,取决于许多因素,如当前的分支,标签,提交等等.toold做的很好,你可以忘记命名你的版本。 当然,如果你把一个标签设置为一个提交,它将使用该标签作为名称。
  2. PowerShell :由微软构build的这个命令行操作系统能够从Mac,Linux或Windows运行,而我之所以select这个操作系统是因为这个版本可能与操作系统版本无关。 例如我在Windows上开发,但生成机器有MacOS。

编辑应用程序build.gradle

应用程序gradle只需要在它的最后添加一行。 在我的情况下,我有Google Play服务gradle,然后我添加它。

apply from: 'version.gradle' 

version.gradle

这个文件应该和你的应用程序gradle在同一个文件夹中,这是内容:

 task updatePackage(type: Exec, description: 'Updating package.json') { commandLine 'powershell', ' -command ' , '$semver=(gitversion /showvariable Semver); Set-Content -path version.properties -value semver=$semver; npm version --no-git-tag-version --allow-same-version $semver' } preBuild.dependsOn updatePackage task setVariantVersion { doLast { if (plugins.hasPlugin('android') || plugins.hasPlugin('android-library')) { def autoIncrementVariant = { variant -> variant.mergedFlavor.versionName = calculateVersionName() } if (plugins.hasPlugin('android')){ //Fails without putting android. first android.applicationVariants.all { variant -> autoIncrementVariant(variant) } } if (plugins.hasPlugin('android-library')) { //Probably needs android-library before libraryVariants. Needs testing libraryVariants.all { variant -> autoIncrementVariant(variant) } } } } } preBuild.dependsOn setVariantVersion setVariantVersion.mustRunAfter updatePackage ext { versionFile = new File('version.properties') calculateVersionName = { def version = readVersion() def semver = "Unknown" if (version != null){ semver = version.getProperty('semver') } return semver } } Properties readVersion() { //It gets called once for every variant but all get the same version def version = new Properties() try { file(versionFile).withInputStream { version.load(it) } } catch (Exception error) { version = null } return version } 

现在,让我们回顾一下脚本实际上在做什么:

  1. updatePackage:这个任务运行在你的构build的最开始(实际上是在preBuild之前),它执行gitversion来获取当前版本,然后创build一个version.properties文件,以后可以通过gradle读取版本。
  2. setVariantVersion:在每个变体上调用afterEvaluate。 这意味着如果你有多个版本,如debugging,发布,QA,分期等,所有将获得相同的版本。 对于我的用例这是好的,但你可能想调整这一点。
  3. 任务顺序:困扰我的一件事是在生成文件之前运行版本。 这通过使用mustRunAfter标记来解决。

PowerShell脚本解释

这是先运行的脚本。 让我们回顾一下在做什么:

 $semver=(gitversion /showvariable Semver); Set-Content -path props.properties -value semver=$semver; npm version --no-git-tag-version --allow-same-version $semver 
  1. 第1行:gitversion有多种types的版本。 如果你运行它没有任何参数,你会得到一个JSON文件与许多变种。 这里我们说的是我们只需要SemVer。 (另请参阅FullSemVer)
  2. 第2行:PowerShell创build文件并保存内容的方式。 这也可以用>但是我有编码问题和属性文件没有被读取。
  3. 第3行:这行更新你的package.json版本。 默认情况下它会保存一个提交到新版本的git。 –no-git-tag-version确保你不覆盖它。

就是这样。 现在,每次构build时,都应该自动生成版本,更新package.json,并且构build应该具有特定的版本名称。

应用中心

由于我正在使用应用程序中心进行构build,因此我将告诉您如何在构build计算机中使用它。 您只需要使用自定义脚本。

app-center-pre-build.sh

 #!/usr/bin/env sh #Installing GitVersion OS=$(uname -s) if [[ $OS == *"W64"* ]]; then echo "Installing GitVersion with Choco" choco install GitVersion.Portable -y else echo "Installing GitVersion with Homebrew" brew install --ignore-dependencies gitversion fi 

这是需要的,因为GitVersion目前不是构build机器的一部分。 此外,安装时需要忽略单声道依赖关系,否则在brew尝试链接文件时会出现错误。