如何设置 Flutter 应用的构建和版本号
Posted
技术标签:
【中文标题】如何设置 Flutter 应用的构建和版本号【英文标题】:How to set build and version number of Flutter app 【发布时间】:2019-06-18 19:51:35 【问题描述】:如何在不进入 android 和 ios 设置的情况下设置 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
部分,使versionName
为flutterVersionName
,versionCode
为flutterVersionCode.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):
为versionname
和versioncode
更新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+2
和flutter build appbundle --build-name=1.2.0 --build-number=2
【参考方案6】:
如果您使用的是 android studio,最简单的方法是从 local.properties 更改它
【讨论】:
以上是关于如何设置 Flutter 应用的构建和版本号的主要内容,如果未能解决你的问题,请参考以下文章
如何在不使用 assemblyinfo 的情况下使用 TFS 构建自动增加版本号?