跳到主要内容

更轻松的升级,这要归功于 Git

·4 分钟阅读
Nicolas Cuillery
Zenika 的 JavaScript 顾问和培训师

升级到新版本的 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 仓库。它不会干扰您的项目仓库(无论您使用什么 VCS: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 能够使用其 3 向合并算法自动合并大多数更改,并最终给我们留下熟悉的冲突分隔符

    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 版本开始。如果我们将实现嵌入到 local-cli 中,那么当您使用旧版本的 React Native 时,您将无法享受此功能。例如,如果这个新的升级代码仅在 0.38.0 中发布,您将无法从 0.29.2 升级到 0.38.0。

基于 Git 的升级是开发者体验的一大改进,让每个人都能使用它非常重要。通过使用单独的包 react-native-git-upgrade 全局安装,无论您的项目使用哪个版本的 React Native,您今天都可以使用这个新代码。

另一个原因是 Martin Konicek 最近的 Yeoman 清除。我们不想将这些 Yeoman 依赖项放回 react-native 包中,以便能够评估旧模板以创建补丁。

尝试一下并提供反馈

总而言之,我想说,享受这个功能,并随时 提出改进建议、报告问题,尤其是 发送拉取请求。每个环境都略有不同,每个 React Native 项目也各不相同,我们需要您的反馈,以便使它对每个人都有效。

谢谢!

我要感谢伟大的公司 ZenikaM6 Web(已存档),没有他们,这一切都不可能实现!