Closed15

spatie/package-skeleton-laravel を用いた Laravel パッケージ開発について

ぼこちょぼこちょ

https://github.com/spatie/package-skeleton-laravel

を使った Laravel パッケージ開発について忘れないための備忘録


最初に上記リポジトリにアクセスして Use this template > Create a new repository から自分のアカウントに新規のリポジトリを作成

  • リポジトリ名は laravel-demo-package にしました
  • ひとまずプライベートなリポジトリにしました
ぼこちょぼこちょ

ローカル(WSL2, Ubuntu 20.04)にリポジトリをクローン

$ git clone https://github.com/imo-tikuwa/laravel-demo-package.git

VSCode で開く


開発用に php のイメージを使用した Docker コンテナ環境を作成する

.docker/app/Dockerfilecompose.yml 作成

.docker/app/Dockerfile
FROM composer:2 as composer

FROM php:8.4
SHELL ["/bin/bash", "-oeux", "pipefail", "-c"]

ARG UID=1000
ARG GID=1000
ENV COMPOSER_HOME=/composer
RUN groupmod -o -g ${GID} www-data && \
    usermod -o -u ${UID} -g www-data www-data

COPY --from=composer /usr/bin/composer /usr/bin/composer

WORKDIR /app

RUN apt-get update && \
    apt-get -y --no-install-recommends install \
    git \
    unzip && \
    apt-get clean && \
    rm -rf /var/lib/apt/lists/* && \
    mkdir ${COMPOSER_HOME} && \
    chown -R www-data: ${COMPOSER_HOME}

USER www-data
  • ホスト側(WSL2)の一般ユーザーとUID/GIDを揃える
  • composer も利用可能とする
  • unzip は composer install を実施するときに内部で使われるのでインストール
  • git は 後述する configure.php のセットアップ内で使われるのでインストール
compose.yml
services:
  app:
    build: ./.docker/app
    volumes:
      - .:/app:cached
    tty: true

コンテナ環境起動

$ docker compose up -d

app コンテナの中で php コマンドが使えること、ボリューム共有の設定によってホストにあった Laravel パッケージのコードが存在することを確認

$ docker compose exec app bash

www-data@d262bb4ea4e9:/app php -v
PHP 8.4.4 (cli) (built: Feb 14 2025 02:30:31) (NTS)
Copyright (c) The PHP Group
Built by https://github.com/docker-library/php
Zend Engine v4.4.4, Copyright (c) Zend Technologies

www-data@d262bb4ea4e9:/app$ ls -al
total 92
drwxr-xr-x 10 www-data www-data  4096 Feb 24 01:20 .
drwxr-xr-x  1 root     root      4096 Feb 24 01:33 ..
drwxr-xr-x  3 www-data www-data  4096 Feb 24 01:18 .docker
-rw-r--r--  1 www-data www-data   220 Feb 24 01:12 .editorconfig
drwxr-xr-x  8 www-data www-data  4096 Feb 24 01:32 .git
-rw-r--r--  1 www-data www-data   705 Feb 24 01:12 .gitattributes
drwxr-xr-x  4 www-data www-data  4096 Feb 24 01:12 .github
-rw-r--r--  1 www-data www-data   336 Feb 24 01:12 .gitignore
-rw-r--r--  1 www-data www-data    85 Feb 24 01:12 CHANGELOG.md
-rw-r--r--  1 www-data www-data  1094 Feb 24 01:12 LICENSE.md
-rw-r--r--  1 www-data www-data  3483 Feb 24 01:12 README.md
-rw-r--r--  1 www-data www-data    90 Feb 24 01:20 compose.yml
-rw-r--r--  1 www-data www-data  2267 Feb 24 01:12 composer.json
drwxr-xr-x  2 www-data www-data  4096 Feb 24 01:12 config
-rw-r--r--  1 www-data www-data 11795 Feb 24 01:12 configure.php
drwxr-xr-x  4 www-data www-data  4096 Feb 24 01:12 database
-rw-r--r--  1 www-data www-data     0 Feb 24 01:12 phpstan-baseline.neon
-rw-r--r--  1 www-data www-data   217 Feb 24 01:12 phpstan.neon.dist
-rw-r--r--  1 www-data www-data   901 Feb 24 01:12 phpunit.xml.dist
drwxr-xr-x  3 www-data www-data  4096 Feb 24 01:12 resources
drwxr-xr-x  4 www-data www-data  4096 Feb 24 01:12 src
drwxr-xr-x  2 www-data www-data  4096 Feb 24 01:12 tests
ぼこちょぼこちょ

コンテナ内で spatie/package-skeleton-laravel の初期セットアップのスクリプト(configure.php)を実行

www-data@d262bb4ea4e9:/app$ php configure.php 
Author name: imo-tikuwa
Author email: imo-tikuwa@users.noreply.github.com

Deprecated: trim(): Passing null to parameter #1 ($string) of type string is deprecated in /app/configure.php on line 174

Deprecated: explode(): Passing null to parameter #2 ($string) of type string is deprecated in /app/configure.php on line 195
Author username: imo-tikuwa
Vendor name (imo-tikuwa): 
Vendor username (imo-tikuwa): 
Vendor namespace (Imotikuwa): ImoTikuwa
Package name (app): laravel-demo-package
Class name (LaravelDemoPackage): 
Package description (This is my package laravel-demo-package): 
Enable PhpStan? (Y/n): 
Enable Laravel Pint? (Y/n): 
Enable Dependabot? (Y/n): 
Use Ray for debugging? (Y/n): n
Use automatic changelog updater workflow? (Y/n): 
------
Author     : imo-tikuwa (imo-tikuwa, imo-tikuwa@users.noreply.github.com)
Vendor     : imo-tikuwa (imo-tikuwa)
Package    : laravel-demo-package <This is my package laravel-demo-package>
Namespace  : ImoTikuwa\LaravelDemoPackage
Class name : LaravelDemoPackage
---
Packages & Utilities
Use Laravel/Pint     : yes
Use Larastan/PhpStan : yes
Use Dependabot       : yes
Use Ray App          : no
Use Auto-Changelog   : yes
------
This script will replace the above values in all relevant files in the project directory.
Modify files? (Y/n): 
Execute `composer install` and run tests? (y/N): 
Let this script delete itself? (Y/n):
  • 最初の方で非推奨のワーニングが出たけどそのまま進行
  • ベンダーネームスペースはユーザー名をパスカルケースに直したものに修正
  • パッケージ名はコンテナ内のカレントフォルダ名(app)を元に作成しようとするみたい。今回はリポジトリ名と同じ laravel-demo-package に修正
  • Pint、PHPStanなどはそのまま有効化、Rayというデバッグツール?は無効化

実行後、以下のようになった

ぼこちょぼこちょ

そのままコンテナ内で composer install を実施

www-data@d262bb4ea4e9:/app$ composer install
No composer.lock file present. Updating dependencies to latest instead of installing from lock file. See https://getcomposer.org/install for more information.
Loading composer repositories with package information
Updating dependencies
Lock file operations: 138 installs, 0 updates, 0 removals

~~~長いので省略~~~

70 package suggestions were added by new dependencies, use `composer suggest` to see details.
Generating autoload files
> @php vendor/bin/testbench package:discover --ansi

   INFO  Discovering packages.  

  laravel/pail ................................................................................................................................ DONE
  laravel/tinker .............................................................................................................................. DONE
  nesbot/carbon ............................................................................................................................... DONE
  nunomaduro/collision ........................................................................................................................ DONE
  nunomaduro/termwind ......................................................................................................................... DONE
  orchestra/canvas ............................................................................................................................ DONE
  orchestra/canvas-core ....................................................................................................................... DONE
  pestphp/pest-plugin-laravel ................................................................................................................. DONE
  imo-tikuwa/laravel-demo-package ............................................................................................................. DONE

94 packages you are using are looking for funding.
Use the `composer fund` command to find out more!
phpstan/extension-installer: Extensions installed
> larastan/larastan: installed
> nesbot/carbon: installed
> pestphp/pest: installed
> phpstan/phpstan-deprecation-rules: installed
> phpstan/phpstan-phpunit: installed
ぼこちょぼこちょ

パッケージ内にデフォルトで存在するサービスプロバイダについて

src/LaravelDemoPackageServiceProvider.php
<?php

namespace ImoTikuwa\LaravelDemoPackage;

use Spatie\LaravelPackageTools\Package;
use Spatie\LaravelPackageTools\PackageServiceProvider;
use ImoTikuwa\LaravelDemoPackage\Commands\LaravelDemoPackageCommand;

class LaravelDemoPackageServiceProvider extends PackageServiceProvider
{
    public function configurePackage(Package $package): void
    {
        /*
         * This class is a Package Service Provider
         *
         * More info: https://github.com/spatie/laravel-package-tools
         */
        $package
            ->name('laravel-demo-package')
            ->hasConfigFile()
            ->hasViews()
            ->hasMigration('create_laravel_demo_package_table')
            ->hasCommand(LaravelDemoPackageCommand::class);
    }
}
  • サービスプロバイダについて Laravel 標準の Illuminate\Support\ServiceProvider ではない PackageServiceProvider というクラスを継承している
  • boot や register などのサービスプロバイダに定義すべきメソッドが存在しない
  • configurePackage という見慣れないメソッドの呼び出しが行われている

