从包开发者的角度,版本号是在pubspec.yaml中指定的,例如:version: 1.0.0+1
。版本号的格式为:x.x.x+x
,称为语义版本号(semantic versioning)。其中“+”之前的部分是版本号(version number),后面的部分叫构建号(build number)。
除此之外,我在npm的相关文档中看到一段关于版本号的描述感觉受益匪浅,摘录如下:
版本号
使用NPM下载和发布代码时都会接触到版本号。NPM使用语义版本号来管理代码,这里简单介绍一下。语义版本号分为X.Y.Z三位,分别代表主版本号、次版本号和补丁版本号。当代码变更时,版本号按以下原则更新。
- 如果只是修复bug,需要更新Z位。
- 如果是新增了功能,但是向下兼容,需要更新Y位。
- 如果有大变动,向下不兼容,需要更新X位。
版本号有了这个保证后,在申明第三方包依赖时,除了可依赖于一个固定版本号外,还可依赖于某个范围的版本号。例如"argv": "0.0.x"表示依赖于0.0.x系列的最新版argv。
在android中,这两个版本号会体现在应用的构建build.gradle中:
android {
compileSdkVersion 29
defaultConfig {
minSdkVersion 16
targetSdkVersion 29
versionCode flutterVersionCode.toInteger() //对应flutter version中的build number
versionName flutterVersionName //对应flutter version中的version number
javaCompileOptions.annotationProcessorOptions.includeCompileClasspath = true
}
}
从包使用者的角度,以pub仓库中的包为例,我们可以通过一定规则指定版本号来引用远程仓库中的包。除了pub仓库,flutter还支持引用git仓库和本地的包,下面对这三种方式进行简要介绍。
any
path_provider: #不指定
path_provider: any #使用any
这种方式默认加载最新版本,不推荐这种方式,因为最新版本可能发生不兼容变更,导致成果物不稳定。
x.y.z
path_provider: 1.6.22
这种方式会覆盖其他库或组件中引入的版本号,只使用指定的版本,很多时候可以用来解决依赖冲突的问题。
path_provider: <=1.6.22 #小于等于指定版本号
path_provider: <1.6.22 #小于指定版本号
path_provider: '>=1.0.0 <1.6.22' #限制最大最小版本号
path_provider: ^1.6.22 #等同于'>=1.6.22 <2.0.0'
这种方式是开发中最常见的也是推荐的方式,就是指定了大版本不变(第一位),小版本使用最新的版本(后两位)。
补充知识:
上述版本号的规格不仅适用于包管理,也同样适用于dart sdk和flutter的版本管理。
dependencies:
flutter_package:
hosted:
name: flutter_package
url: http://your-package-server.com
version: ^6.0.0
dependencies:
flutter_package:
git:
url: https://github.com/xxx/flutter_package.git #必填,仓库地址
ref: commitID #选填,表示git引用,可以是commit hash, tag 或者 branch
path: packages/flutter_package #代码相对路径,当代码不在仓库根目录时需要填
dependencies:
flutter_package:
path: ../flutter_package #不仅支持相对路径,还支持绝对路径
本地代码通过path来指定对应的绝对或相对路径即可。
在打包工程中使用确定的版本号可以解决部分冲突问题,前提是所指定的版本没有兼容性问题。
dependencies:
path_provider: 1.6.22
在打包工程中利用dependency_overrides
列出需要覆盖版本的三方库及想要的版本号:
dependency_overrides:
path_provider: ^1.6.22
由于部分依赖是SDK引入的,因此当本地环境与代码原先的开发开发环境不同时就可能出现这类依赖冲突问题,比如:在SDK从1.17.5升级到2.0.1时原本依赖的stack_trace和intl库就发生了这种情况,这时候可以根据实际情况统一每位开发者的SDK环境来解决这类问题。