Коли Composer встановлює пакет з дистрибутива (--prefer-dist, поведінка за замовчуванням для стабільних версій), він завантажує ZIP-архів, який GitHub генерує через git archive. Атрибут export-ignore у .gitattributes виключає файли з цього архіву.
# .gitattributes пакета
/.github export-ignore
/tests export-ignore
/docs export-ignore
/.gitattributes export-ignore
/.gitignore export-ignore
/phpunit.xml.dist export-ignore
/phpstan.neon.dist export-ignore
/pint.json export-ignore
/CHANGELOG.md export-ignore
Перевірити результат локально:
git archive HEAD | tar -t
Виключені файли в списку не з'являться.
Навіщо це:
- менший
vendor/у кожному проєкті, що використовує пакет: тести, документація й конфіги CI пакета там нікому не потрібні; - швидше встановлення і менші образи Docker;
- менше шуму для інструментів, що сканують
vendor/(автодоповнення IDE, статичний аналіз); - не публікувати зайве - внутрішні скрипти, фікстури з даними.
Що не можна виключати:
src/,composer.json, файли, на які посилається автозавантаження;LICENSE- ліцензія має йти разом з кодом;README.mdзазвичай лишають;- ресурси, потрібні пакету під час роботи: шаблони, конфіги, міграції, файли перекладів.
Помилка тут ламає пакет лише при встановленні з дистрибутива: локально в репозиторії все працює, тому варто перевіряти через git archive чи тестове встановлення в чистий проєкт.
Пов'язане: --prefer-source завантажує повний клон репозиторію, і export-ignore там не діє. Інший корисний атрибут - export-subst: підставляє дані коміту (наприклад, $Format:%H$) у файли при створенні архіву.