Laravel の独自パッケージを複数バージョンで管理する方法

こんにちは❗フリーランス・エンジニアの 九保すこひ です。

さてさて、前回記事では久しぶりにLaravelのパッケージ「laravel-js-helper」を公開しました。

実は少し前までよくLaravelの独自パッケージをつくって公開していたのですが、最近はあまり「気乗りがしない」というか、なんとなく避けている部分がありました。

「あんなに好きだったのになぜだろう❓」

と考えていたのですが、この度その理由を突き止めることができました。
その理由とは・・・・・・

「メンテナンスがめんどう…😣」

というものです。

つまり、Laravelに新バージョンが追加になるとその都度、パッケージごとに開発環境をつくらないといけないので「うーん、仕事じゃないし、、後でね…」となってしまうのです。

そこで❗

今回は、「1つのフォルダで複数バージョン向けのパッケージ開発」をする方法を考えてみました。

ぜひ何かの参考になりましたら嬉しいです。😄✨

※ 今回はさすがに需要が少ないと思いますが、ぜひ一流ピッチャーがよくやる「緩急をつけたピッチング」だとお考えください。そのうち豪速球ストレート投げますね(笑)

「ワンインチパンチが
打てるようになりたい❗」

前提として

今回は実際の例として、以下4つのバージョンに向けて、1つのフォルダだけでパッケージ管理する方法をご紹介します。

  • Laravel 6.x
  • Laravel 7.x
  • Laravel 8.x
  • Laravel 9.x

また、サンプルとしてとりあげるのは前回記事で紹介した「laravel-js-helper」ですが、もちろん自由にご自身のパッケージ名に置き換えてOKです。

※ なお、この記事では「パッケージ本体のつくりかた」は書いてません。ゴメンナサイ。もし興味がある方は、その昔別ブログで書いたこちらの記事をご覧ください。今でも基本は同じだと思います。

では、やってみましょう❗

パッケージのためのフォルダを用意する

まずは、フォルダ構成です。

あるフォルダに各Laravelがインストールされていると思いますが、このフォルダと「並列の位置」に「packages」フォルダを作成します。

そして、このpackagesフォルダの中に実際のパッケージ名がついたフォルダを用意します。(今回の例は「laravel-js-helper」になります)

つまり、階層で言うと以下のようになります。

開発フォルダ
└  laravel6x
└  laravel7x
└  laravel8x
└  laravel9x
└  packages
  └  laravel-js-helper 

そして、このままでは各Laravelフォルダからpackagesフォルダを参照できないので「シンボリック・リンク」を貼り「あたかもそこに存在しているように」します。

私の環境はUbuntuなので、以下のようなコマンドで実行できます。

ln -s /(開発フォルダ)/laravel9x/packages packages

windowsでシンボリック・リンクを使う方法は以下をご参照ください。(クラスメソッドさんはホント有益ページしかありませんね 👍)

📝 参考ページ: Windowsでシンボリックリンクを作る

すると、Laravel9xフォルダ内に「packages フォルダが存在している」ことにしてくれます。

後は、残りの「laravel8x」「laravel7x」「laravel6x」フォルダにも同じくシンボリック・リンクを貼れば完了です。

※ ちなみに、後で紹介する「ユニットテスト」ができるよう、あえてこの位置にリンクをつくっています。

これでパッケージを一元管理できるフォルダ構成になりました❗

composer でローカルのパッケージがインストールできるようにする

Laravelのパッケージはcomposerで管理することになりますが、いちいちGitHubに上げてPackagistに反映されるのを待って、インストールして…となるといくら時間があっても足りません。

そこで❗

composer.jsonをいじって、「ローカルに置いてるパッケージ」をインストールできるようにします。

以下のコードを追加してください。

composer.json

// 省略

"repositories": [
    {
        "type": "path",
        "url": "packages/your-package-name"
    }
],

※「your-package-name」は自由に変更してください。

これで、例えば以下のようにしてローカルのパッケージをインストールすることができるようになります。

composer require "sukohi/laravel-js-helper @dev"

なお、一度ローカルからパッケージをインストールすると、その都度インストールしなくても変更がダイレクトで反映されます。便利ですね👍

パッケージ内のユニットテストが実行できるようにする

複数バージョン向けにパッケージをつくる場合、ユニットテストがあればコマンドを実行するだけでうまくいっているかチェックでき、とても便利です。

そこで、ここでは「パッケージ内にある」ユニットテストが実行できるようcomposer.jsonを変更してみましょう。

composer.json

"autoload-dev": {
    "psr-4": {
        "Tests\\": "tests/",
        "Vendor\\YourPackageName\\Tests\\": "packages/your-package-name/tests/"
    }
},

※ 「Vendor」、「YourPackageName」、そして「your-package-name」は自由に変更してください。

そして、phpunit.xmlへパッケージ内にあるテスト・フォルダを指定すれば完了です。

phpunit.xml

<!-- 省略 -->

<testsuites>
    <testsuite name="Unit">
        <directory suffix="Test.php">./tests/Unit</directory>
    </testsuite>
    <testsuite name="Feature">
        <directory suffix="Test.php">./tests/Feature</directory>
    </testsuite>
    <!-- 👇 ここを追加 -->
    <testsuite name="YourPackageNameFeature">
        <directory suffix="Test.php">./packages/your-package-name/tests/Feature</directory>
    </testsuite>
</testsuites>

<!-- 省略 -->

これでユニットテストの準備も完了です❗

実際にやってみる

では、実際にユニットテストがうまくいっているか見てみましょう。(以下は、前回記事でつくったパッケージ「laravel-js-helper」のものです)

実行するコマンドは、php artisan testです。

はい❗
うまくパッケージ内のユニットテストを実行することができました。

成功です 😄✨

※ なお、Laravel 6.xにはphp artisan testはないので、./vendor/bin/phpunitを使ってください。

企業様へのご提案

今回の記事のように、独自パッケージをつくっておくと複数サイトで「コードの再利用」をすることができます。

例えば、以下のような独自パッケージはいかがでしょうか。

  • 御社が独自で使っている「請求書」や「商品」の独自採番している ID を簡単に取得できるパッケージ
  • 社内で統一された領収書のフォーマットを使って PDF を作成するパッケージ
  • 各サイトで必要になるプライバシー・ポリシーや利用規約を共通化したパッケージ

※ なお、パッケージはGitHubで非公開にすることができますので、社内専用パッケージにすることができます。
※ ただし、あまりにバージョンが違うと依存関係でうまくいかない場合もあります

もしご興味があるようでしたら、ぜひ一度お問い合わせからご相談ください。
お待ちしております。😄✨

おわりに

ということで今回は「みなさんの需要度外視 😂」でパッケージを複数バージョンで開発する方法をご紹介しました。

Laravelに限らず、パッケージ開発はあまり話題にならない気がします(…ということはニッチ産業 !?)が、独自パッケージをつくっておけば開発のショートカットができます。

ぜひ皆さんも独自のパッケージをつくってみてくださいね。(かっこいいパッケージ名が思い浮かんだらモチベーションさらに上がりますよ👍)

ではでは〜❗

「昔は中二病っぽい
パッケージ名つけてました😅」

開発のご依頼お待ちしております 😊✨
開発のご依頼はこちらから: お問い合わせ
どうぞよろしくお願いいたします!
このエントリーをはてなブックマークに追加       follow us in feedly  

開発効率を上げるための機材・まとめ