React Native 应用的自动版本控制
问题
您需要将应用版本更新至 1.0.0:
1. 打开android/app/build.gradle更新版本并增加内部版本号。
2. 对于 iOS,使用 Xcode 也需要进行同样的操作,因为直接编辑构建配置文件更容易出错。
3. 你需要保持所有内容的一致性,所以你需要打开package.json并更新版本,以便从 JS 端向用户显示的版本引用是正确的。
import { version } from "./package.json"
console.log(version)
// 1.0.0
我感觉自己效率超高,心情也特别好!
没有哪个开发者经历过那种事后会这么说。
解决方案
理想的情况是只更新一个版本号。以下是我们的具体操作:
1. 用于npm version [patch|minor|major]处理 JS 包版本(参见语义化版本控制)。
JS 版本是我们的唯一权威来源。因此,Android 和 iOS 版本应该与 JSpackage.json版本设置保持一致。
2. 使用 fastlane 处理 Android 和 iOS 端。
fastlane是一款出色的开源工具,专注于自动化 Android 和 iOS 任务。它拥有丰富的社区开发插件库,可以帮助我们处理版本控制等问题。
3. 将以上 2 个步骤合并为一个 npm 脚本。
步骤
我们将以一个全新的 React Native 项目作为起点:
npx react-native init MyApp
如果您尚未安装fastlane,请先安装它:
# Install the latest Xcode command line tools
xcode-select --install
# Install fastlane using RubyGems
sudo gem install fastlane -NV
# Alternatively using Homebrew
brew install fastlane
设置 fastlane 目录并创建一个空的 fastfile 文件:
cd MyApp
mkdir fastlane && cd fastlane
touch Fastfile
我们希望能够fastlane从 React Native 项目的根目录运行该命令。因此,我们将从根目录安装版本控制插件:
cd ..
# Install plugins
fastlane add_plugin increment_version_name increment_version_code load_json
如果询问是否创建 Gemfile,请选择“是”。
前两个插件用于处理 Android 上的版本和版本代码,第三个插件用于读取 JSON 文件(我们的package.json)。
接下来,我们将添加 fastlane 脚本。将以下内容复制到 fastfile 文件中fastlane/Fastfile。
desc 'Android: Increment versionCode and set versionName to package.json version.'
package = load_json(json_path: "./package.json")
private_lane :inc_ver_and do
increment_version_code(
gradle_file_path: "./android/app/build.gradle",
)
increment_version_name(
gradle_file_path: "./android/app/build.gradle",
version_name: package['version']
)
end
desc 'iOS: Increment build number and set the version to package.json version.'
private_lane :inc_ver_ios do
package = load_json(json_path: "./package.json")
increment_build_number(
xcodeproj: './ios/' + package['name'] + '.xcodeproj'
)
increment_version_number(
xcodeproj: './ios/' + package['name'] + '.xcodeproj',
version_number: package['version']
)
end
desc 'Bump build numbers, and set the version to match the pacakage.json version.'
lane :bump do
inc_ver_ios
inc_ver_and
end
接下来,我们将向 package.json 文件中添加以下脚本,以实现自动补丁、次版本号和主版本号的升级:
{
"name": "MyApp",
"version": "0.0.1",
"private": true,
"scripts": {
"android": "react-native run-android",
"ios": "react-native run-ios",
"start": "react-native start",
"test": "jest",
"lint": "eslint .",
"bump-patch": "npm version patch --no-git-tag-version && bundle exec fastlane bump",
"bump-minor": "npm version minor --no-git-tag-version && bundle exec fastlane bump",
"bump-major": "npm version major --no-git-tag-version && bundle exec fastlane bump",
},
命令的第一部分会更新 JS 包的版本,但不会向 Git 仓库提交更改。第二部分会执行 fastlane bump 命令,该命令会自动更新 Android 和 iOS 的构建版本号,使其与 JS 端的版本保持一致。
# npm
npm run bump-patch
# yarn
yarn bump-patch
PS:我正在维护一个 React Native模板,其中包含许多类似文章中提到的好东西。
文章来源:https://dev.to/osamaqarem/automatic-versioning-for-react-native-apps-2bf3
