it-swarm.com.ru

Как разработать и включить пакет Composer?

Я хочу разработать пакет на PHP, но я не хочу, чтобы он был немедленно доступен на GitHub или где-то еще. Достаточно просто включить файл Packagist в мой composer.json, но как мне добавить локальный пакет в мой composer.json? Кроме того, я должен собирать пакет в /vendor/foo/bar (относительно корня composer.json), или я должен поместить его где-нибудь еще?

Правка: Я думаю, мой вопрос о том, как все остальные пишут свои пакеты. Каждый новый пакет добавляется в Packagist, а затем, когда вы хотите протестировать свои изменения, вы фиксируете GitHub (или где-либо еще), а затем возвращаете его обратно через Composer? Это кажется действительно неэффективным.

51
greggilbert

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

Чтобы ответить на ваш первый вопрос: «Как добавить локальный пакет в мой composer.json?»:

Если под «добавить локальный пакет» вы подразумеваете автозагрузку вашего класса/пакета, вы можете сделать это, используя опции PSR-4 или PSR-0 или Classmap в composer. 

Прочитайте больше

Вы можете использовать Google, если вам нужна дополнительная информация о PSR-0, PSR-4 и Classmap.

Пример

"autoload": {
   "psr-4": { "Core\\": "src/Core" }  ## "standard": { "namespace" : "path/to/dir"}
}

Или (Правка)

Если вы действительно хотите добавить локальный пакет:

  1. Создайте composer.json для локального пакета, например:

    {
       "name": "localPackage/core",
       "version": "dev-master"
    }
    

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

  2. Заархивируйте пакет с файлом composer.json в качестве корневого файла в archive.Zip и поместите его в нужное место.

  3. В другом проекте/пакете, в который вы хотите включить локальный пакет, добавьте имя локального пакета к необходимому параметру, например 

    "localPackage/core": "dev-master"
    

    Добавьте следующее под параметром repositories:

    "repositories" : [
        {
            "type": "artifact",
            "url": "path/to/localPackage.Zip"
        }
    ]
    

Теперь, если у вас есть локальный пакет на git, тогда не нужно будет архивировать пакет (в основном, пропустите шаг 2), и вам просто нужно заменить URL-адрес в приведенном выше примере на path/to/localPackage/.git.

(Конец редактирования)


Теперь, чтобы ответить на более широкий вопрос: «Как мне разработать и включить пакет Composer?»:

  1. Определите структуру каталогов. Обычно это так:

    /PackageRoot
        /src/PackageCore
        composer.json   ## this is your library’s composer.json
        LICENSE
    

    и настройте свой composer.json.

    Пример одного из моих composer.json файлов можно найти по адресу http://Pastebin.com/tyHT01Xg .

  2. Загрузите его в Github и отметьте версию . Используйте Семантическое управление версиями (убедитесь, что вы исключаете/игнорируете каталог vendor при загрузке на Github).

  3. Зарегистрируйте пакет с помощью Packagist (после входа в систему).

    Если вы пометили свой коммит как v1.0.0 (или аналогичный), то это отобразится на вашей панели инструментов Packagist для этого пакета.

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

25
ShalomSam

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

https://getcomposer.org/doc/05-repositories.md#path

Например, предположим, что у вас есть PHP проекты под ~/devel/projects

Ваш главный проект может быть в ~/devel/projects/main_project, а ваш "локальный пакет" в ~/devel/projects/local_package

Определите конфигурацию вашего композитора для локального пакета. В ~/devel/projects/local_package/composer.json.

{
    "name": "your_vendor_id/your_local_package",
    ...
}

Затем вы можете отредактировать ~/devel/projects/main_project/composer.json и связать свой локальный пакет с помощью пути repo:

"repositories": [
    {
        "type": "path",
        "url": "../local_package",
        "options": {
            "symlink": true
        }
    }
],
"require": {
    "your_vendor_id/your_local_package": "dev-master",
    ...
}

Больше информации по этой ссылке (не написано мной, но имеет хорошее объяснение на эту тему):

https://carlosbuenosvinos.com/working-at-the-same-time-in-a-project-and-its-dependencies-composer-and-path-type-repository/

16
Federico J. Álvarez Valero

Кажется, что большинство ответов на эту тему не "в курсе". Я новичок в Composer сам, но эти ответы вводят в заблуждение. Вопрос можно просто сформулировать так: «Как мне разработать пакет для композитора».

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

Не поможет то, что официальная документация Composer не заявляет об этом заранее, но вы можете увидеть заголовок на Страница документации библиотеки :

Каждый проект представляет собой пакет

Это очень важно понять

composer.json:

На ранее упомянутой странице указывается:

Для того, чтобы сделать этот пакет устанавливаемым, вам нужно дать ему имя. Вы делаете это, добавляя свойство name в composer.json

{
    "name": "acme/hello-world",
    "require": {
        "monolog/monolog": "1.0.*"
    }
}

В этом примере у нас есть требуемый пакет, а теперь имя. Обратите внимание на формат vendor/name.

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

{
    "autoload": {
        "psr-4": {"Acme\\": "src/"}
    }
}

Это автоматически загрузит файлы классов пространства имен в каталоге src/Acme.

На веселье.

Установить обновление

Установите или обновите пакет с помощью команды:

