symfony.lockとは?

 

symfonyを使ってるといつの間にか入ってて、更新もされるsymfony.lock。
composer.lockと何が違うのか等、よくわかってなかったので自分なりに調べたことをまとめます。

 

\いろいろまとめてみたんですが、すでに記事ありました!/
こちらの方が断然わかりやすいです!!!
https://zenn.dev/ttskch/articles/13013224b61531

 

symfony.lockには何が書いてある?

composer require symfony/<name> などのコマンドを叩いた時に、必要な環境変数(.env)やconfig/のyamlの追加が自動的にされることがあります。
この履歴がsymfony.lockに記録されています。
doctrine/annotationsといったsymfony/<name>以外の対象もあります。

ちなみに、
composer require symfony/notifierをした時、「config/packages/notifier.yamlを追加する」といった定義(レシピ)はsymfony/recipesによって管理されています。

さらに、
「config/packages/notifier.yamlを追加する」という定義(レシピ)の実行は、symfony/flex(Composer Plugin for Symfony)によって行われています。

composer.lockとの違いは?

  • symfony/recipesに置いてあるどのバージョン(version)のmanifest(レシピの定義)を使っているのかが明記されています。
  • 追加や更新するファイル(files)についても明記されています。
// symfony.lock
{
    "symfony/flex": {
        "version": "2.3",
        "recipe": {
            "repo": "github.com/symfony/recipes",
            "branch": "main",
            "version": "1.0",
            "ref": "146251ae39e06a95be0fe3d13c807bcf3938b172"
        },
        "files": [
            ".env"
        ]
    },
    "symfony/notifier": {
        "version": "6.3",
        "recipe": {
            "repo": "github.com/symfony/recipes",
            "branch": "main",
            "version": "5.0",
            "ref": "c31585e252b32fe0e1f30b1f256af553f4a06eb9"
        },
        "files": [
            "config/packages/notifier.yaml"
        ]
    }
}
// composer.lock
    ...
    "packages": [
        {
            "name": "symfony/flex",
            "version": "v2.3.1",
            "source": {
                "type": "git",
                "url": "https://github.com/symfony/flex.git",
                "reference": "3c9c3424efdafe33e0e3cfb5e87e50b34711fedf"
            },
            "dist": {
                "type": "zip",
                "url": "https://api.github.com/repos/symfony/flex/zipball/3c9c3424efdafe33e0e3cfb5e87e50b34711fedf",
                "reference": "3c9c3424efdafe33e0e3cfb5e87e50b34711fedf",
                "shasum": ""
            },
            "require": {
                "composer-plugin-api": "^2.1",
                "php": ">=8.0"
            },
            "require-dev": {
                "composer/composer": "^2.1",
                "symfony/dotenv": "^5.4|^6.0",
                "symfony/filesystem": "^5.4|^6.0",
                "symfony/phpunit-bridge": "^5.4|^6.0",
                "symfony/process": "^5.4|^6.0"
            },
            "type": "composer-plugin",
            ...

symfony.lockはsymfony/flexをrequireすると追加される

symfony/flex => Composer plugin for Symfony

$ composer require symfony/flex
...
// ↓↓↓ この辺りがsymfony/flexによって行われている。 ↓↓↓

Symfony operations: 1 recipe (ad5e8d2058412a4be7bb46bf8d4af76c)
  - Configuring symfony/flex (>=1.0): From github.com/symfony/recipes:main

// ↑↑↑ この辺りがsymfony/flexによって行われている。 ↑↑↑

No security vulnerability advisories found
Using version ^2.3 for symfony/flex


$ git status
On branch master
Changes not staged for commit:
  (use "git add ..." to update what will be committed)
  (use "git restore ..." to discard changes in working directory)
    modified:   composer.json

Untracked files:
  (use "git add ..." to include in what will be committed)
    .env
    composer.lock
    symfony.lock

no changes added to commit (use "git add" and/or "git commit -a")

 

どうなったらsymfony.lockに追加や更新されるか?

symfony/flexがinstall済みで、かつsymfony/recipesで管理されているcomposerパッケージについてcomposer requirecomposer updateをした時のようです。

また、レシピがないパッケージについても以下コマンドでsymfony.lockに追加できます。さらに、既にsymfony.lockに定義されているパッケージについてのバージョンを更新できます。

$ composer recipes:install <vendor>/<package> --force -vた

ただ、レシピがないのにsymfony.lockに定義してるパッケージは何の意味があるのかよくわかっていません🤔 誰か教えてください!

最後に

この記事を書くために、symfony/flexを読みました。Composer pluginの作り方や流れを知ることができたので次の記事で書こうと思います。

参考