WHITEPLUS TechBlog

株式会社ホワイトプラスのエンジニアによる開発ブログです。

「Shift」を使って laravelcollective/html から spatie/laravel-html へ移行する方法と注意点

こんにちは!
ホワイトプラスのコアシステム開発Gエンジニアのさとうです。

先日 abandoned(放棄)となった laravelcollective/htmlspatie/laravel-html に移行する作業を行いました。
プロダクトコード内における laravelcollective/html の使用箇所は約1,700箇所...!
手作業で置き換えるには中々骨の折れる数です。
そこで、laravelcollective/html のドキュメント内で推奨されていた置換ツール「Shift」を用いて移行することにしました。

この記事では、laravelcollective/html から spatie/laravel-html への移行を例に、Shift の利用方法をお伝えします。
Shift は laravelcollective/html の移行だけでなく、Laravel や PHPUnit のバージョンアップ対応も行えるので、移行・バージョンアップを検討中の方にご覧いただけると幸いです。

laravelcollective/html と spatie/laravel-html

laravelcollective/html とは?

laravelcollective/html は HTML とフォームジェネレーターが同梱されているパッケージです。
blade ファイルで簡単にフォームを管理したり、複雑なモデルをフォームにバインドしたりすることができます。

Laravel 4まではデフォルトで利用できていましたが、Laravel 5以降デフォルトから外されて、別管理でメンテナンスされるようになりました。
2023年にはパッケージが abandoned(放棄)になるとアナウンスされ、Laravel 11以降はサポートされなくなっています。

The Laravel Collective recently announced that they are abandoning the project, and once Laravel 11 is out, it'll no longer work.
Laravel Collective HTML package is abandoned - Laravel News

spatie/laravel-html

laravelcollective/html の移行先として挙げられているのが spatie/laravel-html です。

If you've been using the laravelcollective/html package, its now time to update it and move to the spatie/laravel-html package.
Laravel Collective HTML package is abandoned - Laravel News

spatie/laravel-html は laravelcollective/html と似ているものの、API が異なるため、移行には作業を要します。

laravelcollective/html を廃止する方法は3つ挙げられています。

  1. 手動で spatie/laravel-html に変換する
  2. 生の HTML に変換する
  3. 移行ツール「Shift」を用いて自動変換する

This will be a manual conversion because although the packages are similar, both APIs differ. If you are using it in a few places, it would be easiest to convert to raw HTML.

However, if you use it substantially Laravel Shift has an automatic conversion to migrate to Spatie HTML which can save your hours of work.
Laravel Collective HTML package is abandoned - Laravel News

前述した通り、プロダクトコード内には約1,700箇所の使用箇所があり、手動での置き換えや生の HTML への変換は作業コストが高いため、Shift による自動変換を選択しました。

移行ツール「Shift」の使い方

移行ツール「Shift」とは?

Shift は Laravel や PHPUnit、Tailwind などのバージョンアップや移行を自動化してくれる有料ツールです。
GitHub を連携してクラウド実行するか、Docker を使ってローカルで実行するか選択することができます。
クラウド版の方が Docker 版よりも少しお高くなっています。

Shift を使って laravelcollective/html を spatie/laravel-html に置き換える

今回はクラウド版を利用して移行を行ったので、以降でクラウド版の使い方を共有します。
laravelcollective/html から spatie/laravel-html に置き換える Shift は以下のページです。

https://laravelshift.com/convert-laravelcollective-html-to-spatie-laravel-html

1. GitHub でサインインする

クラウド版の Shift は GitHub のリポジトリからプロダクトコードを取得して実行します。
まずは GitHub で Shift にサインインしましょう。

2. リポジトリとブランチを指定する

移行したいリポジトリとブランチを指定します。

Shiftでのリポジトリとブランチの指定

3. 決済して実行する

決済画面に移行するので、クレジットカードの情報を入力します。
これが終われば、Shift が実行されます。
実行状況は Shift 上で確認できます。
実行待ちの画面は以下のような状態です。

Shiftの実行待ち

実行に成功すると STATUS に PR 番号が表示されます。

Shiftの実行成功画面

GitHub を見てみると、移行作業の PR が自動的に作成されていることが確認できます。

