GitHubのプライベートリポジトリに自作パッケージ上げて、それを他のアプリからComposerでインストールして、本番環境へのデプロイまで一応やったのでメモ。

[ Composer 1.9.0 ]

  1. この記事の前提
  2. 手順1. ライブラリを作成
  3. 手順2. GitHubにリリースを作成
  4. 手順3. アプリにリポジトリを追加
  5. 手順4. ComposerにGitHubのアクセストークンを設定
  6. 手順5. アプリにライブラリをインストール
  7. 手順6. アプリを本番環境にデプロイ
  8. ライブラリをバージョンアップした場合

この記事の前提

  • GitHubのユーザー名は napoporitataso とする。
  • 自作パッケージ (以下『ライブラリ』) の名前は napoporitataso/mylib とする。
  • ライブラリをインストールする側のパッケージ (以下『アプリ』) の名前は napoporitataso/myapp とする。

GitHubのユーザー名とライブラリのベンダー名を違うものにできるかどうかは、試してないので分からない。

ライブラリをローカルに置かないでGitHubに上げる理由は、ローカルだとアプリのリリース時にライブラリまで上げなきゃいけなくて面倒くさそうだから。

手順1. ライブラリを作成

ここではこういう雰囲気↓のライブラリを作り、GitHubのプライベートリポジトリにPushしたことにする。

composer.json
{
    "name": "napoporitataso/mylib",
    "description": "すごく電波が出る",
    "authors": [
        ...
    ],
    "require": {
        "php": "^7.1"
    },
    "require-dev": {
        ...
    },
    "autoload": {
        "psr-4": {
            "Napoporitataso\\MyLib\\": "src/"
        }
    }
}

先に注意点を書いておくと、以後アプリからこのライブラリをインストールするには、毎度 GitHubに上げる → GitHubでリリースを作成する → Composerでインストールする という手順を踏む必要がある。

なので、「まだパッケージ開発中だけどちょっとインストールして動作確認してみたい」程度のノリで上げるとGitHubのReleasesがすごい勢いで汚くなる。プライベートリポジトリだから気にする必要は無いだろうけど、ちゃんとライブラリ単体でユニットテストできるようにするべき。

手順2. GitHubにリリースを作成

GitHubにライブラリをPushしたら、リリースを作成する。リリースの作り方はGitHub公式にヘルプがある。

ここでは『Tag version』は 1.0.0 を入力した。これがそのまま、Composerでインストールする時のバージョン番号になる。また、リリースを作成すると、リリース対象として選択したブランチの先頭に『Tag version』と同名のタグが作成される。

なお、『Tag version』の先頭には v を付けてもいいらしい。バージョンごとに 1.0.0 とか v1.1.0 とかちぐはぐでも普通に使えたし、バージョンアップも正常に行えた。

手順3. アプリにリポジトリを追加

ここではこういう雰囲気↓のアプリがあるとして……。

composer.json
{
    "name": "napoporitataso/myapp",
    "description": "my terrible application",
    "authors": [
        ...
    ],
    "require": {
        "php": "^7.1"
    },
    "require-dev": {
        ...
    },
    "autoload": {
        ...
    }
}

このアプリの開発環境にて、以下コマンドを使って composer.jsonrepositories を追加する。

これをすると、このアプリは追加したリポジトリからもパッケージをダウンロードできるようになる。

コマンド
composer config repositories.piyopiyo vcs https://github.com/napoporitataso/mylib
実行後のcomposer.json
{
    "name": "napoporitataso/myapp",
    ...
    "repositories": {
        "piyopiyo": {
            "type": "vcs",
            "url": "https://github.com/napoporitataso/mylib"
        }
    },
}

piyopiyo は別になんでもいい。無難に ベンダー名/パッケージ名 でいいと思うけど、なんでもいいみたいなのでここでは piyopiyo って書いた。

