- PVSM.RU - https://www.pvsm.ru -

Локальный пакет Composer для создания проектов

Проблема.

Предположим такую ситуацию: Вам необходимо создать сервис, который будет основой для ряда последующих. Наследники этого сервиса, например, могут создаваться копированием папки родителя и установкой зависимостей внутри себя. И жить они все должны в моно-репозитории.

Какие пути решения сразу приходят на ум? Самое простое, наверное, создать подобный alias (если вы в *nix):

alias create-project="cp -r project/ new-project/ && cd new-project/ && composer install"

Конечно есть желание сделать все более элегантно и поэтому следующим по счету, но первым по разумности, в голову приходит решение использовать возможности Composer.

Официальные пути решения

Решения предлагаемые Composer [1]:

  1. Платный Private Packagist [2];
  2. Бесплатный Satis [3];
  3. Собственный packages.json [4].

Первый вариант хорош, но не подойдет если у Вас нет желания платить, и Вы хотите обойтись по максимуму своими силами.

Второй вариант довольно таки грубый, особенно в случае если необходимо придумать решение для малого количества своих библиотек. Согласитесь, что поднимать сервис для хостинга [5] одной-двух библиотек — это такое себе решение.

Третий вариант весьма скудно описан в официальной документации, и его описания нет в части про создание своих локальных библиотек.

С чем едят packages.json

В документации [6] сказано, что composer использует файл packages.json для получения базовой мета-информации пакета:

{
    "packages": {
        "vendor/package-name": {
            "dev-master": { 
                "name": "vendor/package-name",
                "version": "1.1.3",
                "dist": {
                    "url": "./path/to/package",
                    "type": "path"
                }            
            },
        }
    }
}

Это готовый файл, который можно передавать в команду create-project, как аргумент repository:

composer create-project --repository=./path/to/packages.json vendor/package-name new-project-name

К сожалению без танцев с бубном, описанная выше конфигурация и команда не создают новую папку с проектом. После выполнения команды мы получаем symlink на папку оригинального проекта с названием нового проекта. Нас такое не устраивает, поэтому идем искать ответы в документацию.

Все описано в документации

К счастью так и есть. Очень многое описано в документации, но, к сожалению, у Composer там много белых пятен.

Вроде как в схеме packages.json должны быть свойства:

"options": {
    "symlink": false
}
// или
"transport-options": {
    "symlink": false
}

Но ни первое, ни второе не работают как ожидается, куда бы их не пристраивали. При этом ошибок при небольших нарушениях схемы не возникает.

Для установления истины мне пришлось создать issue [7] в github репозитории composer. Пока нет официального ответа, что и послужило стимулом написать заметку. Надеюсь мне ответят и появится более интересное решение. О чем молчать конечно не буду.

Решение

В документации есть описание переменной окружения COMPOSER_MIRROR_PATH_REPOS [8]. Она управляет необходимым нам поведением. С помощью команды ниже мы добавим ее в систему:

export COMPOSER_MIRROR_PATH_REPOS=1

Эту строку необходимо выполнить в командной строке и, желательно, добавить в .bashrc, чтобы она автоматически выполнялась при открытии новой сессии терминала. Сделать это можно, например, так:

echo "export COMPOSER_MIRROR_PATH_REPOS=1" >> ~/.bashrc

Теперь при выполнении команды на создание проекта, composer создаст копию локального пакета, а не symlink на папку-источник.

Автор: весёлый усач

Источник [9]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/php-2/278611

Ссылки в тексте:

[1] предлагаемые Composer: https://getcomposer.org/doc/articles/handling-private-packages-with-satis.md#handling-private-packages

[2] Private Packagist: https://getcomposer.org/doc/articles/handling-private-packages-with-satis.md#private-packagist

[3] Satis: https://getcomposer.org/doc/articles/handling-private-packages-with-satis.md#satis

[4] packages.json: https://getcomposer.org/doc/05-repositories.md#packages

[5] хостинга: https://www.reg.ru/?rlink=reflink-717

[6] документации: https://getcomposer.org/doc/05-repositories.md#types

[7] issue: https://github.com/composer/composer/issues/7274

[8] COMPOSER_MIRROR_PATH_REPOS: https://getcomposer.org/doc/03-cli.md#composer-mirror-path-repos

[9] Источник: http://habrahabr.ru/sandbox/115362/