目录

自定义包存储库

dart pub 工具支持第三方包存储库。包存储库是一个服务器,用于托管供 dart pub 工具使用的 Dart 包。默认使用的包存储库 pub.dev 由 Dart 团队运营,以方便发布供公众使用的 Dart 包。包存储库由 *hosted-url* 标识,例如 https://dart-packages.example.com/

有时,自定义包存储库对于托管私有包可能很有用,包括以下一些场景:

  1. 在组织内部共享内部专有包。
  2. 在企业环境中严格控制依赖项。
  3. 没有公共互联网访问的安全环境。

使用 git-dependencies 来托管私有包也很常见,但是,dart pub 工具不支持针对 git 存储库解析版本;它只是获取 git 存储库的特定修订版。因此,当多人协作时,通常最好使用私有包存储库。

使用自定义包存储库进行身份验证

#

大多数自定义包存储库都是需要身份验证的私有包存储库。为了针对自定义包存储库进行身份验证,dart pub 工具会在请求中附加一个密钥令牌。

您可以从您的自定义包存储库获取密钥令牌,并通过手动指定或通过环境变量指定。要手动指定密钥令牌,请使用 dart pub token add 命令,该命令会提示输入令牌

$ dart pub token add https://dart-packages.example.com
Enter secret token: [enter secret token]
Requests to "https://dart-packages.example.com" will now be authenticated using the secret token.

您也可以使用 --env-var 标志告诉 dart pub 从环境变量中读取令牌,包括在 CI 环境中

$ dart pub token add https://dart-packages.example.com --env-var MY_SECRET_TOKEN
Requests to "https://dart-packages.example.com" will now be authenticated using the secret token stored in the environment variable "MY_SECRET_TOKEN".

这确保了 dart pub 实际上不会将其配置中的密钥令牌存储,而是仅存储它应该从环境变量 $MY_SECRET_TOKEN 中读取密钥的事实。这降低了如果执行环境在 CI 作业之间共享时密钥被意外泄露的风险。

从自定义包存储库检索依赖项

#

要从自定义包存储库中获取包,您必须在 pubspec.yaml 中使用 托管包 的语法指定包的 *hosted-url*。例如

yaml
dependencies:
  example_package:
    hosted: https://dart-packages.example.com
    version: ^1.4.0

在前面的示例中,package:example_packagehttps://dart-packages.example.com 获取。如果此包存储库需要身份验证,请参阅使用自定义包存储库进行身份验证,以获取有关如何验证请求的更多信息。

您还可以使用带有 --hosted 标志的 dart pub add 命令从自定义包存储库中添加依赖项

$ dart pub add example_package --hosted https://dart-packages.example.com

使用多个包存储库

#

您还可以从不同的包存储库获取不同的依赖项,因为可以为每个依赖项指定 *hosted-url*

yaml
dependencies:
  # package retry is fetched from pub.dev (the default package repository)
  retry: ^3.0.0
  # package example_package is fetched from https://dart-packages.example.com
  example_package:
    hosted: https://dart-packages.example.com
    version: ^1.4.0

这使您可以在私有包存储库上保留私有包,同时使用最新的公共包作为依赖项。

但是,如果您的依赖项需要来自不同存储库的同名包,则很容易出现冲突。例如,如果包 retry 需要来自 pub.dev 的 meta,并且 example_package 需要来自 https://dart-packages.example.commeta。因此,如果将任何包镜像到私有包存储库中,通常有必要镜像所有依赖项,并更新每个包的 dependencies 部分,或者覆盖默认包存储库

发布到自定义包存储库

#

要将包发布到自定义包存储库而不是 pub.dev,请在 pubspec.yaml 中指定 publish_to 属性。如果启用了身份验证,则发布将使用与检索包相同的令牌身份验证

要准备将包发布到 https://dart-packages.example.com,您的 pubspec.yaml 至少应如下所示

yaml
name: example_package
version: 1.0.0
# Ensures the package is published to https://dart-packages.example.com
publish_to: https://dart-packages.example.com

然后要发布该包的新版本,请使用 dart pub publish

$ dart pub publish
Publishing example_package 1.0.0 to https://dart-packages.example.com
|-- CHANGELOG.md
|-- LICENSE
|-- README.md
|-- lib
|   '-- example_package.dart
'-- pubspec.yaml
...

覆盖默认包存储库

#

默认情况下,除非使用托管依赖项语法指定自定义包存储库,否则 dart pub 会从 pub.dev 站点检索依赖项并将包发布到该站点。但是,您可以使用 PUB_HOSTED_URL 环境变量来覆盖默认包存储库。

当在受限网络环境中工作时,镜像私有包存储库中的所有包或 pub.dev 的子集时,此方法特别有用。

设置自定义包存储库

#

您可以通过实现 托管 Pub 存储库规范版本 2 中概述的 REST API 来编写自定义包存储库。

作为服务的 Dart 包存储库

#

自定义包存储库也作为服务提供,并支持多个供应商的令牌身份验证,从而减轻了您托管和维护自己的自定义包存储库的开销