composer によって vendor 以下にインストールされた spatie/laravel-package-tools パッケージ内の PackageServiceProvider を覗いてみると Laravel 標準のサービスプロバイダを継承したクラスであることがわかる


boot および register について以下のような定義がされている

PackageServiceProvider.php(抜粋)
    /** @throws InvalidPackage */
    public function register()
    {
        $this->registeringPackage();

        $this->package = $this->newPackage();
        $this->package->setBasePath($this->getPackageBaseDir());

        $this->configurePackage($this->package);
        if (empty($this->package->name)) {
            throw InvalidPackage::nameIsRequired();
        }

        $this->registerConfigs();
        $this->packageRegistered();

        return $this;
    }

    public function registeringPackage()
    {
    }

    public function packageRegistered()
    {
    }

    public function boot()
    {
        $this->bootingPackage();

        $this
            ->bootPackageAssets()
            ->bootPackageCommands()
            ->bootPackageConsoleCommands()
            ->bootPackageConfigs()
            ->bootPackageInertia()
            ->bootPackageMigrations()
            ->bootPackageProviders()
            ->bootPackageRoutes()
            ->bootPackageTranslations()
            ->bootPackageViews()
            ->bootPackageViewComponents()
            ->bootPackageViewComposers()
            ->bootPackageViewSharedData();

        $this->packageBooted();

        return $this;
    }

    public function bootingPackage()
    {
    }

    public function packageBooted()
    {
    }

