【Flutter 1-15】Flutter手把手教程Dart语言——包管理工具Pub详解、pub get,pub cache使用

作者 | 弗拉德
来源 | 弗拉德(公众号:fulade_me)

什么是Pub工具

Dart 生态系统使用包来管理共享软件,比如:库和工具。我们使用Pub包管理工具 来获取Dart包。在Pub上,可以找到公开可用的包。或者从本地文件系统或其他的位置,比如Git仓库,加载可用的包。无论包是从什么途径加载的, Pub 都会进行版本依赖管理,从而帮助我们获得版本兼容的软件包以及SDK。
pub工具包含管理 Package 、部署 Package 和部署命令行应用的命令。
Dart 包目录中至少包含一个pubspec文件。

2020_12_06_pubspec

pubspec 文件记录一些关于项目的依赖数据。此外还有一些其他数据比如:Dart 库,应用,资源,测试,图片,以及示例。

下面是一个 pubspec 的示例,示例中声明依赖了在 Pub 站点上托管的两个包( js 和 intl ):

name: my_app
dependencies:
  js: ^0.6.0
  intl: ^0.15.8

pub get

在项目中配置了pubspec文件后,就可以在项目根目录中执行pub get命令:

 cd <path-to-my_app>
 pub get

pub get命令确定当前应用所依赖的包,并将它们保存到中央系统缓存(central system cache)中。如果当前应用依赖了一个公开包,Pub会从Pub站点 该包。对于一个Git依赖,Pub会Clone该Git仓库。
同样包括包的相关依赖也会被下载。例如,如果 js 包依赖 test 包, pub 会同时获取js包和test包。

Pub 会创建一个.packages 文件(位于应用程序的根路目录下),该文件将应用程序所依赖的每个包名相应的映射到系统缓存中的包。


2020_12_06_packages

pub upgrade

第一次获取依赖时,Pub 会下载依赖及其兼容的最新版本。然后通过创建lockfile 锁定依赖,以始终使用这个版本。 Pub会在pubspec旁创建并存储一个名为pubspec.lock文件。它列出了使用的每个依赖包的指定版本(当前包或传递包的版本)。

2020_12_06_pubspec_lock

在开发项目中的每个人都能够使用所有相同版本的包。同样加入到 lockfile 可以保证部署的应用使用的是同一版本的代码。

如果已经准备更新依赖到最新版本,使用命令 pub upgrade :

pub upgrade

上面的命令用于重新生成 lockfile 文件,并使用最新可用版本的依赖包。如果仅升级某个依赖,可以在命令中指定需要升级的包:

pub upgrade intl

上面的命令升级intl到最新版本,其它包不变。

注意pub upgrade 命令并非总是可以将所有的package更新到最新版本,原因是pubspec文件中的一些package之间有版本限制的冲突。

pub cache

用于管理 Pub 的本地 Package 缓存。使用该命令你可以将一个 Package 添加至缓存,或者清除所有缓存的 Package 并重新安装。
你可以使用pub cache add命令将新的 Package 添加至缓存。也可以使用pub cache repair 命令将Package从缓存中清除并重新安装。

pub cache add <package> [--version <constraint>] [--all]
pub cache repair

选项


add <package>    # 在你的缓存中安装一个库。

--all   # 可选的选项。与 pub add 结合使用用于安装某个库的所有版本。

--version <constraint>  # 可选的选项。与 pub add 结合使用根据限制条件安装最适合的版本。
# 例如:pub cache add barback --version "<=0.8.0 <0.110"  如果省略掉 --version,Pub 会从已知的版本中挑选一个最适合的进行安装。

repair # 如果 Pub 缓存中的 Package 被修改坏了的。例如,有人不小心修改了依赖内的文件,但是不知道该如何修改回来。pub cache repair 命令可以对系统缓存中的所有 Package 执行重安装以修正篡改的问题。

pub deps

该命令可以将 Package 的依赖图示打印输出到控制台。该图示中包括 Package 声明在 pubspec 文件中的直接依赖以及这些直接依赖所依赖的间接依赖

pub deps [--style=<style>] [--dev] [--no-dev] [--executables]

依赖信息默认以树状的形式打印输出。
例如,有个项目的pubspec文件中声明了如下依赖信息:

dependencies:
  barback: ^0.15.2
  markdown: ^0.7.2

当你执行 pub deps 命令时则会看到项目的依赖图示如下:

markdown_converter 0.0.0
|-- barback 0.15.2+6
|   |-- collection 1.1.2
|   |-- path 1.3.6
|   |-- pool 1.1.0
|   |   '-- stack_trace...
|   |-- source_span 1.2.0
|   |   '-- path...
|   '-- stack_trace 1.4.2
|       '-- path...
'-- markdown 0.7.2

选项

--style=<style> 或 -s <style> ## 指定的样式输出格式。用于指定依赖项打印输出的样式。

# 共有 简洁、树状 和 列表 三种,默认是树状样式。

# tree 以树状的形式打印依赖信息。这是默认格式。

# list 以列表的形式打印依赖信息。

# compact 以紧凑列表的形式打印依赖信息。

--dev # 打印所有包依赖信息,包括开发时期依赖。它是默认选项。

--no-dev #打印除了开发期依赖之外的所有包依赖。

--executables #打印所有可用的可执行文件。

pub downgrade

在没有其它额外参数的情况下,pub downgrade命令会获取当前工作目录下 pubspec.yaml 文件中列出的所有依赖项以及它们间接依赖项的最低版本。

