tag:crieit.net,2005:https://crieit.net/users/stk2k/feed
stk2kの投稿 - Crieit
Crieitでユーザーstk2kによる最近の投稿
2021-06-14T04:20:03+09:00
https://crieit.net/users/stk2k/feed
tag:crieit.net,2005:PublicArticle/17397
2021-06-14T04:20:03+09:00
2021-06-14T04:20:03+09:00
https://crieit.net/posts/Composer-classmap
[Composer] classmapの使い方
<h1 id="composerとは"><a href="#composer%E3%81%A8%E3%81%AF">composerとは</a></h1>
<p>いわずもがな、PHPの標準と言ってもいいパッケージ管理ツールです。インストール方法や使い方はこちらを参照してください。</p>
<p><a target="_blank" rel="nofollow noopener" href="https://weblabo.oscasierra.net/php-composer-1/">PHPのライブラリ管理ツール「Composer」入門</a><br />
<a target="_blank" rel="nofollow noopener" href="https://qiita.com/atwata/items/d6f1cf95ce96ebe58010">composerとは</a></p>
<h1 id="こういう人向けの記事です"><a href="#%E3%81%93%E3%81%86%E3%81%84%E3%81%86%E4%BA%BA%E5%90%91%E3%81%91%E3%81%AE%E8%A8%98%E4%BA%8B%E3%81%A7%E3%81%99">こういう人向けの記事です</a></h1>
<p>composer.jsonを書いてライブラリ等を公開したい人向け。利用するだけの人はあまり関係ないかも。</p>
<h1 id="classmapが分からなかった"><a href="#classmap%E3%81%8C%E5%88%86%E3%81%8B%E3%82%89%E3%81%AA%E3%81%8B%E3%81%A3%E3%81%9F">classmapが分からなかった</a></h1>
<p>composerにクラスマップ作ってくれそうな機能ないかなと思って探したらあった。でも使い方がいまいちわからなかったので調査。</p>
<h1 id="classmapの書式"><a href="#classmap%E3%81%AE%E6%9B%B8%E5%BC%8F">classmapの書式</a></h1>
<pre><code class="json">{
"autoload":{
"classmap": ["src/", "something.php"]
}
}
</code></pre>
<h1 id="試しにクラスを置いてみる"><a href="#%E8%A9%A6%E3%81%97%E3%81%AB%E3%82%AF%E3%83%A9%E3%82%B9%E3%82%92%E7%BD%AE%E3%81%84%E3%81%A6%E3%81%BF%E3%82%8B">試しにクラスを置いてみる</a></h1>
<pre><code class="cmd">--- proj_root
├ src
│ ├ MyClassA.php
│ └ MyClassB.php
└ MyClassC.php
</code></pre>
<p>各クラスの中身はこんな感じ。</p>
<pre><code class="php"><?php
class MyClassA {}
</code></pre>
<p>composer.jsonはこんな感じ。</p>
<pre><code class="json">{
...(省略)...
"autoload":{
"classmap": ["src/", "MyClassC.php"]
}
}
</code></pre>
<p>以下のコマンド実行するとオートローダーのクラスマップが生成されます。</p>
<pre><code class="cmd">composer update
</code></pre>
<p>オートローダーのクラスマップ出力先はvendor/composerディレクトリ以下の「autoload_classmap.php」です。</p>
<pre><code class="cmd">-vendor
└ composer
├ autoload_classmap.php
└ ...
</code></pre>
<p>このファイルの中身はコマンド実行後以下のようになっています。</p>
<pre><code class="php"><?php
...(省略)...
return array(
...
'MyClassA' => $baseDir . '/src/MyClassA.php',
'MyClassB' => $baseDir . '/src/MyClassB.php',
'MyClassC' => $baseDir . '/MyClassC.php',
);
</code></pre>
<p>$baseDirの中身はプロジェクトのルートディレクトリになります。つまり、クラス名からクラスファイルへのマップ配列(クラスマップ)が設定されたことになります。</p>
<h1 id="classmapはコマンド実行時に生成される固定マップである"><a href="#classmap%E3%81%AF%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E5%AE%9F%E8%A1%8C%E6%99%82%E3%81%AB%E7%94%9F%E6%88%90%E3%81%95%E3%82%8C%E3%82%8B%E5%9B%BA%E5%AE%9A%E3%83%9E%E3%83%83%E3%83%97%E3%81%A7%E3%81%82%E3%82%8B">classmapはコマンド実行時に生成される固定マップである</a></h1>
<p>クラスマップは対象ディレクトリへクラスファイルを配置した後、composer updateする必要があることがわかります。つまり動的ではありません。</p>
<p>コマンドライブラリやプラグインライブラリのような実行時にならないとクラスファイルが確定しないライブラリの場合上記composerクラスマップでは対応できません。もしくはクラスファイルを配置後、毎回composer updateを実行する必要があるでしょう。</p>
<p>そのような場合は別途自前のクラスローダーを実装するとよいでしょう。</p>
<p>以上、composerのclassmapについてのメモでした。</p>
stk2k