仮に自作のパッケージ内のサービスプロバイダで boot や register のタイミングで何かしたい場合は以下のように書くのが正しそう(と思ってる)

src/LaravelDemoPackageServiceProvider.php
<?php

namespace ImoTikuwa\LaravelDemoPackage;

use Spatie\LaravelPackageTools\Package;
use Spatie\LaravelPackageTools\PackageServiceProvider;
use ImoTikuwa\LaravelDemoPackage\Commands\LaravelDemoPackageCommand;

class LaravelDemoPackageServiceProvider extends PackageServiceProvider
{
    public function configurePackage(Package $package): void
    {
        /*
         * This class is a Package Service Provider
         *
         * More info: https://github.com/spatie/laravel-package-tools
         */
        $package
            ->name('laravel-demo-package')
            ->hasConfigFile()
            ->hasViews()
            ->hasMigration('create_laravel_demo_package_table')
            ->hasCommand(LaravelDemoPackageCommand::class);
    }

+    public function registeringPackage()
+    {
+        // register() の最初に何かする
+    }
+
+    public function packageRegistered()
+    {
+        // register() の最後に何かする
+    }
}

想定した使い方ではないと思うけど一応以下のようにも書けるはず?

src/LaravelDemoPackageServiceProvider.php
<?php

namespace ImoTikuwa\LaravelDemoPackage;

