flutter

flutter 中的版本管理

2020-05-12  本文已影响0人  张_何

flutter 版本管理

flutter upgrade   //指令代码      只升级依赖包   
flutter upgrade v1.9.1+hotfix.3 // 升级到指定的  v1.9.1+hotfix.3 版本      
flutter packages get        // 获取pubspec.yaml中所有的依赖关系          
flutter packages upgrade  //获取pubspec.yaml中所有列表中的依赖项的最新版

注意: 不要使用 pub get 或者 pub upgrade命令来管理依赖关系。建议使用使用flutter packages get或flutter packages upgrade管理依赖关系。 如果你想手动使用pub,可以通过设置 FLUTTER_ROOT环境变量来直接运行它。

version: 1.0.0+1 //app版本号,其中+前面为版本号,后面为构建号。
environment:
  sdk: ">=2.1.0 <3.0.0" // Dart sdk版本号,多人开发中建议写死
dependencies: // 以下是依赖的三方库
  flutter:
    sdk: flutter
  cupertino_icons: ^0.1.2
  dio: '3.0.9'
  flutter_screenutil: '1.0.1'
  flutter_easyrefresh: '2.1.1'
  provide: '1.0.2'
  fluro: '1.6.3'

pub

在下面的例子中,我们声明了一个 flutter_app_example 的应用配置文件,其版本为 1.0,Dart 运行环境支持 2.1 至 3.0 之间,依赖 flutter 和 cupertino_icon:

name: flutter_app_example # 应用名称
description: A new Flutter application. # 应用描述
version: 1.0.0 
#Dart 运行环境区间
environment:
  sdk: ">=2.1.0 <3.0.0"
#Flutter 依赖库
dependencies:
  flutter:
    sdk: flutter
  cupertino_icons: ">0.1.1"

运行环境和依赖库 cupertino_icons 冒号后面的部分是版本约束信息,由一组空格分隔的版本描述组成,可以支持指定版本、版本号区间,以及任意版本这三种版本约束方式。比如上面的例子中,cupertino_icons 引用了大于 0.1.1 的版本。

需要注意的是,由于元数据与名称使用空格分隔,因此版本号中不能出现空格;同时又由于大于符号“>”也是 YAML 语法中的折叠换行符号,因此在指定版本范围的时候,必须使用引号, 比如">=2.1.0 < 3.0.0"。

对于包,我们通常是指定版本区间,而很少直接指定特定版本,因为包升级变化很频繁,如果有其他的包直接或间接依赖这个包的其他版本时,就会经常发生冲突。

而对于运行环境,如果是团队多人协作的工程,建议将 Dart 与 Flutter 的 SDK 环境写死,统一团队的开发环境,避免因为跨 SDK 版本出现的 API 差异进而导致工程问题。

比如,在上面的示例中,我们可以将 Dart SDK 写死为 2.3.0,Flutter SDK 写死为 1.2.1。

environment:
  sdk: 2.3.0
  flutter: 1.2.1

基于版本的方式引用第三方包,需要在其 Pub 上进行公开发布,我们可以访问https://pub.dev/来获取可用的第三方包。而对于不对外公开发布,或者目前处于开发调试阶段的包,我们需要设置数据源,使用本地路径或 Git 地址的方式进行包声明。

在下面的例子中,我们分别以路径依赖以及 Git 依赖的方式,声明了 package1 和 package2 这两个包:

dependencies:
  package1:
    path: ../package1/  # 路径依赖
  date_format:
    git:
      url: https://github.com/xxx/package2.git #git 依赖

在开发应用时,我们可以不写明具体的版本号,而是以区间的方式声明包的依赖;但对于一个程序而言,其运行时具体引用哪个版本的依赖包必须要确定下来。因此,除了管理第三方依赖,包管理工具 Pub 的另一个职责是,找出一组同时满足每个包版本约束的包版本。包版本一旦确定,接下来就是下载对应版本的包了。

对于 dependencies 中的不同数据源,Dart 会使用不同的方式进行管理,最终会将远端的包全部下载到本地。比如,对于 Git 声明依赖的方式,Pub 会 clone Git 仓库;对于版本号的方式,Pub 则会从 pub.dartlang.org 下载包。如果包还有其他的依赖包,比如 package1 包还依赖 package3 包,Pub 也会一并下载。

然后,在完成了所有依赖包的下载后,Pub 会在应用的根目录下创建.packages 文件,将依赖的包名与系统缓存中的包文件路径进行映射,方便后续维护。

最后,Pub 会自动创建 pubspec.lock 文件。pubspec.lock 文件的作用类似 iOS 的 Podfile.lock 或前端的 package-lock.json 文件,用于记录当前状态下实际安装的各个直接依赖、间接依赖的包的具体来源和版本号。

比较活跃的第三方包的升级通常比较频繁,因此对于多人协作的 Flutter 应用来说,我们需要把 pubspec.lock 文件也一并提交到代码版本管理中,这样团队中的所有人在使用这个应用时安装的所有依赖都是完全一样的,以避免出现库函数找不到或者其他的依赖错误。

除了提供功能和代码维度的依赖之外,包还可以提供资源的依赖。在依赖包中的 pubspec.yaml 文件已经声明了同样资源的情况下,为节省应用程序安装包大小,我们需要复用依赖包中的资源。
在下面的例子中,我们的应用程序依赖了一个名为 package4 的包,而它的目录结构是这样的:

pubspec.yaml    
└──assets
    ├──2.0x
    │   └── placeholder.png
    └──3.0x
        └── placeholder.png

其中,placeholder.png 是可复用资源。因此,在应用程序中,我们可以通过 Image 和 AssetImage 提供的 package 参数,根据设备实际分辨率去加载图像。

Image.asset('assets/placeholder.png', package: 'package4');
 
AssetImage('assets/placeholder.png', package: 'package4');


上一篇下一篇

猜你喜欢

热点阅读