Symfonyのcomposer.jsonを見てみる
公開日: 2023/04/16
概要
Symfonyのプロジェクト生成時に自動生成されるcomposer.jsonで何をしているのかcomposerのドキュメントなどを見ながら調べてみる。
https://getcomposer.org/doc/04-schema.md
type: “project”
パッケージタイプ
- デフォルトはlibrary
- カスタムインストールロジックで使用される
- symfony-bundle, wordpress-pluginなど
パッケージタイプで入れられる値
- library
- vendorにコピーされる
- project
- ライブラリではなくプロジェクトであることを表す
- metapackage
- requireがあるがファイルを含まずファイルシステムに何も書き込まない
- composer-plugin
- 他のパッケージのインストーラーを提供する
license: “proprietary”
パッケージのライセンス
以下のように記述する、クローズドなソフトウェアにはproprietary
- Apache-2.0
- BSD-4-Clause
- GPL-3.0-only / GPL-3.0-or-later
- LGPL-3.0-only / LGPL-3.0-or-later
- MIT
複数の場合、stringではなく、配列で指定可能
minimum-stability: “dev”
安定性でパッケージをフィルタするときのデフォルトの動作を定義する。デフォルトは “stable”
利用可能なオプションは以下(上ほど安定性が高い)
- stable
- RC
- beta
- alpha
- dev
prefer-stable: true
オプションを有効にするとcomposerがパッケージを探すときに安定性パッケージをできるだけ選ぶ。
config: {}
configは別ページがあった(https://getcomposer.org/doc/06-config.md)。
"config": {
"allow-plugins": {
"symfony/flex": true,
"symfony/runtime": true
},
"sort-packages": true
},
allow-plugins
デフォルトは{}
- composerの実行中にプラグインを実行することを許可する
- 特に指定していないとインタラクティブに実行するか選べる
- キーをtrue/falseにするとすべてのプラグインを有効無効にできる
sort-packages: true
デフォルトはfalse
trueである場合、requireコマンド実行時にcomposer.jsonのパッケージを名前順でソートする
autoload (autoload-dev)
"autoload": {
"psr-4": {
"App\\\\\\\\": "src/"
}
},
"autoload-dev": {
"psr-4": {
"App\\\\\\\\Tests\\\\\\\\": "tests/"
}
},
PSR-4, PSR-0のオートローディング、クラスマップ、ファイルインクルードに対応している。 (PSR-4はより使いやすいので推奨される、クラス作成時にオートローダの再作成が不要である点で楽)
replace: {}
現在見ているコードに限っていえば symfony/polyfillのドキュメントによると( https://github.com/symfony/polyfill/blob/main/README.md )、 古いPHPバージョンでも新しい機能が使えるようになるパッケージ(ポリフィル)を 使わないようにする らしい。
"replace": {
"symfony/polyfill-ctype": "*",
"symfony/polyfill-iconv": "*",
"symfony/polyfill-php72": "*",
"symfony/polyfill-php73": "*",
"symfony/polyfill-php74": "*",
"symfony/polyfill-php80": "*",
"symfony/polyfill-php81": "*"
},
SlackOverflowで解説してくれている人がいた。
https://stackoverflow.com/questions/18882201/how-does-the-replace-property-work-with-composer
↑間接的に参照されるパッケージを含めてあるパッケージを別のパッケージに置き換えることができるみたい。 この場合、置き換えたいパッケージのcomposer.jsonにrepalceで私はここからフォークしてきましたよと明記する。
https://www.darwinbiler.com/how-does-the-replace-property-work-in-composer/
↑こちらでも解説されている。もう一つの使い方としてreplaceをフレームワーク自身のcomposer.jsonに記述することで なんども同じフレームワークが呼び出されないようにする用途も説明されていた。
両方の説明とも違う用途なのだと思うが、プロジェクト自身にreplaceを入れてあげると、 そのパッケージは私自身なので必要ないですよということでインストールされないのだと予測。
composer.lockを見ると、symfony/polyfill-ctypeが依存関係にあるがインストールされていないのはreplaceによるもの?
試しにsymfony/polyfill-ctypeを削除してcomposer updateしてみる
"replace": {
"symfony/polyfill-iconv": "*",
"symfony/polyfill-php72": "*",
"symfony/polyfill-php73": "*",
"symfony/polyfill-php74": "*",
"symfony/polyfill-php80": "*",
"symfony/polyfill-php81": "*"
},
# composer update
Loading composer repositories with package information
Info from <https://repo.packagist.org>: #StandWithUkraine
Restricting packages listed in "symfony/symfony" to "6.2.*"
Updating dependencies
Lock file operations: 1 install, 2 updates, 0 removals
- Upgrading symfony/cache (v6.2.3 => v6.2.4)
- Upgrading symfony/http-kernel (v6.2.3 => v6.2.4)
- Locking symfony/polyfill-ctype (v1.27.0)
Writing lock file
Installing dependencies from lock file (including require-dev)
Package operations: 1 install, 2 updates, 0 removals
- Syncing symfony/cache (v6.2.4) into cache
- Downloading symfony/polyfill-ctype (v1.27.0)
- Syncing symfony/http-kernel (v6.2.4) into cache
- Upgrading symfony/cache (v6.2.3 => v6.2.4): Checking out ddd1a70bfd from cache
- Installing symfony/polyfill-ctype (v1.27.0): Extracting archive
- Upgrading symfony/http-kernel (v6.2.3 => v6.2.4): Checking out 74f2e638ec from cache
Generating autoload files
38 packages you are using are looking for funding.
Use the `composer fund` command to find out more!
What about running composer global require symfony/thanks && composer thanks now?
This will spread some 💖 by sending a ★ to the GitHub repositories of your fellow package maintainers.
Run composer recipes at any time to see the status of your Symfony recipes.
Executing script cache:clear [OK]
Executing script assets:install public [OK]
No security vulnerability advisories found
symfony/polyfill-ctypeがインストールされたので、たぶんそういうことなんだろう。
scripts: {}
Composerはインストール処理のさまざまな箇所にフックできる(https://getcomposer.org/doc/articles/scripts.md)
- post-install-cmd
- installコマンド後に自動実行
- post-update-command
- updateコマンド後に自動実行
- auto-scripts
- Referencing Scriptsの節によると、キーの名前はなんでもよくてキーに指定すると
@auto-scripts
のように記述すると実行してくれるみたい- stack overflowの情報しかなかったがSymfony/Flexの場合、symfony-cmdと書くとbin/consoleのコマンドが実行してくれるみたい(https://stackoverflow.com/questions/50702990/symfony-4-composer-scripts)
- Referencing Scriptsの節によると、キーの名前はなんでもよくてキーに指定すると
"scripts": {
"auto-scripts": {
"cache:clear": "symfony-cmd",
"assets:install %PUBLIC_DIR%": "symfony-cmd"
},
"post-install-cmd": [
"@auto-scripts"
],
"post-update-cmd": [
"@auto-scripts"
]
},
conflict: {}
ここで指定したパッケージが一緒にインストールされることがなくなる。 これへはsymfony/flexをインストールしているからだと思われる(参考)
"conflict": {
"symfony/symfony": "*"
},
extra:
scriptsで利用する追加の任意のデータを記述。スクリプトから利用される。
"extra": {
"symfony": {
"allow-contrib": "true",
"require": "6.2.*"
}
}