use Spatie\LaravelPackageTools\Package;
use Spatie\LaravelPackageTools\PackageServiceProvider;
use ImoTikuwa\LaravelDemoPackage\Commands\LaravelDemoPackageCommand;

class LaravelDemoPackageServiceProvider extends PackageServiceProvider
{
    public function configurePackage(Package $package): void
    {
        /*
         * This class is a Package Service Provider
         *
         * More info: https://github.com/spatie/laravel-package-tools
         */
        $package
            ->name('laravel-demo-package')
            ->hasConfigFile()
            ->hasViews()
            ->hasMigration('create_laravel_demo_package_table')
            ->hasCommand(LaravelDemoPackageCommand::class);
    }

+    public function register()
+    {
+        // register() の最初に何かする
+        parent::register();
+        // register() の最後に何かする
+    }
}

ちなみにこのサービスプロバイダはパッケージディスカバリの設定が行われているため、アプリケーション側の providers.php などに追加せずに読み込まれる

ぼこちょぼこちょ

パッケージの動作確認を行うために、Laravelのアプリケーションを作成する

www-data@d262bb4ea4e9:/app$ composer create-project --prefer-dist laravel/laravel demo_app
Creating a "laravel/laravel" project at "./demo_app"
Installing laravel/laravel (v11.6.1)
  - Downloading laravel/laravel (v11.6.1)
  - Installing laravel/laravel (v11.6.1): Extracting archive
Created project in /app/demo_app

~~~長いので省略~~~

プロジェクトのルートに demo_app という名前で Laravel 11.x のアプリケーションがインストールできました


laravel-demo-package パッケージをローカルインストールするためにアプリケーション内の composer.json に以下を追記

demo_app/composer.json
{
~~~長いので省略~~~
    "minimum-stability": "stable",
-    "prefer-stable": true
+    "prefer-stable": true,
+    "repositories": [
+        {
+            "type": "path",
+            "url": "../",
+            "options": {
+                "symlink": true
+            }
+        }
+    ]
}
  • アプリケーション側から見てインストールしたいパッケージは一つ上のディレクトリにあるので ../ となる
  • symlink: true によってシンボリックリンクが貼られることによってパッケージ側の修正が即時でアプリケーション側に反映される

開発中のパッケージを Laravel 11.x のアプリケーションにインストール

www-data@d262bb4ea4e9:/app$ cd demo_app/
www-data@d262bb4ea4e9:/app/demo_app$ composer require --dev imo-tikuwa/laravel-demo-package:@dev

ぼこちょぼこちょ

アプリケーションにパッケージをインストールできてることを確認する

パッケージ内のサービスプロバイダで行っている設定によってコンソールコマンドの登録を行っていることがわかるのでその辺の確認を進める

src/LaravelDemoPackageServiceProvider.php
<?php

namespace ImoTikuwa\LaravelDemoPackage;

use Spatie\LaravelPackageTools\Package;
use Spatie\LaravelPackageTools\PackageServiceProvider;
use ImoTikuwa\LaravelDemoPackage\Commands\LaravelDemoPackageCommand;

class LaravelDemoPackageServiceProvider extends PackageServiceProvider
{
    public function configurePackage(Package $package): void
    {
        /*
         * This class is a Package Service Provider
         *
         * More info: https://github.com/spatie/laravel-package-tools
         */
        $package
            ->name('laravel-demo-package')
            ->hasConfigFile() // ⇐ パッケージ固有の設定ファイルがあるよ
            ->hasViews() // ⇐ パッケージ固有のビューがあるよ
            ->hasMigration('create_laravel_demo_package_table') // ⇐ パッケージ固有のマイグレーションがあるよ
            ->hasCommand(LaravelDemoPackageCommand::class); // ⇐ パッケージ固有のコンソールコマンドがあるよ
    }
}

以下はパッケージ作成当初から存在していた LaravelDemoPackageCommand

src/Commands/LaravelDemoPackageCommand.php
<?php

namespace ImoTikuwa\LaravelDemoPackage\Commands;

use Illuminate\Console\Command;

class LaravelDemoPackageCommand extends Command
{
    public $signature = 'laravel-demo-package';

    public $description = 'My command';

    public function handle(): int
    {
        $this->comment('All done');

        return self::SUCCESS;
    }
}
  • 単純なコンソール出力を行うコマンドであることがわかりました
  • laravel-demo-package というシグネチャの設定を確認

アプリケーション内で Artisan CLI から実行できることを確認

www-data@d262bb4ea4e9:/app/demo_app$ php artisan laravel-demo-package
All done

ぼこちょぼこちょ

パッケージについてリモートにプッシュする前に Pint のコード整形 / PHPStan (Larastan) の静的解析 / Pest のテストなどを一通り実施する

www-data@d262bb4ea4e9:/app$ composer format
> vendor/bin/pint

  .✓.................................

  ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── Laravel  
    FIXED   .................................................................................................................................................................... 36 files, 2 style issues fixed  
  ✓ src/LaravelDemoPackageServiceProvider.php                                                                                                                                                   ordered_imports  
  ✓ tests/TestCase.php                                                                                                                                                                          ordered_imports
www-data@d262bb4ea4e9:/app$ composer analyse
> vendor/bin/phpstan analyse
Note: Using configuration file /app/phpstan.neon.dist.
 6/6 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓] 100%


                                                                                                                        
 [OK] No errors
www-data@d262bb4ea4e9:/app$ composer test  
> vendor/bin/pest

   PASS  Tests\ArchTest
  ✓ it will not use debugging functions                                                                                                                                                                   0.16s  

   PASS  Tests\ExampleTest
  ✓ it can test                                                                                                                                                                                           0.01s  

  Tests:    2 passed (4 assertions)
  Duration: 0.28s
  Random Order Seed: 1740366688

リモートにプッシュ(コンテナ内に git CLI が入ってるけど別にコンテナ内でやらないといけないということは無い)

$ git add -A .
$ git commit
$ git push
ぼこちょぼこちょ

spatie/package-skeleton-laravel のスケルトンの中にデフォルトで同梱されている、GitHub Actions の設定によって PHP 8.4 および 8.3 x Laravel 11.x および 10.x x Ubuntu および Windows の組み合わせを対象としたテストが実行される


数分待つとなんか失敗している;o;


実行されているワークフローは以下

.github/workflows/run-tests.yml
name: run-tests

on:
  push:
    paths:
      - '**.php'
      - '.github/workflows/run-tests.yml'
      - 'phpunit.xml.dist'
      - 'composer.json'
      - 'composer.lock'

jobs:
  test:
    runs-on: ${{ matrix.os }}
    timeout-minutes: 5
    strategy:
      fail-fast: true
      matrix:
        os: [ubuntu-latest, windows-latest]
        php: [8.4, 8.3]
        laravel: [11.*, 10.*]
        stability: [prefer-lowest, prefer-stable]
        include:
          - laravel: 11.*
            testbench: 9.*
            carbon: ^2.63
          - laravel: 10.*
            testbench: 8.*
            carbon: ^2.63

    name: P${{ matrix.php }} - L${{ matrix.laravel }} - ${{ matrix.stability }} - ${{ matrix.os }}

    steps:
      - name: Checkout code
        uses: actions/checkout@v4

      - name: Setup PHP
        uses: shivammathur/setup-php@v2
        with:
          php-version: ${{ matrix.php }}
          extensions: dom, curl, libxml, mbstring, zip, pcntl, pdo, sqlite, pdo_sqlite, bcmath, soap, intl, gd, exif, iconv, imagick, fileinfo
          coverage: none

      - name: Setup problem matchers
        run: |
          echo "::add-matcher::${{ runner.tool_cache }}/php.json"
          echo "::add-matcher::${{ runner.tool_cache }}/phpunit.json"

      - name: Install dependencies
        run: |
          composer require "laravel/framework:${{ matrix.laravel }}" "orchestra/testbench:${{ matrix.testbench }}" "nesbot/carbon:${{ matrix.os == 'windows-latest' && '^^^' || '' }}${{ matrix.carbon }}" --no-interaction --no-update
          composer update --${{ matrix.stability }} --prefer-dist --no-interaction

      - name: List Installed Dependencies
        run: composer show -D

      - name: Execute tests
        run: vendor/bin/pest --ci

