概要

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 のように記述すると実行してくれるみたい
    "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.*"
        }
    }