flutter 中的版本管理

flutter 版本管理

  • flutter sdk 版本的选择:
    1、Stable:稳定版。近一年中最好的beta版本。
    2、Beta:测试版。每隔几周都会选取近几个月中最好的dev版本作为Beta版。
    3、dev:最新的经过完全测试的版本。包含新功能,但可能有一些问题。
    4、master:最新版,但未经测试。
  • 查看flutter sdk版本号flutter --version
  • 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环境变量来直接运行它。

  • flutter SDK 版本回退
    通过这个地址找到要更新的版本号找到要回退的版本的git节点标识,终端进入到flutter根目录,然后终端执行 git reset --hard 1ad9baa 就可以了
  • pubspec.yaml文件解释
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

  • Dart 提供了包管理工具 Pub,用来管理代码和资源。从本质上说,包(package)实际上就是一个包含了 pubspec.yaml 文件的目录,其内部可以包含代码、资源、脚本、测试和文档等文件。包中包含了需要被外部依赖的功能抽象,也可以依赖其他包。
  • 在 Dart 中,库和应用都属于包。pubspec.yaml 是包的配置文件,包含了包的元数据(比如,包的名称和版本)、运行环境(也就是 Dart SDK 与 Fluter SDK 版本)、外部依赖、内部配置(比如,资源管理)。

在下面的例子中,我们声明了一个 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');
pub get 和 pub upgrade 区别
  • 有时候我们需要更新三方库,使用pub get 更新确得不到最新的代码,这是应为,对于一个三方库如果pubspec中指定的版本与缓存中的版本相同的话,pub就不会去更新最新的,而是用pub upgrade不论本地有没有该版本的缓存pub都回去网络上更新最新的版本
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,222评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,455评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,720评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,568评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,696评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,879评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,028评论 3 409
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,773评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,220评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,550评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,697评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,360评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,002评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,782评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,010评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,433评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,587评论 2 350