处理私有包
转自文档:https://getcomposer.org/doc/articles/handling-private-packages.md
私人打包
Private Packagist 是一种商业包托管产品,提供专业支持和基于 Web 的私有和公共包管理,以及精细的访问权限。Private Packagist 为包的 zip 文件提供镜像,这使得安装更快并且独立于第三方系统 - 例如,即使您的 zip 文件被镜像,即使 GitHub 宕机,您也可以进行部署。
Private Packagist 可作为托管 SaaS 解决方案或本地自托管软件包使用,提供交互式设置体验。
Private Packagist 的部分收入用于支付 Composer 和 Packagist.org 开发和托管的费用,因此使用它是在财务上支持这些开源项目维护的好方法。您可以在 Packagist.com 上找到有关如何设置自己的包存档的更多信息。
Satis
另一方面,Satis 是开源的,但只是一个静态 composer
存储库生成器。它有点像超轻量级、基于静态文件的 packagist 版本,可用于托管您公司的私有软件包或您自己的软件包的元数据。您可以使用 Composer 或 Docker 安装它。
例如,假设您有一些想要在整个公司中重用的包,但实际上并不想开源。您首先要定义一个 Satis 配置:一个列出您的精选存储库的 json 文件。
默认文件名为 satis.json但可以是您喜欢的任何名称。
下面是一个示例配置,您可以看到它包含一些 VCS 存储库,但这些存储库可以是任何类型的存储库。然后它使用 “require-all”: true
来选择您定义的存储库中所有软件包的所有版本。
Satis 查找的默认文件satis.json
存储库的根目录中。
{
"name": "my/repository",
"homepage": "http://packages.example.org",
"repositories": [
{ "type": "vcs", "url": "https://github.com/mycompany/privaterepo" },
{ "type": "vcs", "url": "http://svn.example.org/private/repo" },
{ "type": "vcs", "url": "https://github.com/mycompany/privaterepo2" }
],
"require-all": true
}
如果你想挑选你想要的包,你可以在经典编辑器 require
键中列出你想在 satis 仓库中的所有包,使用 “*”
约束来确保所有版本都被选中,或者如果你想要真正特定的版本,则使用另一个约束。
{
"repositories": [
{ "type": "vcs", "url": "https://github.com/mycompany/privaterepo" },
{ "type": "vcs", "url": "http://svn.example.org/private/repo" },
{ "type": "vcs", "url": "https://github.com/mycompany/privaterepo2" }
],
"require": {
"company/package": "*",
"company/package2": "*",
"company/package3": "2.0.0"
}
}
完成此操作后,您将运行:
php bin/satis build <configuration file> <build dir>
当您解决了该进程时,您通常会做的是将此命令作为 cron 作业在服务器上运行。然后它会像 Packagist 一样更新您的所有软件包信息。
请注意,如果您的私有包托管在 GitHub 上,您的服务器应该有一个 ssh 密钥,允许它访问这些包,然后您应该将 --no-interaction
(或 -n
)标志添加到命令中,以确保它回退到 ssh 密钥身份验证,而不是提示输入密码。对于持续集成服务器来说,这也是一个不错的技巧。
设置一个指向该 web/
目录的虚拟主机,假设它是 packages.example.org
。或者,使用 PHP >= 5.4.0,您可以使用内置的 CLI 服务器 php -S localhost:port -t satis-output-dir/
作为临时解决方案。
部分更新#
您可以指示 Satis 有选择地仅更新特定包或仅处理具有给定 URL 的存储库。这减少了重新构建 package.json
文件所需的时间,如果您使用(自定义)webhook 在将代码推送到您的存储库之一时触发重新构建,这将很有帮助。
要仅重新构建特定的包,请在命令行上传递包名称,如下所示:
php bin/satis build satis.json web/ this/package that/other-package
请注意,这仍然需要拉取并扫描您的所有 VCS 仓库,因为任何 VCS 仓库都可能包含(在任何分支上)所选软件包之一。
如果您只想扫描选定的软件包,而不是所有 VCS 仓库,则需要为所有软件包声明一个名称(这仅适用于 VCS 仓库类型):
{
"repositories": [
{ "name": "company/privaterepo", "type": "vcs", "url": "https://github.com/mycompany/privaterepo" },
{ "name": "private/repo", "type": "vcs", "url": "http://svn.example.org/private/repo" },
{ "name": "mycompany/privaterepo2", "type": "vcs", "url": "https://github.com/mycompany/privaterepo2" }
]
}
如果您只想扫描单个存储库并更新其中找到的所有软件包,请将 VCS 存储库 URL 作为可选参数传递:
php bin/satis build --repository-url https://only.my/repo.git satis.json web/
在您的项目中,您现在需要添加的只是使用 packages.example.org
作为 URL 的您自己的 Composer 存储库,然后您可以要求您的私有包,并且一切都应该顺利进行。您不再需要复制每个项目中的所有仓库。只有一个将自我更新的唯一存储库。
{
"repositories": [ { "type": "composer", "url": "http://packages.example.org/" } ],
"require": {
"company/package": "1.2.0",
"company/package2": "1.5.2",
"company/package3": "dev-master"
}
}
安全性#
要保护您的私有存储库,您可以使用客户端证书通过 SSH 或 SSL 托管它。在项目中,您可以使用 options
参数指定服务器的连接选项。
使用 SSH 的自定义存储库的示例(需要 SSH2 PECL 扩展):
{
"repositories": [{
"type": "composer",
"url": "ssh2.sftp://example.org",
"options": {
"ssh2": {
"username": "composer",
"pubkey_file": "/home/composer/.ssh/id_rsa.pub",
"privkey_file": "/home/composer/.ssh/id_rsa"
}
}
}]
}
使用客户端证书的 SSL/TLS (HTTPS) 示例:
{
"repositories": [{
"type": "composer",
"url": "https://example.org",
"options": {
"ssl": {
"local_cert": "/home/composer/.ssl/composer.pem"
}
}
}]
}
使用自定义 HTTP Header 字段进行令牌身份验证的示例:
{
"repositories": [{
"type": "composer",
"url": "https://example.org",
"options": {
"http": {
"header": [
"API-TOKEN: YOUR-API-TOKEN"
]
}
}
}]
}
身份验证#
可以通过多种不同的方式处理身份验证。
当 GitHub、GitLab 或 BitBucket 存储库镜像到您的本地 sat 上时,构建过程将包括这些平台提供的下载位置。这意味着存储库和您的设置取决于这些服务的可用性。
同时,这意味着所有托管在其他地方(在其他服务上或例如 Subversion 中)的代码都无法下载,因此安装通常需要更长的时间。
要使您的 satis 安装能够为所有 (Git、Mercurial 和 Subversion) 包创建下载,请将以下内容添加到您的satis.json
中:
{
"archive": {
"directory": "dist",
"format": "tar",
"prefix-url": "https://amazing.cdn.example.org",
"skip-dev": true
}
}
选项说明#
-
directory
: required, dist 文件的位置(在 output-dir
内)
格式
:可选、zip
(默认)或 tar
prefix-url
:可选、下载位置、主页(从 satis.json
)默认后跟目录
skip-dev
:可选,默认为 false
,启用时 (true
) satis 不会为分支创建下载
absolute-directory
:可选,转储 dist 文件的本地目录,而不是 output-dir
/directory
whitelist
:可选,如果设置为包名列表,satis 将只转储这些包的 dist 文件
blacklist
:可选,如果设置为包名列表,satis 不会转储这些包的 dist 文件
校验和
:可选,默认为 true
,禁用 (false
) 时,Satis 将不会为 dist 文件提供 SHA1 校验和
启用后,所有下载(包括来自 GitHub 和 BitBucket 的下载)都将替换为本地版本。
前缀 url#
如果下载最终位于私有 Amazon S3 存储桶或 CDN 主机上,则为其他主机作为 URL 前缀特别有用。CDN 将大大缩短下载时间,从而大大缩短包安装。
示例:prefix-url
https://my-bucket.s3.amazonaws.com
(且目录
设置为 dist
) 创建下载网址,如下所示: https://my-bucket.s3.amazonaws.com/dist/vendor-package-version-ref.zip
.
Web 输出#
-
output-html
:可选,默认为 true
,禁用 (false
) 时,Satis 将不会生成 output-dir
/index.html 页面。
twig-template
:可选,指向 output-dir
/index.html 页面的个性化 Twig 模板的路径。
废弃的软件包#
要使您的 satis 安装能够指示某些软件包已被放弃,请将以下内容添加到您的 satis.json
:
{
"abandoned": {
"company/package": true,
"company/package2": "company/newpackage"
}
}
true
值表示包确实被放弃,而 “company/newpackage”
值指定包被 company/newpackage
包替换。
请注意,所有在自己的 composer.json
文件中设置为已放弃的软件包也将被标记为已放弃。
解决依赖关系#
可以使 satis 自动解析并为您的项目添加所有依赖项。这可以与 Downloads 功能一起使用,以获得包的完整本地镜像。将以下内容添加到您的satis.json
中:
{
"require-dependencies": true,
"require-dev-dependencies": true
}
在搜索包时,satis 将尝试从列出的存储库中解析所有必需的包。因此,如果您需要 Packagist 的软件包,则需要在 satis.json
中定义它。
仅当 require-dev-dependencies
参数设置为 true 时,才会打包开发依赖项。
其他选项#
-
providers
:可选,默认为 false
,启用时 (true
) 每个包将被转储到一个单独的包含文件中,该文件仅在真正需要包时由 Composer 加载。加快了 composer 对具有大量软件包的存储库(如 f.i. packagist)的处理速度。
output-dir
:可选,定义在调用 build
命令时未作为参数提供时输出存储库文件的位置。
config
:可选,允许您定义 Composer 中的所有配置选项,但 archive-format
和 archive-dir
除外,因为配置是通过 archive 完成的。有关更多详细信息,请参阅有关配置 schema 的文档。
notify-batch
:可选,指定每次用户安装软件包时将调用的 URL。请参阅 notify-batch。