Composer - это популярный менеджер пакетов для PHP, который используется для управления зависимостями в проектах. Он позволяет быстро и легко устанавливать и обновлять пакеты из публичных репозиториев Packagist. Однако, иногда бывает необходимо создать приватные репозитории Composer для хранения и управления собственными пакетами или зависимостями.

В этой статье мы рассмотрим, как создать приватные репозитории Composer, используя несколько примеров.

Шаг 1: Установка Satis

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

Сначала необходимо установить Composer, если вы еще этого не сделали. Затем можно установить Satis с помощью следующей команды:

composer create-project composer/satis --stability=dev --keep-vcs

Эта команда создаст директорию "satis" со всем необходимым для работы Satis.

Шаг 2: Создание конфигурации

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

Для этого нужно создать файл "satis.json" в корневой директории Satis и добавить следующий код:

{
    "name": "My Private Repository",
    "homepage": "https://example.com",
    "repositories": [
        {
            "type": "vcs",
            "url": "git@github.com:username/my-package.git"
        }
    ],
    "require-all": true,
    "output-dir": "web/"
}

В этом примере мы создаем приватный репозиторий с именем "My Private Repository", который будет храниться на домене "https://example.com". Мы также добавляем репозиторий типа "vcs" с URL-адресом нашего пакета в GitHub. Затем мы используем параметр "require-all", чтобы указать Satis включить все зависимости, необходимые для нашего пакета. Наконец, мы указываем папку, в которую будут сохранены JSON-файлы для каждого пакета.

Шаг 3: Генерация репозитория

После настройки конфигурации вам нужно сгенерировать приватный репозиторий с помощью Satis. Для этого выполните следующую команду из директории Satis:

php bin/satis build satis.json web/

Эта команда запускает процесс генерации JSON-файлов для каждого пакета и сохраняет их в указанную папку. В нашем примере файлы будут сохранены в папку "web/".

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

Шаг 4: Добавление приватного репозитория в проект

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

{
    "repositories": [
        {
            "type": "composer",
            "url": "https://example.com"
        }
    ],
    "require": {
        "username/my-package": "1.0.0"
    }
}

В этом примере мы добавляем репозиторий типа "composer" с URL-адресом вашего приватного репозитория. Затем мы указываем зависимость нашего пакета "username/my-package" версии "1.0.0".

Выполните команду composer update, чтобы Composer установил зависимости из вашего приватного репозитория.

Теперь ваш проект будет использовать пакет из приватного репозитория.

Аутентификация для приватных репозиториев

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

  1. SSH-аутентификация;

  2. HTTP-аутентификация.

SSH-аутентификация

Если ваш приватный репозиторий хранится на сервере Git с использованием SSH-аутентификации, вам необходимо убедиться, что ваш сервер настроен для аутентификации по SSH ключу. После этого Composer автоматически использует ваши SSH ключи для доступа к репозиторию.

HTTP-аутентификация

Аутентификация HTTP Basic

Для использования аутентификации HTTP Basic вам нужно добавить учетные данные в URL вашего приватного репозитория в файле composer.json вашего проекта. Пример:

{
    "repositories": [
        {
            "type": "composer",
            "url": "https://username:password@example.com"
        }
    ],
    "require": {
        "username/my-package": "1.0.0"
    }
}

В приведенном выше примере мы добавляем имя пользователя и пароль в URL вашего приватного репозитория. Затем мы указываем зависимость нашего пакета "username/my-package" версии "1.0.0".

Аутентификация с помощью токена

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

{
    "repositories": [
        {
            "type": "composer",
            "url": "https://token@example.com"
        }
    ],
    "require": {
        "username/my-package": "1.0.0"
    }
}

В приведенном выше примере мы добавляем токен доступа в URL вашего приватного репозитория. Затем мы указываем зависимость нашего пакета "username/my-package" версии "1.0.0".

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

Заключение

Создание приватных репозиториев Composer позволяет эффективно управлять зависимостями и облегчает распространение собственных пакетов в вашем проекте. С помощью инструментов, таких как Satis и аутентификация, вы можете создать приватные репозитории и легко интегрировать их в свои проекты. Пользуйтесь этими знаниями, чтобы оптимизировать разработку ваших PHP-проектов с использованием Composer!

Комментарии (8)


  1. mokhovcom
    19.05.2023 09:04
    +1

    простите, а зачем такие сложности?
    ведь можно в проекте напрямую подключить репозиторий:

    {
      ...,
      "required": [
        ...,
        "username/my-package": "^1.0"
      ],
      "repositories": [
        {
          "type": "github",
          "url": "git@github.com:username/my-package.git"
        }
      ]
    }

    зачем нужен промежуточный слой в виде Satis?


    1. wakart Автор
      19.05.2023 09:04

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


    1. arokettu
      19.05.2023 09:04

      Например:

      • Если пакеты друг от друга зависят, автоматически подтянутся нужные приватные зависимости

      • Если приватных пакетов много, быстрее пройдет composer update


      1. mokhovcom
        19.05.2023 09:04

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

        • весьма сомневаюсь, что composer update будет быстрее

        Если делать через satis, то его конфиг нужно будет каждый раз обновлять при появлении новых тэгов в приватных репозиториях, такое себе удовольствие


        1. arokettu
          19.05.2023 09:04
          +1

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

          Я имею в виду случай когда у вас несколько проектов, там используется библиотечка A и она зависит от библиотечки B. B прописывается в Satis, а на проектах подтягивается автоматически

          весьма сомневаюсь, что composer update будет быстрее

          Композеру не придется парсить теги с каждого репозитория по новой, он просто скачивает нужные готовые манифесты с репозитория, довольно существенная разница если приватных репов 10+, кроме того при правильной настройке в проект будут скачиваться не клонированные репозитории, а zip-архивы, если вы используете сервер который так умеет, например, приватный GitLab

          Если делать через satis, то его конфиг нужно будет каждый раз обновлять при появлении новых тэгов в приватных репозиториях, такое себе удовольствие

          Тут согласен, поэтому планирую перейти на Packeton. Ну и наоборот, если проект один и там 2-3 кастомных зависимости, то даже Satis это overkill


          1. mokhovcom
            19.05.2023 09:04

            если есть приватный GitLab, то ещё проще


            1. arokettu
              19.05.2023 09:04

              Да, тоже хороший вариант, хотя и бета еще. Мне, к сожалению, не очень подходит


  1. arokettu
    19.05.2023 09:04

    1. satis умеет читать auth.json как обычный composer, не стоит прописывать доступы в конфиге

    2. начиная с определенного количества пакетов стоит начать думать об активных системах типа Repman или Packeton (или раскошелиться на Private Packagist)