Composer のプライベートなリポジトリがあればいいなーと思って Composer のサイトを眺めていたら、思っていたより簡単にできました。ちょっとした社内ライブラリとかの配布を管理するのに便利かもしれません。
ディレクトリ構成
一連の作業をひと通り終えると次のようなディレクトリ構成になります、パスなどは適用に読み替えてください。なお、web/ が http://packages.example.org のドキュメントルートになっているものとします。
/var/www/vhost/composer/
composer.phar
config.json
web/ ← ここが http://packages.example.org のドキュメントルート
index.html
packages.json
satis/*
Composer リポジトリのセットアップ
まずは Composer のリポジトリに必要な packages.json を作成するための、satis というツールをインストールします。
cd /var/www/vhost/composer/
curl -s https://getcomposer.org/installer | php
php composer.phar create-project composer/satis
このコマンドを実行時に Do you want to remove the existing VCS (.git, .svn..) history? [Y,n]?
と聞かれました。
.git や .svn などのディレクトリを削除するかどうかだと思います。とりあえず Y にしておきました。
次に config.json を作成します。これにはパッケージリポジトリの名前やURL、ソースリポジトリや公開するバージョンなどを指定します。
{ "name": "My Repository", "homepage": "http://packages.example.org", "repositories": [ { "type": "vcs", "url": "git@git.example.org:hoge.git" } ], "require-all": true }
"name"
は Composer パッケージリポジトリの名前、"homepage"
はURLです。
これらは最後の手順で作成される index.html に使われているようです。
"repositories"
はライブラリごとにソースリポジトリを指定します。とりあえず Git リポジトリを指定してください(Git リポジトリ以外でも大丈夫なのかどうかはわかりません)。勿論 Git リポジトリ側では Packagist に登録するときと同じように composer.json を作成したりタグを切ったりしておく必要があります。
"require-all": true
を指定すると、Git リポジトリの全ブランチ&タグから composer.json が見つかったものを全てパッケージとして公開するようです。特定のバージョンだけを公開したければ composer.json に書くのと同じように書けばOKのようです。
最後に次のコマンドで packages.json と index.html を作成します。多分 Git リポジトリのブランチやタグを走査してパッケージ情報が作成されます。
php satis/bin/satis build config.json web/
ブラウザで http://packages.example.org にアクセスして、それっぽい画面が表示されれば成功です。
ライブラリを使う側の設定
composer.json は次のような感じで作成します。
{ "repositories": [ { "packagist": false }, { "type": "composer", "url": "http://packages.example.org" } ], "require": { "hoge/hoge": "*" } }
Packagist はいらないので"packagist": false
で除外します(明示的に除外しないとデフォルトで Packagist にパッケージを探しに行ってしまって遅い)
次の行の"type": "composer", "url": "http://packages.example.org"
が、プライベートな Composer リポジトリの設定です。type に composer を、url に packages.json が置いてあるディレクトリを指定します。
後はいつも通りphp composer.phar install
とすれば、プライベートな Composer リポジトリからインストールされます。
問題点
問題点ってほどのものではないですが・・・
installation-source が source にしかならない
ライブラリ側の .git とかが vendor の中に含まれますし、.gitattributes でアーカイブから除外されるファイルも含まれてしまいます。自動的に git archive とかはしてくれないようです。
Git リポジトリが GitLab だと面倒そう
普段使っている Git リポジトリが GitLab なので認証が必須なのです。 まぁ、使いたい全員を GitLab 上のライブラリプロジェクトのメンバーにしておくか、デブロイキーを作って全員に秘密鍵を配布するかしておけば大丈夫ですが、なんだか微妙な気がします。
おまけ
satis は次のようにすれば phar 化出来るようです。
php satis/bin/compile
php satis.phar --help
... いろいろ ...