読者です 読者をやめる 読者になる 読者になる

その手の平は尻もつかめるさ

ギジュツ的な事をメーンで書く予定です

cpanfile はモジュールをインストールする順番を担保するのか問題

cpanfile に

requires 'Acme::Buffy';
requires 'Acme::Anything';                                                                                                                                         
requires 'Acme::Damn';
requires 'Acme::Coro::Suke';
などと記述されていた時に、先に書かれた (つまり上に書かれた) モジュールから先にインストールされるのか?
という疑問が割と散見される感じがありますので、それに関して調べたことおよび実験したことを書いておきます。

結論

いきなり結論ですけれども、インストール順は担保されません
アルファベット順 (辞書順) でインストールされるとかそういう事もありません。

じゃあどうするのか

インストール順序が保証されていなければならない、って何かを間違えている感じがします。
そもそも、モジュールのインストール順序が保証されていなければならない状況って、そう無い感じがするんですが…… *1

しかし、「どうしても!!」という場合もあると思うので、その時にどうすれば良いかと言うと、
バインディングを `requires` ではなくて `recommends` とか `suggests` とかに変更するという方法が考えられます。
`recommends` や `suggests` で指定したモジュールは `requires` で指定したモジュールよりも後にインストールされるという性質があるので、*2
それを悪用して順序関係をゴリッと作ってやればまあ、急場はしのげるかなー感があります。
(ただ、この方法は Module::CPANfile の内部実装に強く依存した方法なので、おすすめできません。どうしても、という時にだけ利用すると良いと思います)

`recommends` とか `suggests` とかで指定したモジュールをインストールする方法は以下あたりを参考して下さい。*3
http://d.hatena.ne.jp/moznion/20130529/1369843419


詳しいこと

https://metacpan.org/release/Module-CPANfile
や、Module::CPANfile のソース等に書かれています。



なにか間違えていましたら、ご指摘お願いします。

*1:あるとすれば、対象モジュールの依存関係が腐れ切っているとかでしょうか

*2:`requires`, `recommends`, `suggests` の順でインストールされます

*3:なお、cpanm 1.7 以降は以下の記事にあるような内容はドキュメント化されるそうです