Composer: 使用のヒント

ComposerはPHPの依存関係管理ツールです。プロジェクトが依存するライブラリをリストアップし、それらをインストールおよび更新してくれます。以下を示します:

  • Composerのインストール方法
  • 新規または既存のプロジェクトでの使用方法

インストール

Composerは実行可能な .phar ファイルで、次の方法でダウンロードしてインストールします:

Windows

公式インストーラ Composer-Setup.exe を使用してください。

Linux, macOS

このページ からコピーできる4つのコマンドを実行するだけです。

さらに、システムの PATH にあるフォルダに配置することで、Composerはグローバルにアクセス可能になります:

$ mv ./composer.phar ~/bin/composer # または /usr/local/bin/composer

プロジェクトでの使用

プロジェクトでComposerの使用を開始するには、composer.json ファイルのみが必要です。これはプロジェクトの依存関係を記述し、他のメタデータも含むことができます。基本的な composer.json は次のようになります:

{
	"require": {
		"nette/database": "^3.0"
	}
}

ここでは、アプリケーション(またはライブラリ)が nette/database パッケージ(パッケージ名は組織名とプロジェクト名で構成されます)を必要とし、条件 ^3.0 に一致するバージョン(つまり、最新のバージョン3)を要求していることを示しています。

プロジェクトのルートに composer.json ファイルがあるので、インストールを実行します:

composer update

ComposerはNette Databaseを vendor/ フォルダにダウンロードします。さらに、どのバージョンのライブラリを正確にインストールしたかに関する情報を含む composer.lock ファイルを作成します。

Composerは vendor/autoload.php ファイルを生成します。これを単純にインクルードするだけで、追加の作業なしにライブラリの使用を開始できます:

require __DIR__ . '/vendor/autoload.php';

$db = new Nette\Database\Connection('sqlite::memory:');

パッケージを最新バージョンに更新する

composer.json で定義された条件に従って使用されているライブラリを最新バージョンに更新するには、composer update コマンドを使用します。たとえば、依存関係 "nette/database": "^3.0" の場合、最新のバージョン3.x.xをインストールしますが、バージョン4はインストールしません。

composer.json ファイル内の条件を、たとえば "nette/database": "^4.1" に更新して最新バージョンをインストールできるようにするには、composer require nette/database コマンドを使用します。

使用されているすべてのNetteパッケージを更新するには、コマンドラインですべてをリストする必要があります。例:

composer require nette/application nette/forms latte/latte tracy/tracy ...

これは非実用的です。代わりに、簡単なスクリプト Composer Frontline を使用してください。これはあなたのためにそれを行います:

php composer-frontline.php

新しいプロジェクトの作成

Netteで新しいプロジェクトを作成するには、単一のコマンドを使用します:

composer create-project nette/web-project project-name

project-name として、プロジェクトのディレクトリ名を入力して確認します。ComposerはGitHubから nette/web-project リポジトリをダウンロードします。これにはすでに composer.json ファイルが含まれており、その後すぐにNette Frameworkをダウンロードします。あとは temp/ および log/ フォルダへの書き込み権限を設定する だけで、プロジェクトは稼働するはずです。

プロジェクトがホストされるPHPのバージョンがわかっている場合は、それを設定する ことを忘れないでください。

PHPバージョン

Composerは常に、現在使用しているPHPのバージョン(より正確には、Composerを実行するときにコマンドラインで使用されるPHPのバージョン)と互換性のあるパッケージのバージョンをインストールします。しかし、これはおそらくホスティングで使用しているバージョンと同じではありません。したがって、ホスティング上のPHPのバージョンに関する情報を composer.json ファイルに追加することが非常に重要です。その後、ホスティングと互換性のあるパッケージのバージョンのみがインストールされます。

プロジェクトがたとえばPHP 8.2.3で実行されることを設定するには、次のコマンドを使用します:

composer config platform.php 8.2.3

バージョンは composer.json ファイルに次のように書き込まれます:

{
	"config": {
		"platform": {
			"php": "8.2.3"
		}
	}
}

ただし、PHPのバージョン番号はファイルの別の場所、つまり require セクションにも記載されています。最初の番号はどのバージョン用にパッケージがインストールされるかを決定し、2番目の番号はアプリケーション自体がどのバージョン用に書かれているかを示します。そして、たとえばPhpStormはそれに基づいて PHP language level を設定します。(もちろん、これらのバージョンが異なることは意味がないため、二重の記述は不注意です。)このバージョンは次のコマンドで設定します:

composer require php 8.2.3 --no-update

または composer.json ファイルで直接:

{
	"require": {
		"php": "8.2.3"
	}
}

PHPバージョンの無視

