为自己的私有接口封装了一个私有库,想要能够 composer 安装,方便在多个项目使用。
直接发布到 packagist 不合适。一个方案是搭建私有的 packagist,参考 packagist.com。但这样又太大工程了,杀鸡用牛刀。
我在之前就已经用 gitea 搭建了自己的私有 git 仓库,所以我的想法是 composer require/install/update 能够从我的私有仓库拉取最新版本,然后安装。
google 了一下,composer 本身是支持本地安装的,参考:https://getcomposer.org/doc/05-repositories.md#path
配置如下:
...
├── apps
│ └── my-app
│ └── composer.json
├── packages
│ └── my-package
│ └── composer.json
...
{
"repositories": [
{
"type": "path",
"url": "../../packages/my-package"
}
],
"require": {
"my/package": "*"
}
}
然后容易想到,手动从仓库下载包下来,解压到一个目录,配置一下 composer.json 就好了。但能不能更自动化一点呢?把这个操作自动完成呢?
联想到 composer 有一些 hook ,可以在运行的各个阶段自定义一些命令,哈!于是:
{
"require":{
"xxx":"*" // xxx 你自己的包
}
"scripts": {
"pre-install-cmd": [
"rm -rf ./packages/xxx && git clone --depth=1 ssh://xxx.git ./packages/xxx && rm -rf ./packages/xxx/.git",
"composer config repositories.xxx path ./packages/xxx"
],
"pre-update-cmd": [
"rm -rf ./packages/xxx && git clone --depth=1 ssh://xxx.git ./packages/xxx && rm -rf ./packages/xxx/.git",
"composer config repositories.xxx path ./packages/xxx"
],
}
}
上面配置在 composer.json 的 scripts 里。其作用是:
在安装之前,删除 packages 下对应名称的私有包(否则git报错:目录不为空),git clone 下载包,删掉 .git 去掉版本管理。然后 composer config 仓库使用下载下来的包的路径。
完美!
🐶