チーム開発におけるComposerパッケージの競合解決手順を紹介

  •  
 
TaKo2023年1月25日 - 12:20 に投稿

タグ

■概要

Composerを利用してパッケージを管理しているプロジェクトで、チームメンバが別々のブランチでがパッケージを追加・削除・更新した時、それらのブランチをマージしようとすると高い確率で競合が起きます。


この時、差分ファイルを直接編集して両方のブランチの変更をいっぺんに取り込もうとすると、取り返しのつかない問題が起きることがあります。
*そもそもcomposer.lockファイルを手作業でマージするは困難です。


この記事では下記の参考文献に基づいて、上記のような競合を解消する手順を簡潔に紹介します。

>参考文献

■環境情報

  • OS:MacOS 12.5.1
  • PHP:7.4.30
  • Composer:2.3.10
  • Git:2.36.1

■問題設定

ブランチ 変更点
A パッケージAを追加、パッケージBを削除
B パッケージCを追加

■手順

  1. マージしたいブランチの変更点を確認する。
  2. 変更が多い方のブランチを採用し、競合を解決状態にする。
    • 今回はブランチAの内容を採用して、ブランチBはここでは無視する。
    • 対象ファイルはcomposer.json、composer.lock、vendorディレクトリ
    • *vendorディレクトリはGitで管理されている場合のみ。
  3. ブランチBの変更を手作業で再度実施する。

    composer require パッケージC
    
  4. composer.json、composer.lockに不備がないか以下のコマンドで確認します。

    • --dry-ranはinstallコマンドを実行した結果を表示するオプションです、実際にinstallはされません。
    composer validate
    composer install --dry-ran
    


■【付録】実際に上記の手順を検証する

>準備

  1. 以下のようなプロジェクトを用意します。

    • 用意の手順は割愛します。
    • rmccue/requestsというパッケージは、上記手順のパッケージBに相当します。
    tree -L 1 -a
    
    .
    ├── .git
    ├── composer.json
    ├── composer.lock
    └── vendor
    
    cat composer.json
    
    {
        "name": "vendor_name/conflict_test",
        "type": "project",
        "require": {
            "rmccue/requests": "^2.0"
        }
    }
    
    git log --name-status
    
    commit d268e79b22d2f2a58dc6af43a1b3adc8f5d9986b (HEAD -> master)
    Author: *著者は消しています。
    Date:   Wed Jan 25 11:30:16 2023 +0900
    
        Initial commit.
    
    A       composer.json
    A       composer.lock
    A       vendor/autoload.php
    A       vendor/composer/ClassLoader.php
    A       vendor/composer/InstalledVersions.php
    A       vendor/composer/LICENSE
    A       vendor/composer/autoload_classmap.php
    A       vendor/composer/autoload_files.php
    A       vendor/composer/autoload_namespaces.php
    A       vendor/composer/autoload_psr4.php
    A       vendor/composer/autoload_real.php
    A       vendor/composer/autoload_static.php
    A       vendor/composer/installed.json
    A       vendor/composer/installed.php
    A       vendor/composer/platform_check.php
    A       vendor/rmccue/requests/.editorconfig
    A       vendor/rmccue/requests/CHANGELOG.md
    

