使用 docker 下载一个官方的 composer 镜像. 执行 docker pull composer
启动并进入镜像
docker run -it --name php-gist-migrate --volume /data/srv/composer-app:/app composer /bin/bash
先设置为国内的镜像
composer config -g repo.packagist composer <https://packagist.phpcomposer.com>
# 解除镜像并恢复到 packagist
# composer config -g --unset repos.packagist
运行 composer 的自带建项目功能, 执行如下脚本
composer create-project composer/satis php-gist --stability=dev --keep-vcs
它下载了 satis 用于构建一个私有仓库,它通过扫描gitlab上的版本库信息建立仓库索引,并将索引提供给composer客户端获取。
代码最终依旧是客户端直接向gitlab下载的,相关的权限验证依旧由gitlab把控。
在satis目录下放置一个satis.json配置文件,在其中罗列所有gitlab上希望发布的包信息
{
"name": "Private Repository",
"homepage": "<http://packagist.baidu.com>",
"repositories": [
{
"type": "git",
"url": "<https://gitlab-team.baidu.com/baidu/php-common>"
}
],
"require": {
"baidu/common": "*"
}
}
千万不要使用require-all选项,而是应该在require中罗列每个包(require-all的意思是将官方仓库的所有包索引到本地)。
在这个过程中配置到相应的访问 gitlab 的 ssh key
在 satis 根目录下执行如下语句
php bin/satis build satis.json ./web
将会自动构建出对应的 web 资源, 然后我们在 nginx 上指定该路径即可.
server {
listen 80;
server_name <your gist domain>;
index index.html index.php;
root /data/srv/composer-app/php-gist/web; # 前文docker挂载的目录
}
到这里就可以访问到对应网页了.
在前面我们只是手动获取了当前 gitlab 上的项目, 但是当 gitlab 上有版本变化时, 就需要去更新仓库索引信息.
我们需要定时让satis扫描gitlab上的版本变化, 只需要将下面的任务添加到 crontab 中即可
*/15 * * * * flock -xn /var/run/satis.lock -c '/usr/local/bin/php /app/php-gist/bin/satis build /app/php-gist/satis.json /app/php-gist/web'
该命令可以防止并发执行多个satis,同时会将构建好的静态索引文件存储到web目录。
注意, composer
该镜像基于 简化版 alpine
, 所以安装包要使用 apk add
命令
我们需要手动启动 cron 服务, 进入镜像之后执行
/usr/sbin/crond -f -l 8
然后按 ctrl + p, ctrl + q
退出镜像
satis会自动识别gitlab上的分支与tag。
作为tag发布的版本均被composer视为stable稳定版本,例如1.0.0,1.0.1的tag会被Composer索引为1.0.0与1.0.1。
在普通分支中的代码是非stable(非稳定)版本,composer会在索引时在它们的分支名前增加dev-前缀,例如master分支的composer版本为dev-master。
我们总是应该依赖stable版本,而不是依赖一个开发中的dev-master版本。