为什么要搭建私有 composer 软件库
composer 是 PHP 开发处理代码库依赖关系的标准,但是由于需要访问 packagist.org 和 github.com 获取依赖库信息和下载代码,国内使用的速度很慢,导致 composer 的代码库下载和更新成了 PHP 项目迈向自动化测试和部署路上极大的障碍。
为了提高国内 composer 软件库的下载速度,有热心的朋友搭建了网站——https://pkg.phpcomposer.com/ ,镜像了 packagist.org 的内容,提升了 composer 安装依赖库的速度。但是对于自动化测试和部署环境来说,还是要一遍遍地下载文件,仍然会浪费不少时间。
同时,公司内部会有私有软件库,不适合放到 github.com 开源。这些软件库如果需要被公司内多个项目共用,同时处理好版本和依赖问题,就有使用 composer 管理的需要。
提高 composer 安装依赖软件库的速度、管理公司私有软件库,这些需求一起,促使我们要搭建私有的 composer 软件库。
如何使用 satis 搭建 composer 软件库
搭建 composer 软件库,首先最好更深入地熟悉 composer 的功能,推荐通读一遍 composer 的官方文档:https://getcomposer.org/doc/,特别要理解 composer 如何决定应该安装哪个版本的软件库,决定到哪里下载,推荐文档中 Repository 和 Schema 两个部分。
简单来讲,composer 根据 composer.json 文件完成依赖的软件包下载包含以下几步:
- 根据 repositories 字段的数组中定义的软件库,依次访问这些软件库,获得所有可以下载的软件包的名字、版本、下载路径信息。
- 根据 require 和 require-dev 中定义的所需的软件包名字和版本范围(以及这些软件包依赖的软件包的软件包名字和范本范围),确定需要下载的每个软件包的具体版本。
- 从第一步获取的数据中,根据软件包和对应版本,找到下载路径,完成下载。
以上第一步获取软件包信息默认从 packagist.org 获取,第三部下载软件包一般从 github.com 下载,这两部就是国内使用 composer 速度慢的症结,也就是本文搭建私人 composer 库的内容。
这个轮子 composer 核心团队已经为我们做好了,也即标题中所说的 satis 项目 https://github.com/composer/satis,你可以参考这篇文章:https://getcomposer.org/doc/articles/handling-private-packages-with-satis.md。下文对其中的一些细节和可能踩的坑做补充说明。
只下载需要的软件包,避免下载所有
在开头的示例中,satis 的 json 配置文件包含 require-all: true
,表示下载 repositories 里自定义软件库的所有版本的软件包。如果你没有定义 repositories,repositories 默认为 packagist.org 中的所有软件包。这样你的 build 过程会没完没了,所以一定要记得去掉 require-all: true
一行,而是和普通的 composer.json 一样,添加 require 字段,写上实际需要的具体软件包的名字和版本范围。
设置下载软件包代码到本地
如果需要将软件包下载到本地,需要添加 archive
一段,否则将会只下载软件包信息。
一段 satis 的配置示例
{
"name": "flarum repos",
"homepage": "http://packages.example.org",
"require": {
"flarum/core": "^0.1.0-beta.8",
"flarum/approval": "^0.1.0",
"flarum/auth-facebook": "^0.1.0",
"flarum/auth-github": "^0.1.0",
"flarum/auth-twitter": "^0.1.0",
"flarum/bbcode": "^0.1.0",
"flarum/emoji": "^0.1.0",
"flarum/lang-english": "^0.1.0",
"flarum/flags": "^0.1.0",
"flarum/likes": "^0.1.0",
"flarum/lock": "^0.1.0",
"flarum/markdown": "^0.1.0",
"flarum/mentions": "^0.1.0",
"flarum/pusher": "^0.1.0",
"flarum/statistics": "^0.1.0",
"flarum/sticky": "^0.1.0",
"flarum/subscriptions": "^0.1.0",
"flarum/suspend": "^0.1.0",
"flarum/tags": "^0.1.0"
},
"require-dependencies": true,
"require-dev-dependencies": true,
"archive": {
"directory": "dist",
"skip-dev": true
}
}
如何使用 satis 下载好的 composer 库
satis 下载的实际只是一些静态文件,而 composer 需要的是可访问的网页地址。所以我们需要将 satis 下载并构建的目录放到 apache 或者 nginx 目录下,可以通过浏览器访问到。之后作为 composer 类型的 repo 加入 composer.json 中的 repositories 段中。