>検証開始!

  1. ブランチAを作成してswitchします。

    git checkout -b branchA
    
  2. パッケージA(kriswallsmith/assetic)を追加します。

    composer require kriswallsmith/assetic
    
  3. パッケージB(rmccue/requests)を削除します。

    composer remove rmccue/requests
    
  4. 差分をすべてステージングしてコミットします。

    git add .
    git commit -m "パッケージAを追加してパッケージBを削除."
    
  5. masterブランチに切り替えて、ブランチBを作成・switchします。

    git switch master
    git checkout -b branchB
    
  6. パッケージC(briannesbitt/Carbon)を追加します。

    composer require nesbot/carbon 
    
  7. 差分をすべてステージングしてコミットします。

    git add .
    git commit -m "パッケージCを追加."
    
  8. git logで状況を確認します。

    git log --all --graph
    * commit 533bad32fd88ce0b456996b13c79d0555ed61775 (HEAD -> branchB)
    | Author: ipride-komai <ipride-tako@macbook.local>
    | Date:   Wed Jan 25 11:56:53 2023 +0900
    | 
    |     パッケージCを追加.
    |   
    | * commit d2b5c567e290a8f6466a269db66e964eb79b6376 (branchA)
    |/  Author: ipride-komai <ipride-tako@macbook.local>
    |   Date:   Wed Jan 25 11:51:17 2023 +0900
    |   
    |       パッケージAを追加して、パッケージBを削除.
    | 
    * commit d268e79b22d2f2a58dc6af43a1b3adc8f5d9986b (master)
    
  9. ブランチAとブランチCをマージします。

    git switch branchA
    git marge branchB
    
    • 競合が起きました!
    Auto-merging composer.json
    CONFLICT (content): Merge conflict in composer.json
    Auto-merging composer.lock
    CONFLICT (content): Merge conflict in composer.lock
    Auto-merging vendor/composer/autoload_classmap.php
    CONFLICT (content): Merge conflict in vendor/composer/autoload_classmap.php
    Auto-merging vendor/composer/autoload_files.php
    CONFLICT (content): Merge conflict in vendor/composer/autoload_files.php
    Auto-merging vendor/composer/autoload_psr4.php
    CONFLICT (content): Merge conflict in vendor/composer/autoload_psr4.php
    Auto-merging vendor/composer/autoload_static.php
    CONFLICT (content): Merge conflict in vendor/composer/autoload_static.php
    Auto-merging vendor/composer/installed.json
    CONFLICT (content): Merge conflict in vendor/composer/installed.json
    Auto-merging vendor/composer/installed.php
    CONFLICT (content): Merge conflict in vendor/composer/installed.php
    Auto-merging vendor/composer/platform_check.php
    CONFLICT (content): Merge conflict in vendor/composer/platform_check.php
    Automatic merge failed; fix conflicts and then commit the result.
    
  10. 変更が多いブランチAの変更を採用して競合を解決します。

    git checkout --ours composer.json composer.lock vendor/
    git add  composer.json composer.lock vendor/
    
  11. ブランチBの操作を実施します。

    composer require nesbot/carbon 
    
  12. composer.json、composer.lockに不備がないか確認します。

    composer validate
    
    • *今回作成した、composer.jsonファイルにdescriptionlicenseの記載がないためエラーが出ますが、本稿とは関係ないので無視します。
    ./composer.json is valid for simple usage with Composer but has
    strict errors that make it unable to be published as a package
    See https://getcomposer.org/doc/04-schema.md for details on the schema
    # Publish errors
    - description : The property description is required
    # General warnings
    - No license specified, it is recommended to do so. For closed-source software you may use "proprietary" as license.
    
    composer install --dry-run
    
    • 以下のメッセージが出力されました。composer.lockファイルに問題はないことがわかります。
    Installing dependencies from lock file (including require-dev)
    Verifying lock file contents can be installed on current platform.
    Nothing to install, update or remove
    7 packages you are using are looking for funding.
    Use the `composer fund` command to find out more!
    
  13. 差分をすべてステージングしてコミットし、マージ作業を終了します。

    • マージメッセージはいじらずそのままコミットします。
    git add .
    git commit
    
  14. 完了!

>最終結果

git log
commit 4b1a0eef65ac9fec3c311078be605e069613a567 (HEAD -> branchA)
Merge: d2b5c56 533bad3
Author: 著者
Date:   Wed Jan 25 12:11:51 2023 +0900

    Merge branch 'branchB' into branchA

commit 533bad32fd88ce0b456996b13c79d0555ed61775 (branchB)
Author: 著者
Date:   Wed Jan 25 11:56:53 2023 +0900

    パッケージCを追加.

commit d2b5c567e290a8f6466a269db66e964eb79b6376
Author: 著者
Date:   Wed Jan 25 11:51:17 2023 +0900

    パッケージAを追加して、パッケージBを削除.

commit d268e79b22d2f2a58dc6af43a1b3adc8f5d9986b (master)
cat composer.json
{
    "name": "vendor_name/conflict_test",
    "type": "project",
    "require": {
        "kriswallsmith/assetic": "^1.4",
        "nesbot/carbon": "^2.65"
    }
}

コメントを追加

プレーンテキスト

  • HTMLタグは利用できません。
  • 行と段落は自動的に折り返されます。
  • ウェブページのアドレスとメールアドレスは自動的にリンクに変換されます。
CAPTCHA
この質問はあなたが人間の訪問者であるかどうかをテストし、自動化されたスパム送信を防ぐためのものです。