ShiftによるGitHubのPR

実行に失敗すると STATUSIssueFailed と表示されます。

ShiftがIssueの状態

ShiftがFailedの状態

Shift を使う上での注意点

対応バージョンに要件がある

Shift で laravelcollective/html から spatie/laravel-html への自動変換を行うには、以下の要件を満たしている必要があります。

  • Laravel 10.x 以上であること
  • laravelcollective/html のバージョンが 6.4 以上 であること

composer.json と view ディレクトリの位置に注意

Shift はリポジトリのルートに composer.json があることを前提に自動変換を実施します。
なので、ルート以外に composer.json を置いている場合は、Shift に composer.json のありかを伝える必要があります。
.shiftrc ファイル(中身は空で構わない)を composer.json があるディレクトリに置くことで、Shift に基準となるディレクトリを伝えることができます。

例えばリポジトリ内で Laravel 以外のディレクトリもある場合は、以下のように .shiftrc ファイルを配置してみてください。

├ .git
├ infrastructure/
└ backend/
    ├ composer.json
    └ .shiftrc # ここに空の.shiftrcファイルを設置

また、composer.json を置いてあるディレクトリ以下の view ディレクトリ以外に変換対象がいる場合は少し工夫が必要です。
例えば、以下のようなディレクトリ構成の場合で説明します。

├ .git
├ laravel/
│  ├ composer.json
│  └ resources/
│      └ views/
│          └ target1.blade.php
└ others/
    └ resources/
        └ views/
            └ target2.blade.php # 変換対象外

このようなディレクトリ構成の場合、laravel ディレクトリに .shiftrc ファイルを設置すると target1.blade.php は変換されますが、target2.blade.php は変換されません。

この場合は、リポジトリのルートにダミーの composer.json を設置することで配下のディレクトリすべてを変換対象にできます。

├ .git
├ composer.json # ダミー
├ .shiftrc      # 念の為
├ laravel/
│  ├ composer.json
│  └ resources/
│      └ views/
│          └ target1.blade.php
└ others/
    └ resources/
        └ views/
            └ target2.blade.php # 変換対象になる

ダミーの composer.json は以下のように laravelcollective/html の依存を記載する必要があります。

{
    "require": {
        "laravelcollective/html": "^6.0"
    }
}

以上により、さまざまなディレクトリに散らばった変換対象も変換できるようになりますが、肝心の laravelcollective/html から spatie/laravel-html への移行はダミーの composer.json を対象に行われてしまいます。
ダミーの composer.json を用意した場合は、別途手動で laravelcollective/html の削除と spatie/laravel-html のインストールを行ってください。

問い合わせは英語でやり取り

前述の composer.json と view ディレクトリの問題解消と Shift の再実行を依頼するためにサポート窓口にメールで連絡しました。
サポートとのやり取りは英語で行うことになります。
翻訳や LLM が便利になってきているので、恐れることはあまりないかもしれませんが、念頭においておくと良いかもしれません。

メールは何通かやり取りしましたが、基本的に1日以内に返信が返ってきたので、何日も放置されるようなことはなさそうです。

まとめ

この記事では、laravelcollective/html から spatie/laravel-html への移行を例に、Shift の利用方法をお伝えしました。

ディレクトリ構成をカスタマイズしていたため、苦労した部分もありました。
しかし、約1,700箇所の対応を人手でやることを想像すると気が遠くなるので、苦労して自動化した甲斐はありました。
Shift は laravelcollective/html から spatie/laravel-html への移行以外にも Laravel や PHPUnit のバージョンアップもできるので、対応を予定している方は利用を検討してみてはいかがでしょうか。
今回の情報共有が、今後 Shift を使う方々のお役に立てれば幸いです。

さいごに

ホワイトプラスでは、ビジョンバリューに共感していただけるエンジニアを募集しています!
ネットクリーニングの「リネット」など「生活領域×テクノロジー」で事業を展開している会社です。
どんな会社か気になった方はオウンドメディア「ホワプラSTYLE」をぜひご覧ください。
オンラインでカジュアル面談もできますので、ぜひお気軽にお問い合わせください。

採用情報 | 株式会社ホワイトプラス