Skip to content

composer.json の残課題: 拡張の宣言漏れ・システム要件の三者不一致・メジャーバージョン遅れ #6940

Description

@nanasess

概要

#6939composer.json の残骸整理と暗黙依存の明示化を行いましたが、影響範囲の判断が必要なため意図的に保留した項目があります。まとめて Issue 化します。

いずれも #6939 の調査で判明したもので、根拠となる実測を併記します。


1. guzzlehttp/guzzlerequire にあるが本体は未使用

事実

  • 本体は 一度も Guzzle を直接使ったことがありません(git log -S'GuzzleHttp' -- src app の結果が空)
  • リポジトリ全体で guzzlehttp の参照は composer.json の 1 行のみ
  • lock 上の依存元は codeception/module-phpbrowser(dev)、captbaritone/mailcatcher-codeception-module(dev)、monolog/monolog(require-dev/suggest)

論点

require から外すと dev には codeception 経由で残り、本番 vendor からのみ消えます。ただし Guzzle を自前で宣言していないプラグインが壊れます。EC-CUBE のプラグインは Guzzle を使うものが多く、コアの vendor に暗黙に依存している可能性があります。

選択肢

  • (a) 保留(現状維持)
  • (b) require から削除。4.4 はメジャー更新のため破壊的変更として実施可能。プラグイン側に自前 require を促す必要あり
  • (c) require-dev へ移動(実質 (b) と同じだが意図が明確)

事実上「コアが提供する公開依存」として扱われてきた経緯があるかどうかが判断材料になりそうです。


2. PHP 拡張の宣言漏れ(ext-pdo / ext-session / ext-phar / ext-fileinfo)

事実

本体が使用しているのに composer.json に無く、推移的にも一切担保されていない拡張があります。

拡張 本体での使用 現在の要求元
ext-pdo TransactionListener:95,118PluginService:634,800$nativeConnection->inTransaction() を PDO 前提で呼ぶ なし(doctrine/dbal も要求しない)
ext-phar PluginService:411TemplateController:126,249new \PharData(...) 本番ではなし(dev の phar-io/manifest のみ)
ext-session framework.yamlhandler_id: session.handler.native_file なし
ext-fileinfo UploadedFile::getMimeType() が symfony/mime 経由で finfo を使用 なし

なぜ #6939 で追加しなかったか

require に書くと、その拡張がない環境で composer が解決不能になり導入できなくなります。実測:

$ composer update --dry-run   # config.platform で ext-fileinfo を無効化して再現
Your requirements could not be resolved to an installable set of packages.
  - Root composer.json requires PHP extension ext-fileinfo * but the ext-fileinfo package is disabled
exit=2

ext-pdo / ext-session は「無ければ EC-CUBE が起動しない」ため実質リスクゼロと考えられますが、ext-fileinfo / ext-phar本体は動くが一部機能が動かないため、これまで動いていた環境を弾く可能性があります。

参考: ext-bcmathnanasess/bcmath-polyfillprovide: {"ext-bcmath": "8.1.0"} を宣言しているため、bcmath 非搭載環境でも require に追加して解決が通ります(composer update --dry-run で exit=0 を実測)。制約は "*" にする必要があります(^8.2 等では polyfill の 8.1.0 が満たせません)。同様に ext-ctypesymfony/polyfill-ctype が provide します。


3. システム要件が「要件ドキュメント / InstallController / composer.json」で三者不一致

事実

拡張 要件ドキュメント InstallController composer.json 本体コードでの使用
sodium 必須 必須($requiredModules) config.platform で緩和 (#6827) 0 件
GD 必須 記載なし 記載なし 0 件
bcmath 記載なし 記載なし 記載なし(polyfill を require) 金額計算の中核

論点

  • sodium: 共有レンタルサーバー (sodium 拡張なし / CLI 不可) で API プラグインを導入できるよう composer.json に config.platform.ext-sodium を追加する #6827 で「sodium 非搭載の共有レンタルサーバーでも Web API プラグインを導入可能に」する方針が取られ、config.platform で緩和されました。しかし InstallController.php:83$requiredModules には 'sodium' が残り、インストーラが addDanger() で必須エラー表示を出します(※ checkModules() は表示のみでインストールをブロックしないことは確認済み)。方針と表示が矛盾しています。
  • GD: 要件では必須ですが、image*() / GdImage / getimagesize の使用は 0 件です。Dockerfile では入れています。要件が実態と合っていない可能性があります。
  • bcmath: 金額計算(Order.phpPurchaseFlow.php 等)の中核で全面的に使用しているのに、要件にもインストーラにも記載がありません。polyfill があるため動作はしますが、要件として明示すべきではないでしょうか。
  • 4.4 の要件自体が未記載(ドキュメントは 4.3 まで)

対応候補

  • doc4.ec-cube.net の要件更新(4.4 追記、sodium/GD の見直し、bcmath 追記)※別リポジトリ
  • InstallController$requiredModules / $recommendedModules の整合(sodium を推奨へ移す等)

4. doctrine/commonClassUtils 1 箇所のためだけの依存

事実

  • doctrine/common を lock 上で require しているのは root のみ(ORM 3 は要求しません)
  • 本体での唯一の使用箇所は src/Eccube/Service/CsvExportService.php:211ClassUtils::getClass($entity) のみ(Doctrine\Common\Collectionsdoctrine/collections 由来のため別)

対応候補

$em->getClassMetadata(get_class($entity))->getName() 等への置換で依存を 1 つ減らせます。実装変更を伴うため要検討。


5. 直接依存のメジャーバージョン遅れ

composer outdated --direct の結果から:

パッケージ 現在 最新 備考
mobiledetect/mobiledetectlib 2.8.45 4.11.0 2 メジャー遅れ。MobileTemplatePathListenerservices.yaml:216 で使用
psr/log 2.0.0 3.0.2 制約が ~2.0 固定で 2.x のみ許容。Symfony 7.4 / monolog 3 は ^3 も許容。3.0 は型宣言が入るため BC 影響あり
doctrine/persistence 3.4.3 4.2.0 AbstractEntityAddCartType で使用
doctrine/data-fixtures 1.8.2 2.2.1
doctrine/doctrine-fixtures-bundle 3.7.3 4.3.1
softcreatr/jsonpath 0.8.3 0.10.0
codeception/module-phpbrowser 3.0.2 4.0.0 dev

4.4 はメジャー更新のため、破壊的変更を伴う更新を実施できる節目です。それぞれ影響範囲が異なるため、個別 PR での対応が現実的と思われます。


参考: #6939 で対応済みの項目

  • conflict.easycorp/easy-log-handler / skorp/detect-incompatible-samesite-useragents / allow-plugins.kylekatarnls/update-helper / minimum-stability: RC / extra の死んだ 5 キー / symfony.lock の孤児レシピ 13 件の削除
  • phpseclib/phpseclib / justinrainbow/json-schema / ezyang/htmlpurifier の明示化
  • ext-filter / ext-tokenizer / ext-xml / ext-zlib の追加

🤖 Generated with Claude Code

Metadata

Metadata

Assignees

No one assigned

    Labels

    refactorリファクタリング

    Type

    No type

    Projects

    No projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions