spatie/package-skeleton-laravel を用いた 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/Dockerfile
と compose.yml
作成
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 /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 のセットアップ内で使われるのでインストール
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

パッケージ内にデフォルトで存在するサービスプロバイダについて
<?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 について以下のような定義がされている
/** @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 のタイミングで何かしたい場合は以下のように書くのが正しそう(と思ってる)
<?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() の最後に何かする
+ }
}
想定した使い方ではないと思うけど一応以下のようにも書けるはず?
<?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 に以下を追記
{
~~~長いので省略~~~
"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

アプリケーションにパッケージをインストールできてることを確認する
パッケージ内のサービスプロバイダで行っている設定によってコンソールコマンドの登録を行っていることがわかるのでその辺の確認を進める
<?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
<?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;
実行されているワークフローは以下
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 ワークフローを修正
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
xLaravel 11.x
xUbuntu および Windows
の組み合わせで複数のジョブが実行されている

続けて update-changelog.yml というリリース作成をトリガーとして稼働するワークフローについて動作確認を実施する
リポジトリのサイドバーにある Releases もしくはその下の Create a new release
から新規のリリースを作成
タグも併せて作成する
タイトルと本文を埋めた状態で update-changelog のワークフロー実行が正常に行えました
main ブランチのコミットツリーを確認するとワークフロー実行の中で生成した CHANGELOG.md をプッシュしたコミットが確認できました
↓

作成したリリースに紐づくアセットをダウンロード
展開して中身を覗いてみると動作確認のためのアプリケーション(demo_app
)や Docker 環境構築のためのファイルが含まれてしまっています。。
調べてみると .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
、.docker
、compose.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
という設定を追加(よくわかってない)
{
~~~省略~~~
"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
、.docker
、compose.yml
などパッケージとして公開する際には不要なコードが含まれていないことも確認できました

その他
今回のスクラップ内で実際に作成したパッケージは以下(アーカイブ済み)
また、今回の学習の中で実際に Laravel 11.x で利用可能なパッケージとして以下のようなものを作成しました
-
Laravel Pint や IDE Helper Generator for Laravel などのライブラリによるコード修正を Artisan CLI から実行可能な
make:〇〇
のコマンド実行後に自動実行することができます- コミット前の
Pintによるフォーマットし忘れ
やモデルクラス作成後の ide-helper:models コマンドによる phpdoc の生成し忘れ
を防ぐことができるかも
- コミット前の
- 今のところ PHP 8.3 以上でインストール可能なパッケージとしています
参考サイト