应用版本管理

编辑页面

了解不同的版本类型,以及如何远程或本地管理它们。


For the complete documentation index, see llms.txt. Use this Use this file to discover all available pages.

Android 和 iOS 都各自提供两个值来标识应用的版本:商店中可见的版本(面向用户的版本)和仅开发者可见的版本(面向开发者的构建版本)。本指南将说明如何远程或本地管理这些版本。

自动应用版本管理
自动应用版本管理

在这段 Expo feature focus 视频中,你将了解 Expo EAS Build 中的自动应用版本管理。

应用版本

在 Expo 项目中,以下属性可用于在 app config 文件中定义应用版本。

属性描述
version 商店中可见的面向用户版本。在 Android 上,它表示 android/app/build.gradle 中的 versionName 名称。在 iOS 上,它表示 Info.plist 中的 CFBundleShortVersionString
android.versionCodeAndroid 的面向开发者构建版本。它表示 android/app/build.gradle 中的 versionCode
ios.buildNumberiOS 的面向开发者构建版本。它表示 Info.plist 中的 CFBundleVersion

在应用中使用应用版本

要在应用内显示面向用户的版本,你可以使用 expo-application 库中的 Application.nativeApplicationVersion

要在应用内显示面向开发者的构建版本,你可以使用 expo-application 库中的 Application.nativeBuildVersion

推荐工作流

面向用户的版本

在进行生产发布时,面向用户的版本应由你显式设置并更新。当生产构建提交到应用商店时,你可以在 app config 中更新 version 属性。如果你的项目使用了带有自动运行时版本策略的 expo-updates,这也同样适用。这标志着你开始了新版本应用的新开发周期。了解更多 部署模式

面向开发者的构建版本

对于面向开发者的构建版本,你可以设置为在每次构建时自动递增。这将帮助你避免在每次向 Play Store 测试渠道或 TestFlight 上传新的归档时都手动修改项目。应用商店拒绝应用的一个常见原因是提交了版本号重复的构建。这通常发生在开发者在创建新构建前忘记递增面向开发者的构建版本号时。

如果你选择使用 remote 版本源,EAS Build 可以通过为你递增这些版本来自动管理面向开发者的构建版本;这是推荐的行为。你也可以选择使用 local 应用版本源,这意味着你需要在各自的配置文件中手动控制版本。

远程版本源

remote 版本源是 EAS CLI 版本 12.0.0 起推荐的行为。

EAS 服务器可以远程存储并管理你应用的面向开发者构建版本(android.versionCodeios.buildNumber)。要启用它,你需要在 eas.json 中将 cli.appVersionSource 设置为 remote。然后,在 production 构建配置下,你可以将 autoIncrement 属性设置为 true

eas.json
{ "cli": { "appVersionSource": "remote" }, "build": { "development": { %%placeholder-start%%... %%placeholder-end%% }, "preview": { %%placeholder-start%%... %%placeholder-end%% }, "production": { "autoIncrement": true } } %%placeholder-start%%... %%placeholder-end%% }

远程版本会使用本地项目中的值初始化。例如,如果你在 app config 中将 android.versionCode 设置为 1,当你使用远程版本源创建新构建时,它会自动递增到 2。不过,如果你的 app config 中没有设置构建版本,那么在创建第一个构建时,远程版本会初始化为 1

eas.json 中启用 remote 版本属性时,存储在 app config 中的构建版本值会被忽略,并且在版本通过远程递增时不会更新。远程版本源的值会在构建运行时设置到原生项目中,这被视为这些值的唯一来源。你可以安全地从 app config 中移除这些值。

将已定义的版本同步到远程

在某些场景下,你已经为项目设置了版本,并且希望在创建新的 EAS Build 时基于这些版本递增。不过,这些现有版本可能尚未与 EAS 远程同步。这些场景包括:

  • 你已经将应用发布到应用商店,并希望继续使用相同的版本号。
  • EAS CLI 无法检测应用当前所处的版本。
  • 由于其他原因,你已经显式设置了版本,例如在 app config 中。

在这些场景中,你可以通过以下步骤使用 EAS CLI 将当前版本同步到 EAS Build:

  • 在终端窗口中运行以下命令:

    Terminal
    eas build:version:set
  • 在提示时选择平台(Android 或 iOS)。

  • 当提示 Do you want to set app version source to remote now? 时,选择 yes。这将把 eas.json 中的 cli.appVersionSource 设置为 remote

  • 当提示 What version would you like to initialize it with? 时,输入你在应用商店中设置的最后一个版本号。

完成这些步骤后,应用版本将远程同步到 EAS Build。现在你可以在 eas.json 中将 build.production.autoIncrement 设置为 true。当你创建新的生产构建时,versionCodebuildNumber 会自动递增。

将版本从远程同步到本地

如果你想在 Android Studio 或 Xcode 中使用与 EAS 远程存储的相同版本在本地构建项目,可以使用以下命令将本地项目更新为远程版本:

Terminal
eas build:version:sync

限制

  • Android 上的 eas build:version:sync 命令不支持具有多个 flavor 的裸项目。不过,远程版本控制的其余功能应适用于所有项目。
  • autoIncrement 不支持 version 选项。
  • 如果你正在使用 EAS Update 且运行时策略设置为 "runtimeVersion": { "policy": "nativeVersion" },则不受支持。若要获得类似行为,请改用 "appVersion" 策略。

本地版本源

你可以将项目配置为以本地项目源代码本身作为项目版本的唯一来源。为此,请在 eas.json 中将 cli.appVersionSource 设置为 local

采用这种设置后,EAS 会读取应用版本值并按原样构建项目。它不会将内容写回项目。你也可以通过在构建配置中设置 autoIncrement 选项来启用本地自动递增版本。

eas.json
{ "cli": { "appVersionSource": "local" }, "build": { "development": { %%placeholder-start%%... %%placeholder-end%% }, "preview": { %%placeholder-start%%... %%placeholder-end%% }, "production": { "autoIncrement": true } } %%placeholder-start%%... %%placeholder-end%% }

对于现有的 React Native 项目,原生代码中的值优先。expo-constantsexpo-updates 库会读取 app config 文件中的值。如果你依赖来自 manifest 的版本值,你应该让它们与原生代码保持同步。如果你正在使用 EAS Update 且运行时策略设置为 "runtimeVersion": { "policy": "nativeVersion" },那么保持这些值同步尤其重要,因为版本不匹配可能会导致更新被发送到应用的错误版本。我们建议使用 expo-application 来读取版本,而不是依赖 app config 中的值。

限制

  • 使用 autoIncrement 时,如果你希望版本更改持久化,每次构建后都需要提交更改。在 CI 上构建时,这可能很难协调。
  • 对于支持多个 flavor 的 Gradle 配置的现有 React Native 项目,EAS CLI 无法读取或修改版本,因此不支持 autoIncrement 选项,并且版本不会显示在 expo.dev 上的构建详情页面中。