プライベートな Composer リポジトリを作成する

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
... いろいろ ...

参考