Как конфигурировать и использовать приватные хранилища рецептов Flex

Дата обновления перевода 2022-02-01

Как конфигурировать и использовать приватные хранилища рецептов Flex

Начиная с релиза версии 1.16 symfony/flex, вы можете создавать свои собственные приватные хранилища рецептов Symfony Flex, и беспроблемно интегрировать их в установку пакетов composer и процесс обслуживания.

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

  • Создать приватное хранилище GitHub;
  • Создать свои приватные рецепты;
  • Создать индекс рецептов;
  • Сохранить ваши рецепты в приватное хранилище;
  • Гарантировать composer доступ к приватному хранилищу;
  • Сконфигурировать файл вашего проекта composer.json; и
  • Установить рецепты в ваш проект.

Создайте приватное хранилище GitHub

Войдите в свой аккаунт GitHub.com, нажмите на иконку вашего аккаунта в верхнем правом углу, и выберите Ваши хранилища. Затем нажмите кнопку Новое, заполните имя хранилища, выберите селективную кнопку Приватное, и нажмите на кнопку Создать хранилище.

Создайте ваши приватные рецепты

Рецепт symfony/flex - это JSON-файл, который имеет следующую структуру:

1
2
3
4
5
6
7
8
9
{
    "manifests": {
        "acme/package-name": {
            "manifest": {
            },
            "ref": "7405f3af1312d1f9121afed4dddef636c6c7ff00"
        }
    }
}

Если ваш пакет является приватным пакетом Symfony, у вас в рецепте будет следующее:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
{
    "manifests": {
        "acme/private-bundle": {
            "manifest": {
                "bundles": {
                    "Acme\\PrivateBundle\\AcmePrivateBundle": [
                        "all"
                    ]
                }
            },
            "ref": "7405f3af1312d1f9121afed4dddef636c6c7ff00"
        }
    }
}

Замените acme и private-bundle на ваши собственные детали пакета. Запись "ref" - это произвольная строка из 40 символов, используемая composer, чтобы определить, был ли изменен ваш рецепт. Каждый раз, когда вы будете вносить изменения в ваш рецепт, вам также нужно будет генерировать новое значение "ref".

Tip

Используйте следующий PHP-скрипт, чтобы сгенерировать произвольное значение "ref":

1
echo bin2hex(random_bytes(20));

Запись "all" говорит symfony/flex создать запись в вашем файле проекта bundles.php для всех окружений. Чтобы загрузить ваш пакет только для окружения dev, замените "all" на "dev".

Имя вашего JSON-файла рецепта должно соответствовать следующим соглашениям, где 1.0 - это номер версии вашего пакета (замените acme и private-bundle на ваши собственные приватные детали пакета):

acme.private-bundle.1.0.json

Вы скорее всего также захотите, чтобы symfony/flex создал файлы конфигурации для вашего пакета в каталоге проекта /config/packages. Чтобы сделать это, измените JSON-файл рецепта следующим образом:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
{
    "manifests": {
        "acme/private-bundle": {
            "manifest": {
                "bundles": {
                    "Acme\\PrivateBundle\\AcmePrivateBundle": [
                        "all"
                    ]
                },
                "copy-from-recipe": {
                    "config/": "%CONFIG_DIR%"
                }
            },
            "files": {
                "config/packages/acme_private.yaml": {
                    "contents": [
                        "acme_private:",
                        "    encode: true",
                        ""
                    ],
                    "executable": false
                }
            },
            "ref": "7405f3af1312d1f9121afed4dddef636c6c7ff00"
        }
    }
}

Чтобы увидеть больше примеров того, что вы можете добавить в файл рецепта, просмотрите файлы рецептов Symfony.

Создайте индекс рецептов

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

Файл index.json имеет следующий формат:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
{
    "recipes": {
        "acme/private-bundle": [
            "1.0"
        ]
    },
    "branch": "master",
    "is_contrib": true,
    "_links": {
        "repository": "github.com/your-github-account-name/your-recipes-repository",
        "origin_template": "{package}:{version}@github.com/your-github-account-name/your-recipes-repository:master",
        "recipe_template": "https://api.github.com/repos/your-github-account-name/your-recipes-repository/contents/{package_dotted}.{version}.json"
    }
}

Создайте запись в "recipes" для каждого из рецептов вашего пакета. Замените your-github-account-name и your-recipes-repository на собственные детали.

Сохраните ваши рецепты в приватном хранилище

Загрузите файл(ы) рецепта(ов) .json и файл index.json в корневой каталог вашего приватного хранилища GitHub.

Гарантируйте composer доступ к приватному хранилищу

В вашем аккаунте GitHub, нажмите на иконку вашего аккаунта в правом верхнем углу, выберите Settings и Developer Settings. Затем, выберите Personal Access Tokens.

Сгенерируйте новый токен доступа с привилегиями Full control of private repositories. Скопируйте значение токена, переключитесь на терминал вашего локального компьюетра, и выполните следующую команду:

1
$ composer config --global --auth github-oauth.github.com [token]

Замените [token] на значение вашего личного токена доступа GitHub.

Сконфигурируйте файл composer.json вашего проекта

Добавьте следующуу к вашему файлу проекта composer.json:

1
2
3
4
5
6
7
8
9
10
{
    "extra": {
        "symfony": {
            "endpoint": [
                "https://api.github.com/repos/your-github-account-name/your-recipes-repository/contents/index.json",
                "flex://defaults"
            ]
        }
    }
}

Замените your-github-account-name и your-recipes-repository на собственные детали.

Tip

Клюс extra.symfony скорее всего будет существовать в вашем composer.json. В таком случае, добавьте ключ "endpoint" к существующей записи extra.symfony.

Tip

URL endpoint должен указывать на https://api.github.com/repos, а не на https://www.github.com.

Установите рецепты в ваш проект

Если ваши приватные пакеты еще не были установлены в вашем проекте, выполните следующую команду:

1
$ composer update

Если приватные пакеты уже были установлены, и вы просто хотите установить новые приватные рецепты, выполните следующую команду:

1
$ composer recipes