【发布时间】:2019-06-18 19:51:35
【问题描述】:
如何在不进入 Android 和 iOS 设置的情况下设置 Flutter 应用的版本名称和版本代码?
在我的 pubspec.yaml 中有
version: 2.0.0
但我没有看到内部版本号的位置。
【问题讨论】:
标签: android ios flutter version
如何在不进入 Android 和 iOS 设置的情况下设置 Flutter 应用的版本名称和版本代码?
在我的 pubspec.yaml 中有
version: 2.0.0
但我没有看到内部版本号的位置。
【问题讨论】:
标签: android ios flutter version
您可以在 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 了解如何修复它。
【讨论】:
--build-number,或者默认为 1,或者它是否以某种方式提供了自己的内部版本号?
感谢用户 abion47 从文章 Versioning with Flutter 中找到并浓缩以下答案。
默认情况下,Flutter 项目设置为在构建项目时根据 pubspec.yaml 中的版本设置自动更新 Android 和 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
}
}
【讨论】:
在 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 版本名称和版本代码。
【讨论】:
versionname 和versioncode 更新flutter 项目文件中的pubspec.yaml。flutter pub get。local.properties 以获取更新的flutter.versionName
flutter.versionCode gradle 文件夹中的文件。【讨论】:
对我来说,我的版本是
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