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

2023-10-29

作者 | 弗拉德
来源 | 弗拉德(公众号: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

公众号

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐

  • 找最长公共子串

    题目 小明有两个字符串 可能包含空格 小明想找出其中最长的公共连续子串 希望你能帮助他 并输出其长度 输入描述 输入为两行字符串 可能包含空格 长度均小于等于50 输出描述 输出为一个整数 表示最长公共连续子串的长度 示例1 输入 abcd
  • vue使用vue-pdf

    效果 引入vue pdf npm install save vue pdf vue版本 vue 2 6 11 vue pdf 4 3 0 1 在使用页面引入 import pdf from vue pdf components 组件 sea
  • 【概念】为什么区块链被称为分布式数据库?举例讲解分布式数据库包会教程。区块链分布式数据库到底是什么?什么是分布式数据库?一千六百字讲清楚什么事分布式数据库。

    目录 前言 区块链是什么 为什么说是分布式数据库 去中心化 分布式网络 分布式数据库 前言 随着区块链慢慢走进大众视野 大家也能发现 网上许多教程都说区块链是分布式数据库 区块链技术是基于比特币应用提出的一个概念 他是一个融合了多种技术的一
  • FairMOT yolov5s转onnx

    代码 https github com ifzhang FairMOT 论文讲解参考 https blog csdn net weixin 42398658 article details 110873083 https www 163 c
  • Gradle 系列第二讲-android studio中的四个Gradle相关文件讲解

    在android studio中 我们创建一个android项目 会自动生成以下6个gradle的相关文件或文件夹 下面我们来依次全面解析这几个文件的内容和具体的作用 android project gradlew gradlew bat
  • 创建一个子窗口,MouseMove消息一直在触发的解决方法

    条件 在主窗口中 创建 create 一个Child属性的子窗口 在子窗口中使用MouseMove消息时 发现 该消息一直被触发 在domal一个Child属性的子窗口时却没有这个问题 为什么呢 原因在CWnd Create中WS POPU
  • DDL数据库及表的创建删除与使用

    Mysql gt DDL 一 DDL操作数据库 1 1查询 1 2创建数据库 1 3删除数据库 1 4使用数据库 二 DDL操作表 2 1查询表 2 2创建表 2 3数据类型 2 4删除表 2 5修改表 三 总结 一 DDL操作数据库 1
  • 隐私计算项目评估的“偏见”

    如何评估一个项目是不是值得投资 这件事情可能VC最有专业性 本文站在一线工作者的角度 阐述目前隐私计算项目的深浅 有些东西 一定是老百姓口中说出来的可能更贴近现实 做硬件的拼技术 荷兰ASML公司是全球最大的光刻机制造商 也是全球唯一可以提
  • Android+文本的查找和替换+可以对文本进行查找替换撤销等,基本实现了PC端.txt查找替换功能

    Android 文本的查找和替换 可以对文本进行查找替换撤销等 基本实现了PC端 txt查找替换功能 最近项目用到了类似PC端记事本查找替换功能 于是自己就写了一套算法 实现起来还是比较容易理解的 基于移动开发的文本查找替换功能 基本实现了
  • 基于单步的Map-Reduce的矩阵乘法

    基于单步的Map Reduce的矩阵乘法 矩阵的乘法只有在第一个矩阵的列数 column 和第二个矩阵的行数 row 相同时才有定义 一般单指矩阵乘积时 指的便是一般矩阵乘积 若A为i r矩阵 B为r j矩阵 则他们的乘积AB 有时记做A
  • 【云计算实验】基于OpenMP、CUDA、OpenCL、GPU并行计算实验

    前言 本文是之前做云计算实验整理的内容 借博客保存一下 使用不同方法对算法加速还是很有意思的 实验题目 自选一张图片 按照实验指南说明在jetson05节点上基于OpenMP和CUDA对图片进行边缘提取实验 记录梯度向量幅度的最小值和最大值
  • 应用编排与管理

    本节课程要点 需求来源 用例解读 操作演示以及架构设计 需求来源 背景问题 首先 我们来看一下背景问题 如下图所示 如果我们直接管理集群中所有的 Pod 应用 A B C 的 Pod 其实是散乱地分布在集群中 现在有以下的问题 首先 如何保
  • python unicode 标点范围_不同语言Unicode的编码范围

    我们常常会用到判断某个字符或者字符串是否包含中文 英文 特殊符号等等 这时候可以通过判断Unicode所在区间来确定某个字符所处类型 当然可以通过直接判断Unicode码 但是鉴于习惯 以下提供的是Unicode码对应的数字区间 毕竟字符的
  • 《MySQL实战45讲》读后感 03

    收获到的知识点 事务支持是在引擎层面实现的 但是并不是所有的引擎都支持事务 比如MySQL原生的MyISAM引擎就不支持事务 这也是MyISAM被 InnoDB取代的原因之一 多个事务同时执行的时候 可能出现这3种情况 脏读 dirty r
  • 2018年蓝桥杯省赛-日志统计

    题目 题目链接 题解 贪心 尺取 首先按照时间从小到大 对输入的每一组 t s ts ts和 i d id id进行排序 遍历每一对 取当
  • Vivado 使用过程中问题总结

    关注 星标公众号 及时获取更多技术分享 作者 冰茶奥利奥 微信公众号 嵌入式电子创客街 目录 情况1 在vivado进行一个行为级别仿真时 运行到simulate 步骤时 弹出了如下提示 情况2 综合时 ambiguous clock in
  • Bean name用法

    Spring的bean中有name属性 可以用来区分两个相同 部分属性不一样 的bean 最近我在做influxdb多数据源的时候用到 所以这里已influxdb为示例 仅供参考 看代码 Bean name influx1 public I
  • CSS媒体查询(@media)全面解析

    随着移动设备的快速普及 用户不再只是通过传统的电脑系来浏览 Web 内容 越来越多的用户开始使用各种尺寸的智能手机 平板电脑或者其它设备来浏览 Web 内容 为了确保使用不同设备的用户都能拥有不错的体验就需要用到媒体查询 媒体查询是 CSS
  • 【恒指早盘分析】趋势交易——看懂很简单,做到却很难!

    老子说 盖闻善执生者 陵行不辟兕虎 意思是说 善于保全生命的人 在山陵里走路不轻易干砍劈犀牛或老虎的事情 一个交易者不要轻易涉险 不要因欲望驱使而重仓或急于进场 也不要因为恐惧和疑虑而过早离场 老老实实的控制仓位 老老实实的看准行情之后再行
  • 【Flutter 1-15】Flutter手把手教程Dart语言——包管理工具Pub详解、pub get,pub cache使用

    作者 弗拉德 来源 弗拉德 公众号 fulade me 什么是Pub工具 Dart 生态系统使用包来管理共享软件 比如 库和工具 我们使用Pub包管理工具 来获取Dart包 在Pub上 可以找到公开可用的包 或者从本地文件系统或其他的位置