Коли пакет пишеться для конкретного застосунку (або виділяється з нього), незручно щоразу публікувати версію, щоб перевірити зміну. Path-репозиторій підключає пакет з локального каталогу.
~/code/
├── shop/ # застосунок
└── packages/
└── laravel-invoices/ # пакет
У composer.json застосунку:
{
"repositories": [
{
"type": "path",
"url": "../packages/laravel-invoices",
"options": { "symlink": true }
}
],
"require": {
"acme/laravel-invoices": "@dev"
}
}
composer update acme/laravel-invoices
Composer створює символьне посилання vendor/acme/laravel-invoices → ../packages/laravel-invoices. Зміни в коді пакета видно в застосунку одразу, без повторного встановлення.
Що варто знати:
- версія:
@devбере поточний стан каталогу. Якщо в пакеті є Git-теги чи полеversion, можна вимагати й звичайне обмеження (^1.0); - автозавантаження: після додавання нових класів у пакет зазвичай достатньо symlink, але при зміні секції
autoloadуcomposer.jsonпакета -composer dump-autoloadу застосунку; - package discovery спрацьовує як для звичайного пакета;
- у Docker symlink на каталог поза проєктом не працюватиме, якщо цей каталог не змонтовано в контейнер. Часто пакет тримають усередині репозиторію (
packages/у корені) з"url": "packages/*"; symlink: false- копіювання замість посилання: стабільніше для CI чи образів, але зміни потребуютьcomposer update.
Не забути перед публікацією:
- прибрати path-репозиторій з
composer.jsonзастосунку (чи тримати його лише локально) і вимагати опубліковану версію; - перевірити, що пакет встановлюється «з нуля» без застосунку - тести через Orchestra Testbench саме це й перевіряють.
Альтернатива для приватних пакетів: vcs-репозиторій (Git URL), Private Packagist чи Satis - тоді пакет встановлюється з тегів, як публічний.
Стартовий шаблон: замість ручного створення структури можна взяти spatie/package-skeleton-laravel - там уже налаштовані Testbench, Pest, PHPStan, GitHub Actions і публікація конфігурації.