Клонированный проект с динамическим включением в composer.формат JSON

у меня есть сервер приложений, это как система блога (мой wordpress убийца). Он основан на php, размещенном в github и использующем composer для управления зависимостями. Каждая установка размещается на моем сервере (я делаю установку для них). Когда клиенту требуется новый "аддон / плагин", я создаю новый пакет и размещаю его на хостинге частного репозитория. Проблемы возникают, когда мне нужно добавить новый пакет:

Client 1.
- package for calculate prices

Client 2.
- package for show a welcome message

Client 3.
- package for add a calendar

мое приложение будет иметь каждый пакет, готовый к использованию во всех экземпляры, потому что я требую их через composer:

"require": {
        "killer/calculate": "dev-master",
        "killer/message": "dev-master",
        "killer/calendar": "dev-master"
}

теперь изображение, если у меня есть 2K клиентов, и каждый из них запрашивает пользовательские пакеты. Как я могу предоставить приложение (клонированное массово), но просто сохраняя в каждой установке только пакеты, которые нужны каждому клиенту?

гипотетическое решение

Я искал (если это возможно) что-то вроде следующего. Для каждой установки создайте файл вручную, где его содержимое указывает требуемый пакет. Например, предположим, что установка каждого клиента имеет что-то вроде этого:

//composer.json
"require": {
}

//plugins.json  (this file is ignored via .gitignore)
{
    "killer/calculate": "dev-master"
}

потом, как-то говорит composer.json требовать данные от plugins.json. Таким образом, я избегаю создавать огромный composer.json обмен ненужных пакетов для всех клиентов.

4 ответов


есть запрос для разрешения composer.json для расширения другого файла. Вы должны пойти прокомментировать его, чтобы привлечь к нему внимание.

способ использования этой функции-создать default.json файл, который содержит все ваши регулярные composer.json содержание, в том числе , в котором перечислены все общие пакеты, которые вам нужны.

// default.json
{
    "require": {
        "php": ">=5.4.0"
    }
}
есть для каждого проекта, который расширяет и/или переопределяет default.json как это:
// composer.json
{
    "require": {
        "killer/calculate": "dev-master"
    },
    "extends": "default.json"
}

окончательный результат будет:

{
    "require": {
        "php": ">=5.4.0",
        "killer/calculate": "dev-master"
    }
} 

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


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

основное предложение, которое у меня есть, - это ввести ваше приложение в качестве пакета в эту экосистему.

приложения composer.json содержит только пакеты, относящиеся к самому приложению.

{
  "name": "better/application",
  "require": {
     "another/library": "1.0.0",
     "another/framework": "1.2.3",
     "another/generator": "2.1.3"
  }, 
  "require-dev" : {
     "phpunit/phpunit" : "4.*",
  }
} 

Я думаю, что "клонирование" приложения для клиента / клиента не является хорошая идея, потому что она игнорирует, что плагины имеют зависимости от конкретной версии вашего приложения, которая не всегда является "последней" или "dev-master". Пусть Composer вытащит приложение по версии для каждого клиента.

таким образом я избегаю создавать огромное composer.json обмен ненужных пакетов для всех клиентов.

  • создайте один репозиторий для каждого нового клиента / клиента
  • добавить само приложение и пакеты, запрошенные клиент внутри composer.json
  • добавить конфигурацию клиента сверху

например,composer.json для Client1:

{
  "name": "better/application-for-client1",
  "require": {
     "better/application": "1.0.0",
     "better/app-calculate": "1.2.3"
  }
} 

например,composer.json для Client2:

{
  "name": "better/application-for-client2",
  "require": {
     "better/application": "1.0.1",
     "better/app-calculate": "1.2.4",
     "better/app-message": "2.0.0"
  }
} 

у каждого клиента может быть своя настройка, требующая другой версии вашего приложения с различными дополнительными пакетами приложений / плагинами (здесь указано с помощью префикса "app-").

в конце концов у вас есть два основных файла для клиента: a композитор.json и файл конфигурации.

(как приложение обнаруживает доступные модули-это другая история. По крайней мере, автозапуск будет работать из коробки, когда вы регистрируете autoloader композиторов во время начальной загрузки приложения.)


(Примечание: Если ваше приложение является мульти-сайт приложение, то вы можете заменить "клонирование" на "символическими". С несколькими сайтами я имею в виду приложение, которое работает из одного центрального места, используя идентификатор сайта (часто идентификатор заказчика.) Если у вас есть папка приложения со всеми пакетами для разработки в одной монолитной папке, создайте папку relase, очистив материал разработки, чтобы получить версию выпуска с пустой конфигурацией по умолчанию. Затем символически свяжите приложение, запрошенные пакеты с папкой клиента и поместите конфигурацию сверху. Этот подход может сэкономить довольно много места на диске и вообще не включать Composer.)


Я бы также рекомендовал вам использовать подход, предложенный Йенсом А. Кохом в его ответе, имея композитора.файл json для каждого клиента и требует основного приложения и всех необходимых плагинов. Composer поддерживает этот сценарий довольно хорошо, и я хочу указать вам на отправные точки:

Типы Композитор

Composer позволяет указать типы для пакетов. Вы можете определить свой собственный тип, чтобы отметить плагины для вашего приложения как таковые. Многие open-source проекты (например, Symfony с пакетами) приняли этот подход для своей эко-системы плагинов.

Настраиваемые Установщики

вы можете зарегистрироваться настраиваемые установщики это может выполняться для определенного type пакета composer (т. е. тип, который вы определили для своих плагинов). Затем вы можете настроить процесс установки для своих плагинов, что означает, что вы можете:

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

Мда.. требуйте все пакеты одни..

это означает один большой composer.json ибо все работает с вашей системой / совместимо с вашей системой. Возможно, Вам также придется ввести систему управления версиями.. Таким образом, вы можете закончить с v1_composer.json ..

но для каждого клиента загрузить только необходимые пакеты. Например, создайте requires.php для каждого клиента с необходимыми инструкциями require, которые ссылаются на ваши общие библиотеки.. Это будет самым быстрым решением и самым эффективно, потому что Вы делитесь кодом, которым можете поделиться, и загружаете его только при необходимости

вывод

поделиться как можно больше кода... но не используйте его, когда он вам не нужен.