Кілька Laravel-застосунків використовують спільний код: модуль авторизації, клієнт API, набір Blade-компонентів. Є три основні способи.
1. Submodule - посилання на коміт іншого репозиторію:
git submodule add git@github.com:acme/shared.git packages/shared
- точна версія, окрема історія, окремі права доступу;
- незручно: додаткові кроки при клонуванні й оновленні, detached HEAD, легко забути оновити вказівник.
2. Subtree - код копіюється в репозиторій разом з історією:
git subtree add --prefix=packages/shared git@github.com:acme/shared.git main --squash
git subtree pull --prefix=packages/shared git@github.com:acme/shared.git main --squash
git subtree push --prefix=packages/shared git@github.com:acme/shared.git feature-x
- для інших учасників це просто звичайні файли - клон працює без додаткових кроків;
- зміни можна відправити назад в оригінальний репозиторій;
- команди довгі, легко змішати в одному коміті зміни спільного й основного коду;
- історія основного репозиторію росте.
3. Composer-пакет - стандартний спосіб для PHP:
{
"repositories": [
{ "type": "vcs", "url": "git@github.com:acme/shared.git" }
],
"require": { "acme/shared": "^2.1" }
}
- семантичні версії й діапазони, власні залежності пакета, автозавантаження, сервіс-провайдер Laravel;
- оновлення -
composer update acme/shared, аcomposer.lockфіксує точну версію; - приватні пакети - через Private Packagist, Satis чи
vcs-репозиторій з доступом.
Для локальної розробки пакета разом із застосунком - path-репозиторій:
{ "repositories": [{ "type": "path", "url": "../shared" }] }
Composer створює символьне посилання - зміни в пакеті видно одразу.
Порівняння:
| Submodule | Subtree | Composer | |
|---|---|---|---|
| версіонування | коміт | коміт | семантичні версії |
| залежності пакета | ні | ні | так |
| простота для команди | низька | висока | висока |
| зміни в обидва боки | так | так (subtree push) |
у репозиторії пакета |
Для PHP-коду Composer майже завжди кращий. Submodule і subtree доречні для того, що не є PHP-пакетом: документація, спільні конфіги, ресурси. А якщо спільний код змінюється разом із застосунками постійно, - можливо, вам потрібен монорепозиторій.