失敗したワークフローのログを見ると Install dependencies のステップ Laravel 10.x と Pest の組み合わせついて依存解決に失敗した風なログが読めました

よくわからないことがわかった

ぼこちょぼこちょ

今回はこの依存解決について具体的にどうすべきかは考えず、Laravel 10.xのサポートを切る方針としました。
また、 composer.json で PHP 8.4 以上を必要とする設定がされているため、PHP 8.3 でのワークフロー実行はそもそも不可能のはず。。
ということで PHP 8.3 のサポートも切ることにしました。


まずは run-tests ワークフローを修正

.github/workflows/run-tests.yml
name: run-tests

on:
  push:
    paths:
      - '**.php'
      - '.github/workflows/run-tests.yml'
      - 'phpunit.xml.dist'
      - 'composer.json'
      - 'composer.lock'

jobs:
  test:
    runs-on: ${{ matrix.os }}
    timeout-minutes: 5
    strategy:
      fail-fast: true
      matrix:
        os: [ubuntu-latest, windows-latest]
-        php: [8.4, 8.3]
-       laravel: [11.*, 10.*]
+        php: [8.4]
+       laravel: [11.*]
        stability: [prefer-lowest, prefer-stable]
        include:
          - laravel: 11.*
-            testbench: 9.*
            carbon: ^2.63
-          - laravel: 10.*
-            testbench: 8.*
-            carbon: ^2.63

    name: P${{ matrix.php }} - L${{ matrix.laravel }} - ${{ matrix.stability }} - ${{ matrix.os }}

    steps:
      - name: Checkout code
        uses: actions/checkout@v4

      - name: Setup PHP
        uses: shivammathur/setup-php@v2
        with:
          php-version: ${{ matrix.php }}
          extensions: dom, curl, libxml, mbstring, zip, pcntl, pdo, sqlite, pdo_sqlite, bcmath, soap, intl, gd, exif, iconv, imagick, fileinfo
          coverage: none

      - name: Setup problem matchers
        run: |
          echo "::add-matcher::${{ runner.tool_cache }}/php.json"
          echo "::add-matcher::${{ runner.tool_cache }}/phpunit.json"

      - name: Install dependencies
        run: |
-          composer require "laravel/framework:${{ matrix.laravel }}" "orchestra/testbench:${{ matrix.testbench }}" "nesbot/carbon:${{ matrix.os == 'windows-latest' && '^^^' || '' }}${{ matrix.carbon }}" --no-interaction --no-update
+          composer require "laravel/framework:${{ matrix.laravel }}" "nesbot/carbon:${{ matrix.os == 'windows-latest' && '^^^' || '' }}${{ matrix.carbon }}" --no-interaction --no-update
          composer update --${{ matrix.stability }} --prefer-dist --no-interaction

      - name: List Installed Dependencies
        run: composer show -D

      - name: Execute tests
        run: vendor/bin/pest --ci
  • 10.x に関する記述を削除
  • orchestra/testbench について 10.x で8系、11.x で9系をインストールするというマトリックス戦略は不要となったのでその辺含めて修正

パッケージの composer.json について10.x のためのものと思われる記述を削除(具体的には新しい方のパッケージをインストールし直す)

