プロジェクト内の一部のソースをcomposerのライブラリに切り出して、クローズドなgitリポジトリを作ったのでメモ。
ハマったポイントと、わかったことを記載します。
発端
composerのライブラリの作成ってだいたいGitHub+packagistなんで、参考になる記事が少なかった。
特に、今回はGitLabを使っているので余計に少ないのと、自分自身、GitHubもろくに使っていないしcomposerライブラリの作成経験もなかったのでそこそこ苦労した。
先に結論
- 新しくライブラリ用のGitリポジトリを作る
-
composer init
などでcomposer.jsonを作成する。内容はググれば山ほど出てくる - pushする
- 使う側のcomposer.jsonの
repositories
に上記リポジトリを追加する -
require(-dev)
で、2で作ったパッケージ名(name)を指定する
必要なのはこれだけ。
あとは接続用にSSHの公開鍵なんかを準備したらそれで完了。
わからなかったことなど
どうすればcomposerからインストールが可能なリポジトリとなるのか
使う側は、composer.jsonにrepositoriesを追加すれば、packagistに登録しない(できない)状態でもそのリポジトリをcomposerは検索してくれる
{
"repositories": [
{
"type": "vcs",
"url": "git@gitlab.example.com:foo/bar.git"
}
],
}
通常、composerは"require", "require-dev"に記載したパッケージをpackagistに検索しに行くが、
"repositories"に追加されたリポジトリがある場合、そのリポジトリにも探しに行く。
この際、リポジトリのディレクトリにcomposer.jsonが存在し"name"が設定されている場合、composerはライブラリとして認識する。
全てのプロジェクトはパッケージである
composer.jsonをディレクトリに配置した時点で、そのディレクトリはパッケージとなります。
packagistを使わない場合、composer/satisを使う必要があるの?
packagistを使わない場合に、composer/satisを使うと良いみたいな記事を見たので、最初satisを使う必要があるのかと思い迷走したが、satisは自作のpackagistを作るようなものなので、単に"repositories"にリポジトリを追加する形でライブラリを作成する場合は必要ない。
当然、packages.jsonなんかも必要ない。
逆に、あまりにクローズドのライブラリが増えて、"repositories"に追加するのが大変になったりしたら、satisを使ったほうが楽。
あと、packagistのミラーを作ったりもできるみたい。 たのしそう。
そんなパッケージが無いとエラーがでる
そもそも、上記のようにsatisが必要なんじゃないかまで迷走したのは、
composer.jsonを設置したリポジトリを準備しても、そんなパッケージ無いよとエラーが出ていたからだった。
Your requirements could not be resolved to an installable set of packages.
Problem 1
- The requested package foo/bae could not be found in any version, there may be a typo in the package name.
原因はtypoでした…。
接続エラーがでていないなら、パッケージ名をよく確認しましょう…。
尚、composer.json
がない場合は、パッケージが無いじゃなくて以下のようになります。
[Composer\Repository\InvalidRepositoryException]
No valid composer.json was found in any branch or tag of git@gitlab.example.com:foo/bar.git, could not load a package from it.
GitLabへのhttp+BASIC認証の接続がうまくいかない
恐らく、type:vcs(git)の場合、httpで接続するのは得策ではない。
- .netrcにユーザー名・パスワードを記載する方法はうまく動作しなかった。環境によるものか、composerからやった場合にうまくいかないのかは未検証
-
auth.json
を使う方法も、何故か動作しなかった。httpだったから?これも未検証 - そもそも、公式には以下のように書いている
Exactly the same solution allows you to work with your private repositories at GitHub and BitBucket:
The only requirement is the installation of SSH keys for a git client.https://getcomposer.org/doc/05-repositories.md#using-private-repositories
git client用にSSH keysを準備することだけが要件だよ!
…なんて書いてるくらいなので、もうおとなしくSSHにしたほうがいいと思う。