2015-10-02 2 views
4

Я создаю SDK для разработчиков, чтобы использовать для создания модулей для платформ электронной торговли, которые будут использовать наш API для нового запуска.Использование пакетов PHP без Composer

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

Так что мне интересно, как наилучшим образом получить все зависимости, которые нужны мои текущие пакеты, и построить их в автономном SDK.

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

Существует ли стандартизированный способ сделать это с точки зрения шаблона проектирования? Как я могу организовать все пакеты зависимостей любым организованным способом?

+0

Вместо того, чтобы отвечать только на то, чтобы указать на модель AWS, почему бы вам не написать самостоятельный ответ после того, как вы сформулировали стратегию для своего собственного проекта. –

ответ

0

Не имеют зависимостей!

Да, серьезно. Если вы разработаете клиент API, который будет использовать Guzzle в качестве HTTP-клиента, вам нужно сделать выбор: использовать Guzzle версии 3, 4, 5 или 6?

Guzzle 3 не обслуживается и заброшен. Вы не захотите его использовать.

Guzzle 4 также считается окончанием срока службы, поскольку версия 5 была очень быстрой. Никто не использует эту версию.

Это сводится к использованию либо версии 5, либо 6. Но Guzzle использует одно и то же пространство имен и, вероятно, те же имена классов в обеих версиях, но несовместимы друг с другом. Независимо от того, какую версию вы выберете: ваш клиент сделает противоположный выбор - и теперь у вас есть кодовая база, в которой одновременно работают две версии Guzzle - это не сработает.

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

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

Update

Теперь, узнав, что все думают, что я сумасшедший предлагает не использовать материал, изобретенный в другом месте, я призываю вас еще раз подумать о ситуации: Вы обнаружите, что вы должны создать код, который будет вероятно, будет включен в кодовую базу, которая НЕ управляется с помощью Composer. Это означает, что вы не представляете, какое программное обеспечение там собрано.

Это может быть просто так, что у вас есть версия Guzzle в существующей кодовой базе - невозможно обнаружить, потому что нет composer.json. Теперь вы предоставляете свой собственный пакет в комплекте с версией Guzzle (независимо от того, как он появился там). Это может привести к сбою всего программного обеспечения в какой-то момент из-за конфликтов, поскольку автозагрузка, конечно же, будет объединена в какой-то момент, а затем часть кода запросит некоторый класс Guzzle для загрузки, который включен дважды из двух разных версий из Гуззала.

ЧТО ДОЛЖНО ПРОИЗОЙТИ В ЭТОМ СЛУЧАЕ? ВЕЩИ БУДУТ СКАЗАТЬ!

И это неизбежно, что это произойдет. Даже в счастливом случае использования Composer это будет конфликтовать - программное обеспечение не будет разбиваться, но весь пакет не будет установлен. Хорошо: вы сразу заметите это.

Если основная задача состоит в том, чтобы доставить клиент API, который любой может использовать в любой ситуации, без использования менеджера зависимостей: Не имеют зависимостей!

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

Мой центральный пункт: Если у вас нет менеджера зависимостей, например, Composer, который может управлять зависимостями, вам лучше не иметь зависимостей в своем собственном коде, чтобы сделать его очень простым для включения собственного кода в кто-то другой код базы.

И в приведенном выше вопросе четко указано, что композитор не является вариантом в общем случае.

Теперь в конце туннеля есть один свет: когда дело доходит до общих задач, PHP-FIG начал стандартизировать интерфейсы, которые должны использовать интероперабельность. Для HTTP стандарт - PSR-7.

Вы МОЖЕТЕ предоставить API-интерфейс API, который зависит (и приносит с собой) интерфейс PSR-7 и требует, чтобы пользователь SDK предоставлял HTTP-клиент, который реализует этот интерфейс.

Проблема с этим подходом, я вижу, что вы все равно столкнетесь с неприятностями, если попытаетесь использовать, например, Guzzle по той же причине: единственный правильный выбор сейчас - использовать Guzzle 6 для SDK - что, если Guzzle 5 был уже использован в другом месте? Конфликт! Хорошая вещь: вы можете избежать использования Guzzle 6, если вы уже используете Guzzle 5, используя любой другой HTTP-клиент с поддержкой PSR-7.

+0

Если -1 избиратель может объяснить, что я ответил плохо, все выиграют. – Sven

+3

Потребовалось PHP 15+ лет, чтобы добраться до места, где интероперабельность могла быть последовательной и надежной. Ужасно советовать избегать использования существующего общего кода только потому, что управление версиями _without_ самого инструмента, предназначенного для обработки (Composer), является сложным. Возраст «не придумал здесь» в PHP-коде, наконец, прошел. Поскольку вы решительно используете Guzzle в качестве примера, можете ли вы заменить все функции Guzzle встроенными функциями PHP? Да. Но нецелесообразно изобретать все эти шаблоны, если вы не используете лишь небольшую часть своих функций. –

+0

@MichaelBerkowski. Подключение к Интернету по-прежнему не так просто или достаточно для заметного количества людей во всем мире. Композитор - это инструмент, зависящий от Интернета. – SaidbakR

1

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

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

  1. Создать временную рабочую директорию:

    $ mkdir -p ~/.tmp && cd ~/.tmp 
    
  2. Clone пакет:

    $ git clone <package> 
    
  3. Установить зависимости

    $ cd ~/.tmp/<package> && composer.phar install --no-dev --optimize-autoloader 
    

    или, если вы делаете это с автоматизированной инструмент:

    $ cd ~/.tmp/<package> && composer.phar install --no-ansi --no-dev --no-interaction --no-progress --no-scripts --optimize-autoloader 
    
  4. Удалить .git каталог.

  5. Создать архив зип/деготь из ~/.tmp/<package>

  6. Распределить архив.

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


1) Что касается --optimize-autoloader, пожалуйста, прочитайте this answer от Sven, что объясняет, почему в некоторых случаях не помогает вашему приложению стать быстрее.

+0

Не слепо запускайте с помощью '--optimize-autloader', если вы не проверяли, что это быстрее и сколько. – Sven

+0

@Sven Можете ли вы привести конкретный пример, где classmap медленнее PSR-0/4? –

+0

Все подробности в этом ответе: https://stackoverflow.com/questions/22803419/why-use-a-psr-0-or-psr-4-autoload-in-composer-if-classmap-is-actually -faster/22823995 # 22823995 Это, по сути, компромисс между минимальным объемом работы поиска, необходимым для файловой системы, и всегда тратой ресурсов на создание классовой карты. – Sven

Смежные вопросы