www-data@d262bb4ea4e9:/app$ composer require illuminate/contracts:^11.0
www-data@d262bb4ea4e9:/app$ composer require --dev orchestra/testbench:^9.0.0
www-data@d262bb4ea4e9:/app$ composer require --dev larastan/larastan:^3.0
www-data@d262bb4ea4e9:/app$ composer require --dev nunomaduro/collision:^8.1.1
phpstan/extension-installer:^1.4
www-data@d262bb4ea4e9:/app$ composer require --dev phpstan/phpstan-deprecation-rules:^2.0
www-data@d262bb4ea4e9:/app$ composer require --dev phpstan/phpstan-phpunit:^2.0

変更前後の composer.json の差異。一部のパッケージの並びが変わりました。


ワークフローの修正と composer.json をリモートにプッシュ後、今度はワークフローが正常に終了することが確認できました

  • PHP 8.4 x Laravel 11.x x Ubuntu および Windows の組み合わせで複数のジョブが実行されている
ぼこちょぼこちょ

続けて update-changelog.yml というリリース作成をトリガーとして稼働するワークフローについて動作確認を実施する


リポジトリのサイドバーにある Releases もしくはその下の Create a new release から新規のリリースを作成


タグも併せて作成する


タイトルと本文を埋めた状態で update-changelog のワークフロー実行が正常に行えました


main ブランチのコミットツリーを確認するとワークフロー実行の中で生成した CHANGELOG.md をプッシュしたコミットが確認できました

ぼこちょぼこちょ

作成したリリースに紐づくアセットをダウンロード


展開して中身を覗いてみると動作確認のためのアプリケーション(demo_app)や Docker 環境構築のためのファイルが含まれてしまっています。。


調べてみると .gitattributes によって除外できるそうなので以下のように追記

.gitattributes
# Path-based git attributes
# https://www.kernel.org/pub/software/scm/git/docs/gitattributes.html

# Ignore all test and documentation with "export-ignore".
/.github            export-ignore
/.gitattributes     export-ignore
/.gitignore         export-ignore
/phpunit.xml.dist   export-ignore
/art                export-ignore
/docs               export-ignore
/tests              export-ignore
/workbench          export-ignore
/.editorconfig      export-ignore
/.php_cs.dist.php   export-ignore
/psalm.xml          export-ignore
/psalm.xml.dist     export-ignore
/testbench.yaml     export-ignore
/UPGRADING.md       export-ignore
/phpstan.neon.dist  export-ignore
/phpstan-baseline.neon  export-ignore
+/.docker            export-ignore
+/demo_app           export-ignore
+/compose.yml        export-ignore

修正を main ブランチにマージ後、再度リリースを作成(今回は v0.0.2 というタグを併せて作成し、Generate release notes 押下でタイトルと本文を埋めてみる)


v0.0.2 のリリースに紐づくアセットをダウンロード


不要なコードが除かれていることを確認

  • 58KB あった v0.0.1 と比べて v0.0.2 は 8KB とだいぶ小さくなりました
  • 展開して中を覗いてみて、demo_app.dockercompose.yml について適切に除外されてることが確認できました
ぼこちょぼこちょ

パッケージを Packagist に公開する


まず、プライベートリポジトリで開発を進めていたものを Packagist で公開するためにパブリック化


Packagist の submit ページにアクセス


Repository URL に GitHub のリポジトリURLを入力して Check を押下


The package name found for your repository is~~ のメッセージが表示されたら内容を確認して Submit を押下


パッケージ固有のページに遷移する


1分ほど待ってからページをリロードしたところパッケージについて公開が完了していました

ぼこちょぼこちょ

公開が完了したパッケージをアプリケーションにインストールする

パッケージの動作確認用に構築した Laravel 11.x のアプリケーション(demo_app)があるのでそちらにインストールしてみます

www-data@d262bb4ea4e9:/app$ cd demo_app/
www-data@d262bb4ea4e9:/app/demo_app$ composer require --dev imo-tikuwa/laravel-demo-package

