composer.pharのpharって何?調べてみました!
2020年10月現在、Composer2.0が世間を賑わせています。
PHP開発者としてComposerさんにはお世話にならない日がない毎日ですが、composer.pharのphar
って何?とふと気になったのでこの機会に調べてみました!
Pharとは
公式ドキュメントを読みます。
Phar アーカイブは Java の JAR アーカイブと似た概念のものですが、 PHP アプリケーションで使用する際に必要な機能をより柔軟に使用できるよう改良しています。 Phar アーカイブを使用すると、PHP アプリケーションやライブラリを ひとつのファイルにまとめて配布できるようになります。 Phar アーカイブ形式のアプリケーションは、その他の PHP アプリケーションとまったく同様に扱えます。
なるほど。JARもあまりピンときてないですが、要するにTarやZipのように複数のファイルを1つのファイルにまとめられるもののようです。
複数のPHPファイルを1つの実行可能なPHPファイルとして固められる認識をしました。
(もし間違っていたりもっと適切な説明があればマサカリをお願いしたいです。)
使い方を調べる
さっそく作成してみたいと思うので、さらに公式ドキュメントを読みます。
そのうちにきちんと書きます。今のところは、とりあえず Phar アーカイブの使用法 を読んでおいてください。
はい。今のところはとりあえずPhar アーカイブの使用法を読んでみたのですが、Phar
について初めて調べてみた人間を対象に書かれている感じがしない内容だったので、一旦逃げの姿勢で簡易的に触れ合えそうなライブラリを探します。
phar-composerというものがあるようなので、これを使ってみます。
Composer管理されているプロジェクトからpharを作成できるライブラリのようです。
導入
適当なプロジェクトを作ってインストールします。
composer require --dev clue/phar-composer
composer.json
{
"name": "docker-composer/docker-composer",
"require": {},
"autoload": {
"psr-4": {
"DockerComposer\\": "src"
}
},
"require-dev": {
"clue/phar-composer": "^1.1"
},
"bin": [
"bin/main.php"
]
}
作成
複数のファイルを書かなければpharる意味がないので無理やり複数のファイルを書きます。
src/DockerComposer.php
<?php
declare(strict_types=1);
namespace DockerComposer;
class DockerComposer
{
/**
* @return string
*/
public function message(): string
{
return 'Did you mean docker-compose ?';
}
}
bin/main.php
<?php
declare(strict_types=1);
require_once __DIR__ . '/../vendor/autoload.php';
$dockerComposer = new \DockerComposer\DockerComposer();
echo $dockerComposer->message() . "\n";
はい。くだらないですが一応できました。
php ./bin/main.php
で実行して念の為動くことを確かめておき、phar-composerでビルド します。
./vendor/bin/phar-composer build ./
OK - Creating docker-composer.phar (2630 KiB) completed after 0.6s
出来たようです。念願のpharが作れました。(ファイルでかくない?)
特に意味はないですが実行権限を与えてPATHの通った場所に配置します。
mv docker-composer.phar /usr/local/bin/docker-composer
実行!
~ # docker-composer
Did you mean docker-compose ?
やりましたね!よくあるtypoを指摘してくれるようになりました。
当然PHPが入ってない環境では動きませんが、Composerプロジェクトから1つの実行ファイルを作成できるのは使い方によっては便利かもしれませんね。
シェルスクリプト代わりにPHPで書きたくなった場面などでの助けになるような気がするので、機会があればまた使ってみたいと思います。
本日は以上です。