如何设置 Flutter 应用的构建和版本号

Posted

技术标签:

【中文标题】如何设置 Flutter 应用的构建和版本号【英文标题】:How to set build and version number of Flutter app 【发布时间】:2019-06-18 19:51:35 【问题描述】:

如何在不进入 androidios 设置的情况下设置 Flutter 应用的版本名称和版本代码?

在我的 pubspec.yaml 中有

version: 2.0.0

但我没有看到内部版本号的位置。

【问题讨论】:

【参考方案1】:

设置版本和内部版本号

您可以在 pubspec.yaml 中的同一位置更新版本名称和版本代码号。只需用+ 符号将它们分开即可。例如:

version: 2.0.0+8

这意味着

版本名称为2.0.0 版本号为8

这在新项目的文档中有所描述(但如果您正在处理旧项目,则可能已将其删除):

以下定义了您的应用程序的版本和内部版本号。 版本号是由点分隔的三个数字,例如 1.2.43 后跟一个由 + 分隔的可选内部版本号。 版本和构建器编号都可能在颤动中被覆盖 通过分别指定 --build-name 和 --build-number 来构建。 在 semver.org 上阅读有关版本控制的更多信息。

version: 1.0.0+1

重新启用自动版本控制

如果您的 Flutter 版本控制不再自动更新,请参阅 this answer 了解如何修复它。

另见:

How to get build and version number of Flutter app

【讨论】:

我有同样的问题,无论我在这个版本字段中输入什么或者作为flutter构建的--build-number或--build-name参数,app-release.apk总是版本代码 1(因此 Google Play 在后续上传时会拒绝它)。 versionCode 1 和 versionName 1.0.0 在发布目录的 output.json 文件中也可见。 我通过修复我在 Android Studio 中遇到的一些“无法加载 Android facet”插件错误并删除了构建目录来解决了这个问题。之后,来自 pubspec.yaml 的版本会被 Flutter build 尊重。 我的 pubspec.yaml 中指定的内部版本号没有在 iOS 版本中更新,我只有在等待新的存档版本时才注意到,然后它会显示旧版本内部版本号。现在,在进行新的 iOS 版本构建之前,我总是会仔细检查 info.plist 中的构建版本。 "... 可选 内部版本号,以 + 分隔。"如果我们忽略它会发生什么?那么 Flutter 是否需要 --build-number,或者默认为 1,或者它是否以某种方式提供了自己的内部版本号? @AlanSteiman,使用它是安全的。当您即将发布应用程序时,您可以随时仔细检查这些值。【参考方案2】:

感谢用户 abion47 从文章 Versioning with Flutter 中找到并浓缩以下答案。

重新启用自动版本控制

默认情况下,Flutter 项目设置为在构建项目时根据 pubspec.yaml 中的版本设置自动更新 Android 和 iOS 设置。但是,如果您已经覆盖了这些设置,则可以通过执行以下操作重新启用该行为:

iOS

打开 ios/Runner/Info.plist 文件。将 CFBundleVersion 的值设置为 $(FLUTTER_BUILD_NUMBER),并将 CFBundleShortVersionString 的值设置为 $(FLUTTER_BUILD_NAME)。该文件的 XML 应如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
  ...
  <key>CFBundleVersion</key>
  <string>$(FLUTTER_BUILD_NUMBER)</string>
  <key>CFBundleShortVersionString</key>
  <string>$(FLUTTER_BUILD_NAME)</string>
  ...
</dict>
...

安卓

打开android/app/build.gradle 文件。确保您在文件顶部正确加载了 Flutter 属性:

def flutterRoot = localProperties.getProperty('flutter.sdk')
if (flutterRoot == null) 
    throw new GradleException("Flutter SDK not found. Define location with flutter.sdk in the local.properties file.")


def flutterVersionCode = localProperties.getProperty('flutter.versionCode')
if (flutterVersionCode == null) 
    throw new GradleException("versionCode not found. Define flutter.versionCode in the local.properties file.")


def flutterVersionName = localProperties.getProperty('flutter.versionName')
if (flutterVersionName == null) 
    throw new GradleException("versionName not found. Define flutter.versionName in the local.properties file.")

然后设置android.defaultConfig部分,使versionNameflutterVersionNameversionCodeflutterVersionCode.toInteger()

android 
  ...
  defaultConfig 
    ...
    versionCode flutterVersionCode.toInteger()
    versionName flutterVersionName
  

【讨论】:

更新 pubspec.yaml 文件后,我检查了 local.properties 但它显示默认 flutter.versionName=1.0.0 & flutter.versionCode= 1.它是您在上面显示的默认 gradle 结构。那么这里有什么新东西呢? @SumitShukla,我不太确定。这最初是添加到我上面的主要答案中的(请参阅编辑历史记录和 cmets),但是当出现问题时我无法维护它,因为我自己对此没有任何经验。所以我把它分解成一个新的答案。【参考方案3】:

在 Android 中,build-name 用作 versionName,而 build-number 用作 versionCode。 在https://developer.android.com/studio/publish/versioning 阅读有关 Android 版本控制的更多信息 在 iOS 中,build-name 用作 CFBundleShortVersionString,而 build-number 用作 CFBundleVersion。 阅读有关 iOS 版本控制的更多信息,请访问 https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html

以上这些信息你可以在pubsec.yaml中得到

您将在 android/app/build.gradle 中找到 versionCode 或 buildnumber(适用于 android)。

defaultConfig 
        applicationId "com.fabio.resturanto"
        minSdkVersion 16
        targetSdkVersion 28
        versionCode flutterVersionCode.toInteger()
        versionName flutterVersionName
        multiDexEnabled true

    

您的 local.properties 文件中有flutterVersionCode 和flutterVersionName。这是特定于 Android 构建的

iOS / Android 版本均可从 pubspec.ymal 中设置

version: 1.2.0+1

这里 1.2.0 是版本名称,+1 是版本代码。 此处的更改 (pubspec.ymal) 将反映 Android 和 iOS 版本名称和版本代码。

【讨论】:

【参考方案4】:

什么对我有用(Android):

versionnameversioncode 更新flutter 项目文件中的pubspec.yaml。 在终端上运行flutter pub get。 在设备中运行您的项目。 在 Andriod Studio 中打开 android 模块并检查local.properties 以获取更新的flutter.versionName flutter.versionCode gradle 文件夹中的文件。

【讨论】:

【参考方案5】:

对我来说,我的版本是

version: 1.0.0+1

我把它改成了

version: 1.2.0+2

然后在终端中

flutter build appbundle --build-name=1.2.0+2 --build-number=2

【讨论】:

版本末尾的+1 是内部版本号,而名称通常采用x.y.z 的形式。所以我会使用version: 1.2.0+2flutter build appbundle --build-name=1.2.0 --build-number=2【参考方案6】:

如果您使用的是 android studio,最简单的方法是从 local.properties 更改它

【讨论】:

以上是关于如何设置 Flutter 应用的构建和版本号的主要内容,如果未能解决你的问题,请参考以下文章

为 Flutter 应用程序维护不同的版本和内部版本号

如何强制 Flutter 更新我的版本和内部版本号?

如何获取 Android 应用程序的构建/版本号?

如何在不使用 assemblyinfo 的情况下使用 TFS 构建自动增加版本号?

如何在 iOS PhoneGap 应用程序中获取应用程序版本号?

如何拥有自动递增的构建版本号(KDevelop)?