Contents

Package dependencies

依赖关系是pub软件包管理器的核心概念之一. 依赖项是您的程序包需要使用的另一个程序包. 依赖关系在您的pubspec中指定. 您只列出直接依赖项 ,即软件包直接使用的软件. Pub为您处理传递依赖项 .

对于每个依赖项,您可以指定要依赖的程序包的名称 . 对于库软件包 ,您可以指定允许的软件包版本范围 . 您也可以指定告诉酒馆包裹如何定位,以及任何额外说明的是,源需要找到包.

根据要提供的数据,可以通过两种方式指定依赖关系. 最简单的方法是只指定一个名称:

dependencies:
  transmogrify:

这将创建对transmogrify的依赖关系,该依赖关系允许使用任何版本,并使用默认源pub.dev site进行查找 . 要将依赖关系限制在一定范围的版本中,可以提供一个版本约束

dependencies:
  transmogrify: ^1.0.0

This creates a dependency on transmogrify using the default source and allowing any version from 1.0.0 to 2.0.0 (but not including 2.0.0). See Version constraints and Caret syntax for details on the version constraint syntax.

如果要指定源,则语法看起来有些不同:

dependencies:
  transmogrify:
    hosted:
      name: transmogrify
      url: http://some-package-server.com

这取决于使用hosted源的transmogrify软件包. 源代码项下的所有内容(这里只是带有url:键的映射)都是传递给源代码的描述. 每个来源都有其自己的描述格式,详细说明如下.

您还可以提供版本约束:

dependencies:
  transmogrify:
    hosted:
      name: transmogrify
      url: http://some-package-server.com
    version: ^1.0.0

当您不使用默认来源或需要指定复杂的说明时,将使用这种长格式. 但是在大多数情况下,您将只使用简单的packagename : version形式.

Dependency sources

这是pub可以用来查找软件包的不同来源,以及它们允许的描述:

SDK

SDK源可用于随软件包一起提供的任何SDK,这些软件包本身可能是依赖项. 当前,Flutter是唯一受支持的SDK.

语法如下所示:

dependencies:
  flutter_driver:
    sdk: flutter
    version: ^0.0.1

sdk:之后的标识符sdk:指示软件包来自哪个SDK. 如果是flutter ,则只要满足以下条件,就可以满足依赖关系:

  • Pub在flutter可执行文件的上下文中运行
  • Flutter SDK包含具有给定名称的软件包
  • 该软件包的版本与版本约束匹配

如果它是一个未知的标识符,则始终认为依赖关系不令人满意.

具有sdk依赖关系的软件包必须具有Dart SDK约束,且最低版本至少为1.19.0. 此约束确保较早版本的pub将不会安装具有sdk依赖关系的软件包.

Hosted packages

托管程序包是可以从pub.dev站点(或另一个使用相同API的HTTP服务器)下载的程序包. 这是声明对托管程序包的依赖关系的示例:

dependencies:
  transmogrify: ^1.4.0

此示例指定您的程序包依赖于名为transmogrify的托管程序包,并且可以使用1.4.0至2.0.0的任何版本(但不适用于2.0.0本身).

如果要使用自己的包服务器,可以使用指定其URL的描述:

dependencies:
  transmogrify:
    hosted:
      name: transmogrify
      url: http://your-package-server.com
    version: ^1.4.0

Git packages

有时您生活在最前沿,需要使用尚未正式发布的软件包. 也许您的包本身仍在开发中,并且正在使用同时开发的其他包. 为了简化操作,您可以直接依赖存储在Git存储库中的软件包.

dependencies:
  kittens:
    git: git://github.com/munificent/kittens.git

此处的git表示使用Git找到了该软件包,其后的URL是可用于克隆该软件包的Git URL.

即使软件包存储库是私有的,如果您可以使用SSH连接到存储库,那么您也可以使用存储库的SSH URL来依赖软件包:

dependencies:
  kittens:
    git: git@github.com:munificent/kittens.git

如果要依赖特定的提交,分支或标记,请添加ref参数:

dependencies:
  kittens:
    git:
      url: git://github.com/munificent/kittens.git
      ref: some-branch

引用可以是Git允许标识提交的任何内容.

Pub假定该软件包位于Git存储库的根目录中. 要在仓库中指定其他位置,请使用path参数:

dependencies:
  kittens:
    git:
      url: git://github.com/munificent/cats.git
      path: path/to/kittens

该路径相对于Git存储库的根.

Path packages

有时您会发现自己同时处理多个相关软件包. 也许您在构建使用框架的应用程序时正在创建框架. 在那种情况下,在开发过程中,您确实要依赖本地文件系统上该程序包的实时版本. 这样一来,一个程序包中的更改就会立即被依赖于它的程序包吸收.

为了解决这个问题,pub支持路径依赖 .

dependencies:
  transmogrify:
    path: /Users/me/transmogrify

这表示transmogrify的根目录是/Users/me/transmogrify . 对于这种依赖关系,pub会直接生成一个符号链接到所引用软件包目录的lib目录. 您对从属软件包所做的任何更改都会立即显示. 您不需要每次更改依赖包时都运行pub.

相对路径是允许的,并且被认为是相对于包含pubspec的目录的.

路径依赖关系对于本地开发很有用,但在与外界共享代码时不起作用-并不是每个人都可以使用您的文件系统. 因此,如果包的pubspec中具有任何路径依赖性,则不能将包上载到pub.dev站点 .