composer update

или же

php composer.phar update

Это загрузит необходимые пакеты и создаст файл autoload.php

Структура нашего проекта должна выглядеть следующим образом:

src
    Acme
        Foo.php
vendor
    monolog
        ...
composer.json

В том числе

Теперь, чтобы проверить.

Включить autoload.php

require_once 'path/to/project/vendor/autoload.php';

Предполагая, что Foo.php выглядит следующим образом:

<?php

namespace Acme;

class Foo {
    public static function bar(){
        return 'baz';
    }
}

?>

затем мы можем вызвать это из нашего скрипта:

echo Acme\Foo::bar(); // baz

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

10
iautomation

Вот резюме решений плюс мой собственный

  1. опубликовать на Packagist

Поскольку вы еще не хотите публиковать, вы в разработке, это плохой вариант.

  1. загрузить GitHub

Вы можете не захотеть публиковать исходный код своей библиотеки на github, не хотите платить за частное репо или иметь возможность использовать облачный внешний сервис (из-за политических или сетевых политик).

  1. Архив вашей библиотеки

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

  1. загрузить в локальный репозиторий git/svn на вашем компьютере

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

  1. Автозагрузка библиотеки напрямую (sortof делает то, что вы хотите)

Это хак, но вы можете просто добавить:

{    
  "require": {
  },
  "autoload": {
    "psr-4": { 
      "yourlibnamespace": "D:\\Code\\yourlib\\src\\" 
    }
  }

}

Обратите внимание, что вам нужно будет скопировать + вставить раздел 'require' из вашей библиотеки в пример реализации. Измените «yourlibnamespace» на пространство имен вашей библиотеки, а «D:\Code\yourlib\src \» - на локальный путь к источнику библиотеки.

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

  1. добавьте пример реализации прямо в дерево библиотек (рекомендуется)

Обычно у вас просто есть src\и tests \, но у многих есть примеры \, где вы можете найти примеры реализаций. При разработке приложения вы можете внести свой вклад в эти примеры реализации. Вы можете сделать это в локальном репозитории git/svn, и у вас есть преимущество в том, что вы автоматически получаете библиотеку 'require' плюс пространство имен. Это лучшее из всех миров. Я рекомендую этот метод.

7
Finlay Beaton

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

Например, если для /Code/project-1 требуется пакет из /Code/package-1, я:

  1. Зафиксируйте package-1 в GitHub (может быть даже закрытым). 
  2. Затем я говорю project-1 установить его с помощью собственного репозитория (см. Другие ответы для ссылки на конфигурацию репозитория). 
  3. Как только он будет установлен, я символическую ссылку /Code/project-1/vendor/developer/package-1 на /Code/package-1

Таким образом, когда я делаю изменения в /Code/package-1, это немедленно отражается в /Code/project-1.

5
Adam Engebretson

Может быть, добавление собственного репозитория поможет вам?

https://github.com/composer/composer/blob/master/doc/05-repositories.md

Вы можете очень легко настроить локальный git-репозиторий с вашей библиотекой.

Конечно, если вы используете composer для управления зависимостями, вы должны создать свою библиотеку где-нибудь еще и загрузить ее вендору/через composer, потому что это все, что я думаю.

5
fsw

Это мой процесс создания и разработки нового пакета Composer локально:

  1. Создайте новый репозиторий для пакета на GitHub (просто пример)
  2. Добавьте его в базу данных Composer (packagist.org)
  3. Добавьте его в свой основной проект через composer require. Здесь вы начинаете задаваться вопросом, как быстро применить исправления
  4. Клонируйте его где-нибудь на своей локальной машине, именно здесь вы его разрабатываете
  5. Теперь, чтобы протестировать вашу локальную версию, добавьте оператор php require (), в который вы загружаете файлы классов, о которых идет речь. Автозагрузчик загружает не тот, который был загружен через композитор, а ваш локальный. 
  6. Когда вы закончите исправление, удалите/закомментируйте оператор require, чтобы вернуться к использованию версии пакета для композитора.
  7. Зафиксируйте все изменения, отметьте фиксацию и нажмите на GitHub; крюк срабатывает для обновления Composer. Запустите обновление композитора в вашем основном проекте, пакет обновится до вашей локальной версии.

Это все еще не идеально, но это делает работу для небольших и средних пакетов.

5
George Kagan

Мой рабочий процесс не полностью отвечает на вопрос ОП, но может быть полезным для других.

  1. Мне нравится разрабатывать повторно используемый пакет/lib в реальном проекте, и я не хочу проходить через git/composer локально.
  2. Мне также не нравится загружать пакет локально по-другому по сравнению с производством (например, с помощью локального оператора require или локальной настройки composer).

Итак, что я делаю просто: я добавляю пакет прямо в каталог vendor, либо напрямую, либо используя символическую ссылку.

недостатки

  1. При использовании обновления/установки composer ваш пакет может быть перезаписан. (поэтому я склонен обновлять или добавлять зависимости по очереди, в течение этого времени).
  2. Если вы не будете осторожны, установка Comoser в производственной среде может установить другую версию. Так что продолжайте нажимать на ваш пакет и теги версий!
  3. Изменяя зависимости пакета и загружая его в родительский проект через обновление композитора, перезаписывает папку пакета
0
roelleor