使用satis搭建私有Composer库

人类的本质是复读机。

最近整理项目,将一些复用的轮子封装成Composer组件,但不便于放在packgist.org,所以需要搭建私有的Composer库。

开发composer组件

以之前的一遍文章 Laravel/Lumen 扩展DB Builder语法 的功能为例。

image

在组件项目(这里称为A项目)根目录创建composer.json

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
{
"name": "xuyang/laravel-builder-ext",
"type": "library",
"description": "扩展Laravel DB Builder的查询语法",
"keywords": ["laravel", "db", "builder", "extend"],
"license": "MIT",
"authors": [
{
"name": "cloudycity",
"email": "cloudycity@foxmail.com"
}
],
"minimum-stability": "dev",
"require": {
"php": ">=5.4.0",
"laravel/framework" : "^5.2"
},
"require-dev": {
"phpunit/phpunit": "4.*"
},
"autoload": {
"psr-4": { "Xuyang\\LaravelBuilderExt\\": "src/" }
},
"extra": {
"branch-alias": {
"dev-master": "1.0.0-dev"
}
}
}

最后传上gitlab

搭建satis并索引组件

安装satis

使用composer (方法一)

1
2
$ cd /data/www/
$ composer create-project composer/satis --keep-vcs

image

使用docker (方法二)

1
$ docker pull composer/satis

配置satis

进入到satis项目根目录下创建satis.json

1
2
3
4
5
6
7
8
9
10
{
"name": "私有Composer库",
"homepage": "http://satis.example.com",
"repositories": [
{ "type": "git", "url": "ssh://git@gitlab.example.com/sub/laravel-builder-ext.git" }
],
"require": {
"company/package": "dev-master"
}
}

创建索引

使用composer (方法一)

1
$ php bin/satis build satis.json ./web-v

image

这里的web就是索引输出目录。

使用docker (方法二)

1
$ docker run --rm -it -v /build:/build composer/satis

自动索引

最简单粗暴的方法是用crontab,但这里推荐使用GitLab Web Hook:

  1. 在satis项目创建一个接口执行创建索引的操作。

image

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php

$valid_token = '3.1415926535857'; // GitLab web hook的token
$valid_ip = ['127.0.0.1']; // GitLab服务器IP

$client_token = $_SERVER['HTTP_X_GITLAB_TOKEN'];
$client_ip = $_SERVER['REMOTE_ADDR'];

if ($client_token !== $valid_token) die('Token mismatch!');
if (!in_array($client_ip, $valid_ip)) die('Ip mismatch!');

$ouptut = [];
exec("cd /data/www/satis/; php bin/satis build satis.json ./web -v 2>&1", $output); // 创建索引的命令
var_dump($output);
  1. 在组件的GitLab仓库中增加Web Hook

image

每次组件推送新提交之后都会触发钩子请求satis创建索引。

配置Nginx (可选)

satis.json中的homepage指向索引输出目录,然后就可以访问satis的界面。

image

添加部署密钥 (可选)

如果satis所在机器没有权限拉取gitlab仓库,需要生成key并加入到gitlabDeploy Keys(只读)中。

image

从satis引入composer组件

修改使用A项目组件的项目(这里称B项目)的composer.json,加上私有库源:

1
2
3
4
5
6
7
8
9
10
    ...
"config": {
"preferred-install": "dist",
"secure-http": false
},
"repositories": [{
"type": "composer",
"url": "http://satis.example.com"
}]
}

"secure-http": false是可选项,当你的私有库地址不支持https时才需要加上。

然后正常引入即可:

image

image

References

使用satis自建私有镜像