LoginSignup
20

More than 5 years have passed since last update.

packagistを使わないcomposerのgitリポジトリの作成

Posted at

プロジェクト内の一部のソースをcomposerのライブラリに切り出して、クローズドなgitリポジトリを作ったのでメモ。

ハマったポイントと、わかったことを記載します。

発端

composerのライブラリの作成ってだいたいGitHub+packagistなんで、参考になる記事が少なかった。

特に、今回はGitLabを使っているので余計に少ないのと、自分自身、GitHubもろくに使っていないしcomposerライブラリの作成経験もなかったのでそこそこ苦労した。

先に結論

  1. 新しくライブラリ用のGitリポジトリを作る
  2. composer initなどでcomposer.jsonを作成する。内容はググれば山ほど出てくる
  3. pushする
  4. 使う側のcomposer.jsonのrepositoriesに上記リポジトリを追加する
  5. 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にしたほうがいいと思う。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
20