GitHubのプライベートリポジトリに自作パッケージ上げてComposerでインストールする
GitHubのプライベートリポジトリに自作パッケージ上げて、それを他のアプリからComposerでインストールして、本番環境へのデプロイまで一応やったのでメモ。
この記事の前提
- GitHubのユーザー名は napoporitataso とする。
- 自作パッケージ (以下『ライブラリ』) の名前は
napoporitataso/mylib
とする。 - ライブラリをインストールする側のパッケージ (以下『アプリ』) の名前は
napoporitataso/myapp
とする。
GitHubのユーザー名とライブラリのベンダー名を違うものにできるかどうかは、試してないので分からない。
ライブラリをローカルに置かないでGitHubに上げる理由は、ローカルだとアプリのリリース時にライブラリまで上げなきゃいけなくて面倒くさそうだから。
手順1. ライブラリを作成
ここではこういう雰囲気↓のライブラリを作り、GitHubのプライベートリポジトリにPushしたことにする。
{
"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. アプリにリポジトリを追加
ここではこういう雰囲気↓のアプリがあるとして……。
{
"name": "napoporitataso/myapp",
"description": "my terrible application",
"authors": [
...
],
"require": {
"php": "^7.1"
},
"require-dev": {
...
},
"autoload": {
...
}
}
このアプリの開発環境にて、以下コマンドを使って composer.json
に repositories
を追加する。
これをすると、このアプリは追加したリポジトリからもパッケージをダウンロードできるようになる。
composer config repositories.piyopiyo vcs https://github.com/napoporitataso/mylib
{
"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にすること。
コマンドライン用の個人アクセストークンを作成する - GitHub ヘルプ
アクセストークンを用意したら、アプリの開発環境で以下コマンドを実行する。
composer config github-oauth.github.com アクセストークン
するとアプリ内に 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
{
"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
が新しいバージョンで更新される。この状態でテストし、大丈夫だったらまた同じように本番環境にデプロイする。