LoginSignup
0
0

More than 1 year has passed since last update.

依存パッケージが古いけど最新の依存パッケージに依存しているパッケージをcomposerで管理したい

Last updated at Posted at 2022-08-30

(タイトルがややこしくてすみません)

Packagistに公開されているライブラリ(以下somepackage)をインストールしようとしたところ、既存のライブラリ(以下requiredpackage)に依存しており、そのバージョンが古いためにsomepackageの最新バージョンを入れることができないということがありました。
requiredpackageは既に複数のファイルで使用しており、バージョンアップがすぐにはできない状況でした。

そこでsomepackageをサブモジュール化して、別のcomposer.jsonで管理するという戦略を取ったのでその内容を紹介します。

環境

# composer -V
Composer version 1.10.22 2021-04-27 13:10:45

# php -v
PHP 7.4.7 (cli) (built: Jun 11 2020 18:41:17) ( NTS )

# php artisan --version
Laravel Framework 6.18.35

状況の整理

somepackageには下記の要件がありました。

src/composer.json
    "require": {
        "requiredpackage": "^1.8.4||^2.2.1"
    }

リポジトリは要件を満たしていません。

src# composer show | grep requiredpackage
requiredpackage                    1.6.1

やったこと

サブモジュールとしてsrc/lib/somepackageディレクトリを切り、composer.jsonを置きます

src/lib/somepackage/composer.json
{
  "require": {
    "somepackage": "2.12.x"
  },
}

src/lib/somepackagecomposer install --dump-autoloadするとそれぞれ異なるバージョンがインストールされた状態になります

src/lib/somepackage# composer show | grep requiredpackage
requiredpackage                  2.4.0     

src# composer show | grep requiredpackage
requiredpackage                  1.6.1    

この時点でsomepackageはサブモジュールのautoloadを利用してインポートができる状態になりました。

しかし、src/lib/somepackage/vendorの一部パッケージがsrc/vendorと重複していると、ファイルのインポート時に名前空間で競合が発生する可能性があります(つまり意図通りのバージョンのパッケージを参照できない可能性がある)。

今回はsomepackageをインポートするファイルが限られていたので、使用するファイルで直接requireする方針を採用しました。

require base_path('lib/somepackage/vendor/autoload.php');

somepackageの依存パッケージがsrc/vendorにも存在している場合は依然として名前空間の競合が発生する可能性はありますが、影響範囲は限定されます。
本来であればバージョンアップすべきですが、一時的な対応としてはアリかなと思います。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0