Flutter 笔记 pubspec

720 阅读4分钟

pub.dev/

版本说明

版本格式:主版本号.次版本号.修订号,版本号递增规则如下:

  • 主版本号:当你做了不兼容的 API 修改,
  • 次版本号:当你做了向下兼容的功能性新增,
  • 修订号:当你做了向下兼容的问题修正。
any # 所有版本,等同于不写。对pub运行性能有影响,不推荐
1.2.3 # 明确的版本号
'>=1.2.3' # 还有 >1.2.3, <=1.2.3, <1.2.3
^1.2.3 # Caret syntax 等同于 >=1.2.3 <2.0.0

版本冲突

如果项目依赖了 A , B 库,他们都依赖了一个 C ,但 C 的版本不同,可能会产生版本冲突。pub 会尝试找到符合所有依赖约束的版本号。如果找不到能匹配的版本,但 A ,B 库依赖 C 库的 API 是一样的,那么可以添加一个依赖覆盖来强制指定某一版本。 注:pub 是 Dart SDK 提供的一个包管理工具

dependencies:
  some_package:
  other_package:
dependency_overrides:
  url_launcher: '0.4.3'

如果是 Android 平台的库依赖冲突,可以在 app 的 gradle 文件中强制指定版本

configurations.all {
    resolutionStrategy {
        force 'com.google.guava:guava:23.0-android'
    }
}

从不同的依赖源添加依赖

pub

dependencies:
  flutter_kit: ^1.0.0 

git

dependencies:
  flutter_kit:
    git: git://github.com/bineanzhou/flutter_kit.git

指定分支

dependencies:
  flutter_kit:
    url: git://github.com/bineanzhou/flutter_kit.git
    ref: some-branch

pub 默认包目录在 git 仓库的根目录,如果要指定在别的位置,可以用 path 参数

dependencies:
  flutter_kit:
    git:
      url: git://github.com/bineanzhou/flutter.git
      path: path/to/flutter_kit

本地路径

特别适用在一个人同时开发项目和依赖库的情况。因为修改依赖库的代码,在项目中就可以即时生效,有利于调试和提高效率。

dependencies:
  transmogrify:
    path: /Users/me/transmogrify # 也可以相对路径,相对路径以 pubspec.yml 文件为基准

依赖的分类

根据依赖与项目的关系,可以分为以下2类:

  • immediate dependency :项目中直接使用的依赖,即我们在 pubspec 中列出的依赖,包括 dependcies 和 dev_dependencies
  • transitive dependency :直接依赖所需的依赖, pub 会根据 pubspec 中列出的依赖自动为我们获取。

直接依赖和传递依赖

举个例子

比如我们项目依赖 A ,而 A 又依赖 B , B 又依赖 C 。那么 A 是我们项目的immediate dependency, B 和 C 就是transitive dependency

我们可以在命令行中输入命令flutter packages pub deps,查看项目的依赖树。 比如我们在项目中引入了一个支持网络缓存的图片库cached_network_image: ^0.5.0+1

flutter packages pub deps
Dart SDK 2.1.0-dev.9.4.flutter-f9ebf21297
Flutter SDK 1.0.1-pre.2
your_app_name 2.2.0+10 # 项目名称和版本
|-- cached_network_image 0.5.1 # 直接依赖
|   |-- flutter... # 直接依赖(因为在项目pubspec中也添加了)
|   '-- flutter_cache_manager 0.2.0+1 # 传递依赖
|       |-- flutter...
|       |-- http...
|       |-- path_provider...
|       |-- shared_preferences...
|       |-- synchronized 1.5.3
|       '-- uuid 1.0.3
|           |-- convert...
|           '-- crypto...
...

常规依赖和dev依赖

根据依赖的作用范围,可以分为:

  • dependencies:常规依赖
  • dev dependencies :开发时所需依赖。它和常规依赖的区别是,项目依赖库中的 dev dependencies ,对于你的项目来说是不可见的。

举个例子

项目的 pubspec.yml 如下。如果 A 有一个 dev_dependencies 依赖 dev_C ,项目最终的依赖是 A , dev_B;不包括 dev_C。

dependencies:
  A:
dev_dependencies:
  dev_B: 

适应场景:如果你需要 import 到 lib 或者 bin 目录,那么选择 dependencies ; 如果你只需要 import 到 test , example 等,那么就选择 dev dependencies 。使用 dev dependencies 的好处是能让依赖树更小,从而使 pub 运行更快,能跟容易找到满足所有约束的包版本。

包管理

在获取一个新的依赖时,pub 会下载满足版本条件的最新版本,然后把版本信息添加到一个 lockfile 中。这个 lockfile 文件叫 pubspec.lock ,位于项目 pubspec.yml 的同级目录。它列出了项目的每个依赖(包括直接依赖和传递依赖)的版本信息。我们应该把这个 lockfile 添加到版本控制中,这样不论开发环境,生产环境都能确保使用了相同的依赖版本。

举个例子

项目的 pubspec.yml 文件包含如下依赖

...
dependencies:
  flutter:
    sdk: flutter
  cached_network_image: ^0.5.0+1

dev_dependencies:
  flutter_test:
    sdk: flutter
...

结合上面提到知识,我们来看看 pubspec.lock 的内容。 lockfile 把所有依赖树打平,并根据首字母排序

cached_network_image:
    dependency: "direct main" # 直接依赖,常规依赖
    description:
      name: cached_network_image
      url: "https://pub.flutter-io.cn"
    source: hosted
    version: "0.5.1"
flutter: 
    dependency: "direct main" # 直接依赖,常规依赖
    description: flutter
    source: sdk
    version: "0.0.0"
flutter_test:
    dependency: "direct dev" # 直接依赖,开发依赖
    description: flutter
    source: sdk
    version: "0.0.0"
uuid:
    dependency: transitive # 传递依赖
    description:
      name: uuid
      url: "https://pub.flutter-io.cn"
    source: hosted
    version: "1.0.3"
...

如果非首次获取依赖,pub 会从 lockfile 中读取版本。如果想升级到满足 pubspec.yml 中约束的最新版本,可以执行 flutter packages upgrade 命令,升级后会更新 lockfile 中的版本。