跳至主内容

借助 Git 实现更轻松的升级

· 1 分钟阅读
Nicolas Cuillery
Zenika 的 JavaScript 顾问兼培训师
非官方测试版翻译

本页面由 PageTurner AI 翻译(测试版)。未经项目官方认可。 发现错误? 报告问题 →

升级到新版本的 React Native 一直很困难。你可能以前见过类似这样的情况:

这些选项都不理想:覆盖文件会导致丢失本地更改,而不覆盖则无法获取最新更新。

今天,我很荣幸地推出一款新工具来解决这个问题。这个工具叫 react-native-git-upgrade,它在幕后使用 Git 尽可能自动解决冲突。

使用方法

要求:Git 必须在 PATH 环境变量中可用。你的项目无需由 Git 管理。

全局安装 react-native-git-upgrade

$ npm install -g react-native-git-upgrade

或者使用 Yarn

$ yarn global add react-native-git-upgrade

然后在项目目录中运行:

$ cd MyProject
$ react-native-git-upgrade 0.38.0

注意:请不要运行 'npm install' 来安装新版本的 react-native。该工具需要比较新旧项目模板才能正常工作。只需在应用目录中运行上述命令(保持当前旧版本状态)。

示例输出:

你也可以不带参数运行 react-native-git-upgrade 直接升级到最新版 React Native。

我们会尽力保留你在 Android 和 iOS 构建文件中的修改,因此升级后无需运行 react-native link

我们设计的实现方案尽可能减少侵入性。它完全基于在临时目录中即时创建的本地 Git 仓库,不会干扰你的项目仓库(无论你使用 Git、SVN、Mercurial 还是其他版本控制系统)。如果发生意外错误,你的源代码会被自动恢复。

工作原理

关键步骤是生成 Git 补丁。这个补丁包含了 React Native 模板从你当前版本到目标版本之间的所有变更。

要获取此补丁,我们需要基于 node_modules 目录中 react-native 包内嵌的模板生成应用(这些模板与 react-native init 命令使用的相同)。然后,当基于当前版本和新版本的模板分别生成原生应用后,Git 就能生成适配你项目的补丁(包含你的应用名称):

[...]

diff --git a/ios/MyAwesomeApp/Info.plist b/ios/MyAwesomeApp/Info.plist
index e98ebb0..2fb6a11 100644
--- a/ios/MyAwesomeApp/Info.plist
+++ b/ios/MyAwesomeApp/Info.plist
@@ -45,7 +45,7 @@
<dict>
<key>localhost</key>
<dict>
- <key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key>
+ <key>NSExceptionAllowsInsecureHTTPLoads</key>
<true/>
</dict>
</dict>
[...]

接下来只需将此补丁应用到你的源文件。传统的 react-native upgrade 流程会要求你处理每个微小差异,而 Git 能通过三方合并算法自动处理大多数变更,最终仅留下熟悉的冲突标记:

    13B07F951A680F5B00A75B9A /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
<<<<<<< ours
CODE_SIGN_IDENTITY = "iPhone Developer";
FRAMEWORK_SEARCH_PATHS = (
"$(inherited)",
"$(PROJECT_DIR)/HockeySDK.embeddedframework",
"$(PROJECT_DIR)/HockeySDK-iOS/HockeySDK.embeddedframework",
);
=======
CURRENT_PROJECT_VERSION = 1;
>>>>>>> theirs
HEADER_SEARCH_PATHS = (
"$(inherited)",
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include,
"$(SRCROOT)/../node_modules/react-native/React/**",
"$(SRCROOT)/../node_modules/react-native-code-push/ios/CodePush/**",
);

这些冲突通常很容易理解:ours 标记代表"你的团队",而 theirs 可视为"React Native 团队"。

为何引入新的全局包?

React Native 自带全局 CLI(即 react-native-cli 包),它将命令委托给 node_modules/react-native/local-cli 目录中的本地 CLI。

正如上文所述,升级过程必须从当前 React Native 版本启动。若将实现代码嵌入本地 CLI,旧版本用户将无法享受此功能。例如,若新升级代码仅在 0.38.0 发布,则无法从 0.29.2 升级至 0.38.0。

基于 Git 的升级极大改善了开发者体验,使其惠及所有用户至关重要。通过全局安装独立包 react-native-git-upgrade,无论项目使用哪个 React Native 版本,您今天就能使用这项新功能。

另一重要原因是 Martin Konicek 近期完成的 Yeoman 清理工作。我们不愿让 Yeoman 依赖项重新进入 react-native 包,这会影响为创建补丁而进行的旧模板评估。

立即试用并反馈意见

最后我想说:请尽情享受这项功能,欢迎随时提出改进建议、报告问题,特别是提交 PR。每个开发环境存在差异,每个 React Native 项目也各不相同,我们需要您的反馈来确保该功能适用于所有场景。

致谢

衷心感谢杰出企业 ZenikaM6 Web (存档链接),没有它们的支持这一切都不可能实现!