パッケージは通常、互換性のある最低PHPバージョンと、テストされた最高バージョンの両方を指定しています。さらに新しいPHPバージョンを使用する予定がある場合、たとえばテスト目的で、Composerはそのようなパッケージのインストールを拒否します。解決策は --ignore-platform-req=php+ オプションです。これにより、Composerは要求されたPHPバージョンの上限を無視します。

誤った報告

パッケージのアップグレードやバージョン番号の変更時に、競合が発生することがあります。あるパッケージには、別のパッケージと矛盾する要件があるなどです。しかし、Composerは時々誤った報告を表示することがあります。実際には存在しない競合を報告します。そのような場合は、composer.lock ファイルを削除して再試行すると役立ちます。

エラーメッセージが続く場合は、真剣に受け止められ、何とどのように修正する必要があるかを読み取る必要があります。

Packagist.org – 中央リポジトリ

Packagist は、Composerが他に指示されない限りパッケージを検索しようとするメインリポジトリです。独自のパッケージをここで公開することもできます。

中央リポジトリを使用したくない場合は?

社内アプリケーションがあり、単に公開でホストできない場合は、それらのために企業リポジトリを作成します。

リポジトリに関する詳細は、公式ドキュメント で確認できます。

オートローディング

Composerの重要な機能は、インストールされたすべてのクラスに対してオートローディングを提供することです。これは vendor/autoload.php ファイルをインクルードすることで開始します。

ただし、vendor フォルダ外の他のクラスをロードするためにComposerを使用することも可能です。最初のオプションは、Composerに定義されたフォルダとサブフォルダを検索させ、すべてのクラスを見つけてオートローダーに含めることです。これは、composer.jsonautoload > classmap を設定することで実現できます:

{
	"autoload": {
		"classmap": [
			"src/",      # src/ フォルダとそのサブフォルダを含める
		]
	}
}

その後、変更があるたびに composer dumpautoload コマンドを実行し、オートロードテーブルを再生成する必要があります。これは非常に不便であり、このタスクをRobotLoaderに委ねる方がはるかに優れています。RobotLoaderは同じ操作をバックグラウンドで自動的に、はるかに高速に実行します。

2番目のオプションは、PSR-4 に従うことです。簡単に言えば、これは名前空間とクラス名がディレクトリ構造とファイル名に対応するシステムです。たとえば、App\Core\RouterFactory/path/to/App/Core/RouterFactory.php ファイルにあります。設定例:

{
	"autoload": {
		"psr-4": {
			"App\\": "app/"   # App\ 名前空間は app/ ディレクトリにあります
		}
	}
}

動作を正確に設定する方法については、Composerドキュメント を参照してください。

新しいバージョンのテスト

パッケージの新しい開発バージョンをテストしたいですか?どうすればよいでしょうか?まず、composer.json ファイルに次の2つのオプションを追加します。これにより、開発バージョンのパッケージをインストールできますが、要件を満たす安定バージョンの組み合わせが存在しない場合にのみ使用されます:

{
	"minimum-stability": "dev",
	"prefer-stable": true,
}

さらに、composer.lock ファイルを削除することをお勧めします。Composerが理解できない理由でインストールを拒否することがあり、これが問題を解決します。

パッケージが nette/utils で、新しいバージョンが4.0だとしましょう。次のコマンドでインストールします:

composer require nette/utils:4.0.x-dev

または、特定のバージョン、たとえば4.0.0-RC2をインストールできます:

composer require nette/utils:4.0.0-RC2

しかし、ライブラリが古いバージョン(例:^3.1)にロックされている別のパッケージに依存している場合、理想的にはパッケージを更新して新しいバージョンで動作するようにすることです。ただし、制限を回避してComposerに開発バージョンをインストールさせ、それが古いバージョン(例:3.1.6)であるかのように見せかけたい場合は、キーワード as を使用できます:

composer require nette/utils "4.0.x-dev as 3.1.6"

コマンドの呼び出し

Composerを介して、Composerのネイティブコマンドであるかのように、独自の事前に準備されたコマンドやスクリプトを呼び出すことができます。vendor/bin フォルダにあるスクリプトの場合、このフォルダを指定する必要はありません。

例として、composer.json ファイルに、Nette Tester を使用してテストを実行するスクリプトを定義します:

{
	"scripts": {
		"tester": "tester tests -s"
	}
}

次に、composer tester を使用してテストを実行します。プロジェクトのルートフォルダにいなくても、サブディレクトリのいずれかにいる場合でもコマンドを呼び出すことができます。

感謝を送る

オープンソースの作者を喜ばせるトリックをお見せします。簡単な方法で、プロジェクトが使用しているライブラリにGitHubでスターを付けることができます。symfony/thanks ライブラリをインストールするだけです:

composer global require symfony/thanks

そして実行します:

composer thanks

試してみてください!

設定

Composerはバージョン管理ツール Git と密接に連携しています。インストールされていない場合は、Composerに使用しないように指示する必要があります:

composer -g config preferred-install dist