相反,典型的工作流程是:

  1. 在本地编辑pubspec以使用路径依赖项.
  2. 在主程序包及其依赖的程序包上工作.
  3. 一旦它们都起作用,就发布依赖包.
  4. 将您的pubspec更改为指向其依赖项的当前托管版本.
  5. 如果需要,也可以发布主软件包.

Version constraints

如果您的软件包是一个应用程序,则通常不需要为依赖项指定版本约束 . 首次创建应用程序时,通常需要使用依赖项的最新版本. 然后,您将创建并签入一个锁定文件 ,该文件将您的依赖项固定到那些特定版本. 这样,在pubspec中指定版本约束通常是多余的(尽管您可以根据需要执行此操作).

但是,对于要用户重用的库包 ,重要的是指定版本约束. 这样一来,使用您的软件包的人就可以知道他们可以依赖哪个版本的依赖项才能与您的库兼容. 您的目标是允许尽可能多的版本,以给您的用户带来灵活性. 但是它应该足够狭窄,以排除您知道不起作用或未经测试的版本.

Dart社区使用语义版本控制 1 ,它可以帮助您知道应该使用哪个版本. 如果您知道您的程序包可以在1.2.3的某些依赖项下正常工作,那么语义版本控制将告诉您它(至少)应在2.0.0 .

版本约束是一系列的:

any
字符串any允许任何版本. 这等效于空版本约束,但更为明确. 虽然允许any操作,但出于性能原因,我们不建议您这样做.
1.2.3
一个具体的版本号将依赖关系固定为仅允许该确切版本. 尽量避免使用此功能,因为它可能导致用户版本锁定,并使他们难以同时使用您的程序包和其他依赖它的程序包.
>=1.2.3
允许给定版本或任何更高版本. 您通常会使用它.
>1.2.3
Allows any version greater than the specified one but not that version itself.
<=1.2.3
允许任何低于或等于指定版本的版本. 您通常不会使用它.
<1.2.3
允许任何低于指定版本的版本,但不允许该版本本身. 这是您通常使用的方法,因为它使您可以指定适合您的软件包的较高版本(因为这是引入一些重大更改的第一个版本).

您可以根据需要指定版本部件,并且它们的范围会交叉在一起. 例如, '>=1.2.3 <2.0.0'允许从1.2.32.0.0任何版本(不包括2.0.0本身). 表示此范围的更简单方法是使用脱字号语法^1.2.3 .

Caret syntax

脱字号语法提供了一种更紧凑的方式来表达最常见的版本约束. ^version表示"保证与指定版本向后兼容的所有版本范围",并遵循pub的语义版本约定. 例如, ^1.2.3等效于'>=1.2.3 <2.0.0' ,而^0.1.2等效于'>=0.1.2 <0.2.0' . 以下是插入符号语法的示例:

dependencies:
  path: ^1.3.0
  collection: ^1.1.0
  string_scanner: ^0.1.2

请注意,在Dart 1.8.3中添加了插入符号语法. 较旧版本的Dart无法理解它,因此您需要包括SDK约束(使用传统语法)以确保较旧版本的pub不会尝试对其进行处理. 例如:

environment:
  sdk: '>=1.8.3 <3.0.0'

Dev dependencies

Pub支持两种依赖项:常规依赖项和开发依赖项. 开发依赖项与常规依赖项的区别在于, 您依赖的软件包的开发依赖项将被忽略 . 这是一个例子:

transmogrify软件包在其测试中且仅在其测试中使用该test软件包. 如果有人只想使用transmogrify其库),则实际上不需要test . 在这种情况下,它将test指定为dev依赖项. 它的pubspec将具有以下内容:

dev_dependencies:
  test: '>=0.5.0 <0.12.0'

Pub可传递地获取您包所依赖的每个包以及这些包所依赖的所有内容. 它还会获取您程序包的dev依赖关系,但会忽略任何依赖程序包的dev依赖关系. 酒吧只得到你的软件包的开发依赖. 因此,当您的包裹依赖于transmogrify ,它将变得transmogrify但不会进行test .

在常规或开发依赖项之间进行选择的规则很简单:如果从libbin目录中的内容中导入依赖项,则它必须是常规依赖项. 如果仅从testexample等导入,则可以并且应该是dev依赖项.

使用开发依赖关系会使依赖关系图更小. 这使pub运行速度更快,并使查找满足所有约束的一组软件包版本更加容易.

Dependency overrides

您可以使用dependency_overrides临时覆盖对依赖项的所有引用.

例如,也许您正在更新Transmogrify的本地副本(已发布的库包). Transmogrify由依赖关系图中的其他软件包使用,但是您不想在本地克隆每个软件包并更改每个pubspec来测试您的Transmogrify本地副本.

在这种情况下,可以使用dependency_overrides覆盖dependency_overrides以指定包含程序包本地副本的目录.

pubspec如下所示:

name: my_app
dependencies:
  transmogrify: ^1.2.0
dependency_overrides:
  transmogrify:
    path: ../transmogrify_patch/

当您运行pub get ,会更新pubspec的锁定文件以反映依赖关系的新路径,并且无论使用transmogrify为何,pub都会使用本地版本.

您还可以使用dependency_overrides指定软件包的特定版本:

name: my_app
dependencies:
  transmogrify: ^1.2.0
dependency_overrides:
  transmogrify: '3.2.1'

注意:使用依赖项覆盖会带来一些风险. 例如,使用替代指定该软件包声称支持的范围之外的版本,或者使用替代指定具有意外行为的软件包的本地副本,可能会破坏您的应用程序.


by  ICOPY.SITE