Как игнорировать каталоги с помощью Composer?
Я хочу опубликовать библиотеку PHP и отправить ее на Packagist, чтобы установить ее через Composer.
Моя библиотека имеет следующую структуру:
lib/
tests/
composer.json
README.md
В принципе, всякий раз, когда я включаю эту библиотеку в проект composer.json
, мне бы хотелось, чтобы все было скопировано за исключением каталога tests
, что является громоздким и необходимо только при разработке самой библиотеки. Это просто пустая трата пространства (особенно при упаковке проекта для производства).
Можно ли исключить этот каталог из библиотеки composer.json
?
Ответы
Ответ 1
В Composer это невозможно. Однако есть несколько способов сделать это:
-
Когда вы запускаете команду обновления или установки с помощью --prefer-dist
, Composer пытается загрузить архив в github. Вы можете удалить тестовый каталог из архивов, поместив его в файл .gitattributes
в корневой каталог вашего проекта:
Tests/ export-ignore
-
Композитор будет использовать теги только для github. Просто временное удаление каталога тестов при создании тега также будет делать трюк.
Ответ 2
Можно управлять созданием архива, добавляя шаблоны исключений в файл composer.json
внутри клавиши archive
. Подробности смотрите в https://getcomposer.org/doc/04-schema.md#archive.
Приведенный пример (цитируется по приведенному выше URL):
{
"archive": {
"exclude": ["/foo/bar", "baz", "/*.test", "!/foo/bar/baz"]
}
}
The example will include /dir/foo/bar/file
, /foo/bar/baz
, /file.php
, /foo/my.test
but it will exclude /foo/bar/any
, /foo/baz
, и /my.test
.
Таким образом, у вас будет примерно тот же элемент управления, который .gitattributes
даст вам, без необходимости использовать Git или влиять на какие-либо процессы, которые требуют других настроек в указанном файле.
Ответ 3
Это было возможно с 11 ноября 2015 года с https://getcomposer.org/doc/04-schema.md#exclude-files-from-classmaps
Источник: https://github.com/composer/composer/issues/4456#issuecomment-155825777
РЕДАКТИРОВАНИЕ: Неправильная интерпретация. Вышеупомянутое позволяет автозагрузчику игнорировать указанные пути, на самом деле это не предотвращает их копирование в файловую систему при установке.
Ответ 4
Это можно автоматизировать с помощью post-update-cmd
файла composer.json
внутри клавиши scripts
:
"scripts": {
"post-update-cmd": [
"rm -rf vendor/aura/intl/tests vendor/cakephp/cakephp/tests"
],
},