また、この作業はコマンド使わないで composer.json に手動で repositories を書き加えても大丈夫。Composer公式のマニュアルは以下。

手順4. ComposerにGitHubのアクセストークンを設定

ComposerでGitHubのプライベートリポジトリにアクセスするには、GitHubのアクセストークンが必要になる。

GitHubのアクセストークンの発行方法はGitHub公式のヘルプに書いてあるので、以下の通りに発行してくる。スコープは『repo』をONにすること。

アクセストークンを用意したら、アプリの開発環境で以下コマンドを実行する。

composer config github-oauth.github.com アクセストークン

するとアプリ内に auth.json というファイルが作成され、ここにアクセストークンが記録される。auth.json の中身は以下のようになっている。

auth.json
{
    "github-oauth": {
        "github.com": "アクセストークン"
    }
}

これで、このアプリが使用するComposerからプライベートリポジトリにアクセスできるようになった。


補足しておくと…

もしアクセストークンを設定せずに composer require napoporitataso/mylib した場合、例えば開発環境がWindows10なら、以下のようなメッセージが表示される。

Your GitHub credentials are required to fetch private repository metadata (https://github.com/napoporitataso/mylib)
Head to https://github.com/settings/tokens/new?scopes=repo&description=Composer+on+XXXXXXXXXXX+2019-08-14+0257
to retrieve a token. It will be stored in "C:/Users/napoporitataso/AppData/Roaming/Composer/auth.json" for future use by Composer.
Token (hidden):

ここで訊かれたとおりにアクセストークンを入力しても、ライブラリをインストールすることはできる。また、この時自動で auth.json も作成される。

ただしこの時自動で作成してくれる auth.json の場所は、アプリ内じゃなくて『ユーザーのComposer設定置き場 (※)』の下になる。つまりアプリのローカル設定じゃなくて、グローバル設定扱いになってしまう。

※ユーザーのComposer設定置き場は、Windows10なら %APPDATA%\Roaming\Composer、Ubuntu18なら ~/.composer 以下。

よってグローバル設定を汚したくない場合は、上記のコマンドまたは手動で auth.json ファイルをアプリ以下に作成するのがいいので、ここではそちらを採用した。

とはいえアプリごとに設定するの面倒だし、アプリ内に auth.json が作成される方がよっぽど汚いし、グローバルに設定したいよという場合は、以下コマンドでグローバルに auth.json を作成することもできる。(というか普通に調べたら、こっちの方が先に出てきた。)

composer config --global github-oauth.github.com アクセストークン

手順5. アプリにライブラリをインストール

アクセストークンを設定したら、開発環境のアプリで以下コマンド実行して、napoporitataso/mylib の最新バージョン (1.0.0) をインストールする。

コマンド
composer require napoporitataso/mylib
実行後のcomposer.json
{
    "name": "napoporitataso/myapp",
    ...
    "require": {
        "php": "^7.1",
        "napoporitataso/mylib": "^1.0"
    },
    ...
}

ライブラリをインストールすると、composer.lock ファイルにインストール時の情報が追記されたり、オートローダーが更新されたりする。

以後、アプリ内で napoporitataso/mylib のコードを使用できるようになるので、それを使ってアプリを開発する。

手順6. アプリを本番環境にデプロイ

アプリが完成してテストも終わったら、本番環境にデプロイする。

本番環境に composer.json composer.lock auth.json を含むアプリのソースコードをアップロードして、アプリのディレクトリで composer install するだけでOK。本番環境にも napoporitataso/mylib がインストールされる。

ライブラリをバージョンアップした場合

ライブラリの方で新しくリリース (1.0.1とか) を作成した場合は、開発環境のアプリで以下コマンド実行し、ライブラリをバージョンアップする。

composer update napoporitataso/mylib

完了すると、composer.json composer.lock が新しいバージョンで更新される。この状態でテストし、大丈夫だったらまた同じように本番環境にデプロイする。