composer install したライブラリが、git でサブモジュール扱いされてハマる
Posted by admin at 18:59 日時 2016/07/03
PHPで開発する際、composer を皆さんお使いだと思いますが、composer で管理しているライブラリが git のサブモジュールとして認識されてしまい、エラーが表示される事態に。
No submodule mapping found in .gitmodules for path ...
確認してみると、確かに該当のディレクトリがサブモジュールとなっていて、git リポジトリにその内容物が含まれていません。このリポジトリをチェックアウトしてもファイルが空っぽになってしまいます。
普段 composer を使っていても、こういうことは起こらないので、おそらくこんな風に Packagist に登録されていないリポジトリを指定する場合に限られるのではないかと。
{
"require": {
"league/csv": "^8.1",
"openpear/stream_filter_mbstring": "dev-master"
},
"repositories": [
{
"type": "vcs",
"url": "git@github.com:xcezx/Stream_Filter_Mbstring.git"
}
]
}
今回使った composer.json
んで、いろいろ試したので正確な手順は分からないですが、この辺りの記事を参考に復旧。
packages ディレクトリ内に vendor ディレクトリがあるのは、concrete5 のアドオンとして開発しているからで、深い意味はありません。
$ git rm --cached -r packages/foo/vendor/bar/
$ rm -rf packages/foo/vendor/bar/baz/.git/
$ git add packages/foo/vendor/bar/
根本的な対策は、公式に書いてありました。
Should I commit the dependencies in my vendor directory?
そもそも論としては、vendor ディレクトリをリポジトリに含めるな、ということです。それはその通りなのですが、私のように concrete5 のアドオンだったり WordPress のプラグイン内で使うライブラリを読み込んでいる場合、プロジェクト内には composer install できない人も混じっていたりして、諸事情によりコミットせざるを得ない場合もあります。
で、そうい場合は .gitignore に /vendor/**/.git を追加せよ、と書いてあります。
さらに、私のようにサブディレクトリ内にある場合を考慮して、今後は .gitignore に vendor/**/.git (先頭に / なし)を追加することにします。
いやはや。しょうもないことで時間をつかいました。