pub downgrade [--[no-]offline] [-n|--dry-run] [dependencies...]

例如:

$ pub downgrade
Resolving dependencies... (1.2s)
+ barback 0.13.0
+ collection 0.9.1
+ path 1.2.0
+ source_maps 0.9.0
+ source_span 1.0.0
+ stack_trace 0.9.1
Changed 6 dependencies!

pub downgrade 命令会创建一个lockfile文件。如果lockfile文件已经存在,Pub 则会忽略该文件并生成一个新的lockfile 文件,然后所有依赖项都会使用最低版本。

降级指定依赖项
你可以指定pub downgrade命令只将某个依赖项的版本降至最低且不影响其余依赖项。例如:

$ pub downgrade test
Resolving dependencies...
  barback 0.15.2+2
  bot 0.27.0+2
  browser 0.10.0+2
  chrome 0.6.5
  collection 1.1.0
  path 1.3.0
  pool 1.0.1
  source_span 1.0.2
< stack_trace 0.9.2 (was 1.1.1)
  stagexl 0.10.2
< test 0.10.0 (was 0.11.4)
These packages are no longer being depended on:
- matcher 0.11.3
Changed 3 dependencies!

如果你降低指定依赖项的版本,且该依赖项还有间接依赖项,那么在版本变更后这些间接依赖项可能不适配降低后的新版依赖项。此时,Pub 会尝试在新版本依赖项可接受的范围内查找版本最高的该依赖项所依赖的间接依赖项。因此,通常而言,降低某个依赖项的版本后,其间接依赖项的版本也会随之降低。
获取新的依赖项
如果在执行pub downgrade命令前将某个依赖添加至 pubspec 文件中,则在执行该命令后会将该新的依赖项以及其间接依赖的其它依赖项下载并将其放到 .packages 文件中。这点与 pub get 命令一致。

移除依赖项
如果在 pub downgrade 命令前从 pubspec 文件移除了某个依赖项,则在执行该命令后会将该依赖项从 .packages 文件中移除,且代码使用到该依赖项的相关导入将变得不可用。所有该依赖项依赖的间接依赖项也同时会被移除,只要这些间接依赖项没有没其它的依赖项所依赖。这点也与pub get 命令一致。

离线降级
在没有网络的情况下你也依然可以运行pub downgrade 命令。因为 Pub 会将 Package 下载到一个统一的缓存区并将其与系统上其它的 Package 进行共享,如果你所需的 Package 是一个使用频率很高的 Package,那么很有可能它已经被其它 Package 在使用时下载到统一缓存区中了,此时你可以直接依赖使用它。

但是,默认情况下,pub downgrade 命令会总是尝试获取线上的依赖版本,因此 Pub 可以确定依赖项是否有更新的版本。如果你不想 Pub 去线上检查,可以使用 --offline 命令参数让该命令在离线模式下执行。在离线模式下,Pub 只会从本地缓存区查找已经下载到的可用 Package。

选项

--[no-]offline # 默认情况下,pub 将会通过网络检查(--no-offline)。要使用缓存的包,请使用 --offline。
--dry-run 或 -n #报告将要改变的依赖项,但不会真的改变它。

pub publish

pub publish [--dry-run] [--force]

该命令用于将你的 Package 发布到pub.dev网站以供其他人下载和依赖。
选项

--dry-run 或 -n #该选项可以让你运行上传 Package 的整个流程但不会真正地上传任何文件到 pub.dev 网站。此操作可以让你在真正上传到 pub.dev 网站前检查你的上传等相关配置是否有误。

--force 或 -f  #该选项让 Pub 在上传时不再向你进行确认。正常情况下,它会在你上传时向你显示 Package 的内容以及向你进行确认。

如果 Package 存在错误,Pub 则会退出且不继续进行上传。如果出现的是警告,则 Package 会依旧被上传。如果你想确保你的 Package 在上传前没有警告,请确保不要使用 --force--dry-run 选项。

pub uploader

pub uploader [options] {add/remove} <email>

该命令允许pub.dev网站上某个 Package的上传者为该Package添加或删除其它的上传者。其有两个子命令addremove,可以将邮件地址作为某个上传者的标识以此来添加或删除上传者。例如:

pub uploader add bob@example.com # 我们已经向 bob@example.com 发送了一份邀请函,在他/她确认后就会成被加入上传者(权限)
pub uploader remove bob@example.com # // 成功将该上传者从 package 中移除

如果 Package 有且只有一个上传者,则该上传者不能再被删除。你可以将自己从上传者列表中删除(只要 Package 中还有其它的上传者即可),但是一旦你删除了自己后则不能再将自己添加回去。

默认情况下,你修改的是当前工作目录中 Package 的上传者。你可以通过 --package 标识来指定修改哪个 Package 的上传者。例如:

pub uploader --package=transmogrify add bob@example.com 
 # // 我们已经向 bob@example.com 发送了一份邀请函,在他/她确认后就会成被加入上传者(权限)

通过 pub uploader add <email> 命令发送邀请,被邀请的用户必须接受

其他不常用的命令可参考:

pub outdated 使用方法参考:https://zhuanlan.zhihu.com/p/138638020
pub global 使用方法参考:https://www.jianshu.com/p/8a7f2cbac7a1

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,839评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,543评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,116评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,371评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,384评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,111评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,416评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,053评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,558评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,007评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,117评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,756评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,324评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,315评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,539评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,578评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,877评论 2 345

推荐阅读更多精彩内容