Composer 再入門(その2:スクリプト)

2021/03/19

前回、「Composer 再入門」の続きです。今回はスクリプトについてです。

スクリプトとは?

composer.json にスクリプトを定義しておくと、Composer からそのスクリプトを実行できます。 特定の定型処理などをまとめておきたいという場合に、登録しておくと便利です。

スクリプトを登録する

composer.json ファイルの "scripts" 項目として記載することで登録することができます。 スクリプトは、文字列(単一のスクリプトの場合のみ)または、配列(単一または複数のスクリプトの場合)のいずれかで定義できます。 配列で指定した場合は、その配列に定義した順番で実行されます。

composer.json
{
	"name": "hoge/hoge",
	"require": {
		"monolog/monolog": "^2.2"
	},
	"scripts": {
		"hello": "echo Hello"
	}
}

スクリプトを手動実行する

登録したスクリプトは、run-script コマンドで実行することができます。 run-script コマンドには、エイリアス(別名) run コマンドがあります。

php composer.phar run-script hello
出力内容
> echo Hello
Hello

Composer のコマンドと異なるスクリプト名の場合は、run-script(もしくは run)を省略し、Composer のコマンドのように実行することができます。

php composer.phar hello
出力内容
> echo Hello
Hello

Composer で発生するイベントでスクリプトを自動実行する

Composer では発生するイベントと同じ名前でスクリプトを登録すると、そのイベントが発生した際に登録したスクリプトが自動で実行されます。 イベントは数が多いので、ここでは代表的なイベントのみ記載しておきます。 詳しくは公式サイトをご覧ください。

イベント名 発生するタイミング
pre-install-cmd install コマンドの実行前
post-install-cmd install コマンドの実行後
pre-update-cmd update コマンドの実行前 もしくは、composer.lock ファイルが無い状態で install コマンドの実行前
post-update-cmd update コマンドの実行後 もしくは、composer.lock ファイルが無い状態で install コマンドの実行後
pre-autoload-dump install / update コマンド、もしくは dump-autoload コマンドで、オートローダーが作成される前
post-autoload-dump install / update コマンド、もしくは dump-autoload コマンドで、オートローダーが作成された後
composer.json
{
	"name": "hoge/hoge",
	"require": {
		"monolog/monolog": "^2.2"
	},
	"scripts": {
		"pre-install-cmd": "echo pre-install",
		"post-install-cmd": "echo post-install"
	}
}

vendor/bin のバイナリを実行する

パッケージの中には、インストール時に vendor/bin ディレクトリにバイナリを配置するものもあります。 vendor/bin ディレクトリは、Composer でスクリプトを実行した際に、パスが解決されます。 そのため、vendor/bin ディレクトリにあるバイナリを composer.json の scripts から指定することができます。

下記の例では、test スクリプトを実行すると、vendor/bin/phpunit が実行されます。

composer.json
{
	"name": "hoge/hoge",
	"require-dev": {
		"phpunit/phpunit": "^9.5"
	},
	"scripts": {
		"test": "phpunit"
	}
}

別のスクリプトを参照する

スクリプト名の前に @ を付けることで、スクリプトから別のスクリプトを呼び出すことができます。 スクリプトの再利用を可能にし、重複を避けることができます。

下記の例では、helloworld スクリプトを実行すると、hello スクリプトと、world スクリプトが順番に実行されます。

composer.json
{
	"name": "hoge/hoge",
	"require-dev": {
		"phpunit/phpunit": "^9.5"
	},
	"scripts": {
		"helloworld": [
			"@hello",
			"@world"
		],
		"hello": "echo Hello",
		"world": "echo world"
	}
}
出力内容
> echo Hello
Hello
> echo world
world

Composer コマンドの呼び出し

スクリプトで、Composer コマンドを呼び出すには、@composer と記述します。

composer.json
{
	"name": "hoge/hoge",
	"require-dev": {
		"phpunit/phpunit": "^9.5"
	},
	"scripts": {
		"test": [
			"@composer install",
			"phpunit"
		]
	}
}

PHPの実行

スクリプトで、PHPを実行するには、@php と記述します。

composer.json
{
	"name": "hoge/hoge",
	"require-dev": {
		"phpunit/phpunit": "^9.5"
	},
	"scripts": {
		"test": [
			"@php script.php",
			"phpunit"
		]
	}
}

環境変数の設定

スクリプトで、環境変数を設定するには、@putenv と記述します。

composer.json
{
	"name": "hoge/hoge",
	"require-dev": {
		"phpunit/phpunit": "^9.5"
	},
	"scripts": {
		"test": [
			"@putenv HOGE=hogehoge",
			"echo %HOGE%"
		]
	}
}

参考サイト

関連記事

もはやPHPで開発を行う際に、使用していないプロジェクトは探すのが大変なぐらいスタンダードな存在となった Composer ですが、昨年めでたく 2.0 になったということで、改めて少しまとめてみます。今更とか言っちゃダメです。Composer とは?Composer は、PHPの依存関係管理のためのツールです。世界中 ...
前回、「Composer 再入門(その2:スクリプト)」の続きです。今回はオートローダーの最適化についてです。オートローダーの最適化デフォルトでは、Composer のオートローダーはクラスの名前を解決する際に、ファイルシステムのチェックを行っています。新しくファイルが追加されたり削除されたりしても、オートローダーがそ ...
前回、「Composer 再入門(その3:オートローダーの最適化)」の続きです。今回は便利コマンドについてです。list コマンドComposer で使用できるコマンドの一覧を表示できます。どんなコマンドがあるのか、このコマンドで調べましょう。php composer.phar listhelp コマンドhelp コマ ...
最近のアプリケーションは開発効率を上げるために大量のライブラリを組み合わせて作成することが多くなっています。そういった状況下では、たった1つのライブラリがバージョンアップすることで、そのライブラリに依存している他のライブラリが正常に動作しなくなり、やがてアプリケーション全体が正常に動作しなくなるというような状況に陥りま ...

記事検索

最新記事

RSSフィード