原文:Versioning React Native apps
地址:https://medium.com/@andr3wjack/versioning-react-native-apps-407469707661
复制代码
React Naitve 整合了 JavaScript、Android 和 iOS。随之而来的是三种不一样的构建工具:npm、Xcode 和 Gradle。当咱们要发布 App 并增长版本号是会发生什么?咱们必需要更新 package.json、build.gradle 和 info.plist。react
若是咱们能够作到只运行下面的命令就能实现那就最好了:android
npm version [major|minor|patch]
复制代码
做为一名Android开发人员,我知道Gradle能够作不少事情,因此我从 Android 开始。ios
在 build.gradle
文件中,我须要读取 package.json
文件,这在 Gradle 中很是容易作到。git
import groovy.json.JsonSlurper
def getNpmVersion() {
def inputFile = new File("../package.json")
def packageJson = new JsonSlurper().parseText(inputFile.text)
return packageJson["version"]
}
复制代码
而后我能够将它拆分为单独的字符串,以便在构建脚本中使用它。github
def (major, minor, patch) = getNpmVersion().tokenize('.')
复制代码
如何使用 package.json
版本计算 versioncode 和 versionname 取决于您本身。您能够在 github 上看到一个完整的例子。npm
def getNpmVersionArray() { // major [0], minor [1], patch [2]
def (major, minor, patch) = getNpmVersion().tokenize('.')
return [Integer.parseInt(major), Integer.parseInt(minor), Integer.parseInt(patch)] as int[]
}
subprojects {
ext {
def npmVersion = getNpmVersionArray()
versionMajor = npmVersion[0]
versionMinor = npmVersion[1]
versionPatch = npmVersion[2]
}
}
复制代码
android {
...
defaultConfig {
...
versionCode versionMajor * 10000 + versionMinor * 100 + versionPatch
versionName "${versionMajor}.${versionMinor}.${versionPatch}"
}
}
复制代码
Xcode 没有 Gradle 这种方便的功能,因此我打算使用 bash。json
#!/usr/bin/env bash -e
PROJECT_DIR="ios/ReactNativeApp"
INFOPLIST_FILE="Info.plist"
INFOPLIST_DIR="${PROJECT_DIR}/${INFOPLIST_FILE}"
PACKAGE_VERSION=$(cat package.json | grep version | head -1 | awk -F: '{ print $2 }' | sed 's/[\",]//g' | tr -d '[[:space:]]')
BUILD_NUMBER=$(/usr/libexec/PlistBuddy -c "Print CFBundleVersion" "${INFOPLIST_DIR}")
BUILD_NUMBER=$(($BUILD_NUMBER + 1))
# Update plist with new values
/usr/libexec/PlistBuddy -c "Set :CFBundleShortVersionString ${PACKAGE_VERSION#*v}" "${INFOPLIST_DIR}"
/usr/libexec/PlistBuddy -c "Set :CFBundleVersion $BUILD_NUMBER" "${INFOPLIST_DIR}"
复制代码
该脚本读取 package.json
中的版本信息,增长版本号,而后经过 PlistBuddy 更新 info.plist
。react-native
默认状况下,npm version会更新版本号,若是是在 git 仓库中,会建立一个新版本 commit 并打上标签。同时,npm version
提供了三个挂载点,用于执行用户自定义的操做:perversion、version 和 postversion。bash
要在增长版本时执行version-ios.sh脚本,能够添加如下内容:app
{
"scripts": {
"version": "./version-ios.sh"
}
复制代码
有了它,咱们如今就能够增长版本,而无需再进行三次更新,只用执行 npm version [major|minor|patch]
。
使用 npm version
的钩子,咱们能够作更多的事情!咱们能够更新CHANGELOG.md
,建立发布分支,而后将分支和标签推送到远程。