In PackageDiscoveryTrait.php line 334:
                                                                                                                                                                                                                
  Package imo-tikuwa/laravel-demo-package exists in composer repo (https://repo.packagist.org) and path repo (../) which has a higher repository priority. The packages from the higher priority repository do  
   not match your minimum-stability and are therefore not installable. That repository is canonical so the lower priority repo's packages are not installable. See https://getcomposer.org/repoprio for detail  
  s and assistance.                                                                                                               
  • 動作確認用のアプリケーションではローカルインストールのための repositories 設定を行っており、そちらが優先された結果として上記のようなエラーが出てしまいました

ChatGPT 君に聞いて composer.json に canonical: false という設定を追加(よくわかってない)

demo_app/composer.json (抜粋)
{
~~~省略~~~
    "repositories": [
        {
            "type": "path",
            "url": "../",
            "options": {
                "symlink": true
-            }
+            },
+            "canonical": false
        }
    ]
}

再トライしたところ現在の最新のリリースである v0.0.2 がインストールできました

www-data@d262bb4ea4e9:/app/demo_app$ composer require --dev imo-tikuwa/laravel-demo-package
./composer.json has been updated
Running composer update imo-tikuwa/laravel-demo-package
Loading composer repositories with package information
Updating dependencies
Lock file operations: 0 installs, 1 update, 0 removals
  - Upgrading imo-tikuwa/laravel-demo-package (dev-main => v0.0.2)
Writing lock file
Installing dependencies from lock file (including require-dev)
Package operations: 0 installs, 1 update, 0 removals
  - Downloading imo-tikuwa/laravel-demo-package (v0.0.2)
  - Removing imo-tikuwa/laravel-demo-package (dev-main)
  - Installing imo-tikuwa/laravel-demo-package (v0.0.2): Extracting archive
Generating optimized autoload files
> Illuminate\Foundation\ComposerScripts::postAutoloadDump
> @php artisan package:discover --ansi

   INFO  Discovering packages.  

  imo-tikuwa/laravel-demo-package ............................................................................................................. DONE
  laravel/pail ................................................................................................................................ DONE
  laravel/sail ................................................................................................................................ DONE
  laravel/tinker .............................................................................................................................. DONE
  nesbot/carbon ............................................................................................................................... DONE
  nunomaduro/collision ........................................................................................................................ DONE
  nunomaduro/termwind ......................................................................................................................... DONE

83 packages you are using are looking for funding.
Use the `composer fund` command to find out more!
> @php artisan vendor:publish --tag=laravel-assets --ansi --force

   INFO  No publishable resources for tag [laravel-assets].  

No security vulnerability advisories found.
Using version ^0.0.2 for imo-tikuwa/laravel-demo-package
  • パッケージディスカバリに関する設定も行えてそうなログが読める

パッケージに含まれるコンソールコマンドが実行できることを確認

$ php artisan laravel-demo-package
All done

vendor ディレクトリ以下のパッケージインストール先を確認し、demo_app.dockercompose.yml などパッケージとして公開する際には不要なコードが含まれていないことも確認できました

ぼこちょぼこちょ

その他

今回のスクラップ内で実際に作成したパッケージは以下(アーカイブ済み)

https://github.com/imo-tikuwa/laravel-demo-package


また、今回の学習の中で実際に Laravel 11.x で利用可能なパッケージとして以下のようなものを作成しました

https://github.com/imo-tikuwa/laravel-make-with-format

  • Laravel PintIDE Helper Generator for Laravel などのライブラリによるコード修正を Artisan CLI から実行可能な make:〇〇 のコマンド実行後に自動実行することができます
    • コミット前の Pintによるフォーマットし忘れモデルクラス作成後の ide-helper:models コマンドによる phpdoc の生成し忘れ を防ぐことができるかも
  • 今のところ PHP 8.3 以上でインストール可能なパッケージとしています

参考サイト

https://github.com/spatie/laravel-package-tools
https://zenn.dev/circleback/articles/laravel-package-creation-howto

このスクラップは2025/02/24にクローズされました