自定义包仓库
dart pub
工具支持第三方包仓库。包仓库是一个托管 Dart 包的服务器,供 dart pub
工具使用。默认使用的包仓库是 pub.dev ,由 Dart 团队运营,方便公开发布 Dart 包。包仓库由一个托管 URL 标识,例如 https://dart-packages.example.com/
。
有时,自定义包仓库对于托管私有包可能很有用,包括以下几种情况:
- 在组织内部共享内部专有包。
- 严格控制企业环境中的依赖项。
- 没有公共互联网访问权限的安全环境。
使用 git 依赖项 托管私有包也很常见,但是, dart pub
工具不支持针对 git 仓库解析版本;它只获取 git 仓库的特定版本。因此,当许多人协作时,通常最好使用私有包仓库。
使用自定义包仓库进行身份验证
#大多数自定义包仓库都是需要身份验证的私有包仓库。为了对自定义包仓库进行身份验证, dart pub
工具会将一个秘密令牌附加到请求中。
您可以从自定义包仓库获取秘密令牌,并手动指定它或通过环境变量指定它。要手动指定秘密令牌,请使用 dart pub token add
命令,该命令会提示输入令牌:
$ dart pub token add https://dart-packages.example.com
Enter secret token: [输入秘密令牌]
对 "https://dart-packages.example.com" 的请求现在将使用秘密令牌进行身份验证。
您也可以使用 --env-var
标志告诉 dart pub
从环境变量(包括 CI 环境)中读取令牌:
$ dart pub token add https://dart-packages.example.com --env-var MY_SECRET_TOKEN
对 "https://dart-packages.example.com" 的请求现在将使用存储在环境变量 "MY_SECRET_TOKEN" 中的秘密令牌进行身份验证。
这确保了 dart pub
不会实际将其配置中的秘密令牌存储起来,而只是存储它应该从环境变量 $MY_SECRET_TOKEN
读取秘密的事实。这降低了如果执行环境在 CI 作业之间共享,秘密意外泄露的风险。
从自定义包仓库检索依赖项
#要从自定义包仓库获取包,必须在 pubspec.yaml
中使用 托管包 的语法指定包的托管 URL。例如:
dependencies:
example_package:
hosted: https://dart-packages.example.com
version: ^1.4.0
在前面的示例中, package:example_package
从 https://dart-packages.example.com
获取。如果此包仓库需要身份验证,请参阅 使用自定义包仓库进行身份验证 ,了解如何对您的请求进行身份验证的更多信息。
您也可以使用 dart pub add
命令和 --hosted
标志从自定义包仓库添加依赖项:
$ dart pub add example_package --hosted https://dart-packages.example.com
使用多个包仓库
#您还可以从不同的包仓库获取不同的依赖项,因为可以为每个依赖项指定托管 URL:
dependencies:
# retry 包是从 pub.dev(默认包仓库)获取的
retry: ^3.0.0
# example_package 包是从 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.com
的 meta。因此,如果将任何包镜像到私有包仓库,通常需要镜像所有依赖项,并更新每个包的 dependencies
部分,或 覆盖默认包仓库 。
发布到自定义包仓库
#要将包发布到自定义包仓库而不是 pub.dev ,请在 pubspec.yaml
中指定 publish_to
属性。如果启用了身份验证,则发布使用与检索包相同的 令牌身份验证 。
要准备将包发布到 https://dart-packages.example.com
,您的 pubspec.yaml
至少应如下所示:
name: example_package
version: 1.0.0
# 确保包发布到 https://dart-packages.example.com
publish_to: https://dart-packages.example.com
然后,要发布新版本的包,请使用 dart pub publish
:
$ dart pub publish
将 example_package 1.0.0 发布到 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 包仓库作为一项服务
#自定义包仓库也作为一项服务提供,并由多个供应商支持令牌身份验证,从而减轻了托管和维护您自己的自定义包仓库的开销:
除非另有说明,否则本网站上的文档反映的是 Dart 3.6.0。页面最后更新于 2025-02-05。 查看源代码 或 报告问题.