Добавить новые переменные среды в .env при установке пакета

В нашей компании несколько внутренних проектов полагаются на одни и те же скопированные части кода для обработки соединений с одними и теми же API (например, Google Suite, JIRA и т. д.). Чтобы избежать повторного копирования одного и того же кода для новых проектов, я хочу создать пакеты Symfony, которые собирают эти классы API.

Сложная часть: я ищу способ автоматически добавить необходимые переменные env в .env, как Структура рецептов Symfony делает это. Но поскольку эти проекты следует использовать только для внутреннего использования, то размещение их конфигурации рецептов в общедоступном репозитории для меня недопустимо. Добавление собственного сервера рецептов (например, от moay) кажется мне интересным, но требует дополнительной настройки в каждом проекте composer.json.

Есть ли лучший способ решить эту проблему, чтобы я мог просто определить необходимые переменные исключительно в моем проекте, чтобы они добавлялись в .env без какой-либо дополнительной магии?

NB: все, что требует symfony/flex, подходит, так как это должно быть частью всех новых проектов в нашей компании.

Это решения, которых я хочу избежать:

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

person Nico Haase    schedule 06.10.2020    source источник
comment
какие переменные вы добавляете? Будут ли они более подходящими в качестве переменных конфигурации?   -  person craigh    schedule 07.10.2020
comment
Существует нерешенный вопрос о глобальном разрешении конфигурации конечных точек. Если он будет реализован, вы можете просто добавить его в профили разработчиков.   -  person msg    schedule 07.10.2020
comment
@craigh конфигурация состоит из двух переменных, и, как и в других моих проектах, я хочу использовать для этого переменную env, поскольку эти переменные не должны находиться под управлением исходного кода   -  person Nico Haase    schedule 07.10.2020
comment
Для решения подобной проблемы у нас есть отдельный проект, в котором хранятся все конфиги. Сценарий развертывания знает, куда подключаться для получения конфигов. Поэтому на этапе развертывания он подключается к проекту, берет конфиги для конкретного проекта и заменяет его в проекте (этот подход может быть слишком сложным, если у вас не слишком много проектов).   -  person Sergei Karpov    schedule 29.11.2020
comment
@SergeiKarpov спасибо, что поделились своим опытом, но, честно говоря, это еще один шаг, который требует настройки для каждого проекта (с точки зрения: запустить эту специальную часть для сбора конфигурации), и это то, чего я хотел бы избежать.   -  person Nico Haase    schedule 30.11.2020
comment
Вы также ищете возможность автоматического заполнения файла .env на локальном компьютере? Если нет и вы используете сценарий развертывания в разных средах, то Ansible может выполнить некоторую работу как часть развертывания. Но если вы пытаетесь сделать это и на своем локальном компьютере, не могли бы вы использовать докер для запуска сервера?   -  person Tuhin    schedule 02.12.2020
comment
Что вы имеете в виду под местным? composer require работает только на машинах разработчиков, но я не вижу связи с Docker   -  person Nico Haase    schedule 02.12.2020
comment
@UrmatZhenaliev, можете ли вы поделиться более подробной информацией об этом конфигураторе env? Насколько я знаю, работает только с общедоступными рецептами.   -  person Nico Haase    schedule 02.12.2020


Ответы (2)


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

https://getcomposer.org/doc/articles/scripts.md

Composer не может запустить скрипт после установки

Пример есть в файле symfony composer.json.

...
"scripts": {
    "auto-scripts": {
        "cache:clear": "symfony-cmd",
        "assets:install %PUBLIC_DIR%": "symfony-cmd"
    },
    "post-install-cmd": [
        "@auto-scripts"
    ],
    "post-update-cmd": [
        "@auto-scripts"
    ]
},
...

После каждого обновления или установки запускается эта команда post-update-cmd, post-install-cmd.

person Ramazan APAYDIN    schedule 30.11.2020
comment
Можете ли вы поделиться более подробной информацией? Редактирование composer.json для добавления такой конфигурации в качестве сценариев после того, как сам пакет уже требуется, - это то, чего я хочу избежать. - person Nico Haase; 30.11.2020
comment
Symfony flex использует ту же логику. Он добавляет параметры, необходимые при установке пакета, в файл .env. Вы сделаете то же самое с событиями композитора. - person Ramazan APAYDIN; 30.11.2020
comment
При установке ваших пакетов вы добавите нужные параметры в файл .env с помощью оболочки или php. - person Ramazan APAYDIN; 30.11.2020
comment
Нет, добавление параметров вручную — определенно недопустимо, и в конце концов рецепты Symfony работают не так. - person Nico Haase; 30.11.2020
comment
Например, это конфигурация пакетов Doctrine для добавления DATABASE_URL в ваш проект: github.com/symfony/recipes/blob/master/doctrine/doctrine-bundle/ — не требуется дополнительная настройка в composer.json, не требуется ручная работа, Flex делает всю работу за ты - person Nico Haase; 30.11.2020
comment
Flex — это плагин для композитора. Он работает после каждого пакета, установленного с помощью Composer. github.com/symfony/flex/blob/ - person Ramazan APAYDIN; 30.11.2020
comment
Что вам нужно сделать, так это настроить ту же логику для себя. - person Ramazan APAYDIN; 30.11.2020
comment
Я знаю о Flex, я уже написал свои собственные рецепты для других целей — поэтому я упомянул об этом в своем первом посте. Добавление нашего собственного пакета типа composer-plugin может быть решением, но мне все еще любопытно, есть ли более простой способ - person Nico Haase; 30.11.2020

В Symfony файл .env теперь зафиксирован в репозитории. Поэтому не рекомендуется размещать на нем конфиденциальные данные.

Лучшее решение — создать файл с именем .env.local. Этот файл не зафиксирован и переопределяет все значения среды в .env

так что вы могли бы в .env

MY_SENSITIVE_DATA=mypersonalkey

и в вашем .env.local

MY_SENSITIVE_DATA=the_real_sensitive_data

источник: https://symfony.com/doc/current/configuration.html#overriding-environment-values-via-env-local

person Nicoweb    schedule 27.11.2020
comment
Я не говорил об использовании конфиденциальной конфигурации в этих переменных, я просто ищу способ поместить их в .env автоматически при запросе пакета - person Nico Haase; 28.11.2020