совместное использование переменной env между проектами turborepo monorepo
Я установил базовый проект turborepo и хочу использовать переменные .env для всех приложений и некоторых пакетов. Если я установлю один файл .env в корне проекта и как все приложения и пакеты могут получить к ним доступ. Или мне нужно установить несколько файлов .env во всех приложениях и пакетах?
8 ответов
По состоянию на 22 декабря рекомендуемый способ сделать это согласно официальномуturbo
документы выглядят следующим образом:
-
cd root-directory-of-your-project
. -
npm add -D dotenv-cli
(или сpnpm
:pnpm add -D dotenv-cli -w
). - Создайте файл в корневом каталоге вашего проекта.
- Добавьте свой в корень вашего проекта
.gitignore
.
- Добавьте свой в корень вашего проекта
- Добавьте свои переменные во вновь созданный
.env
файл.- Если вы используете
nextjs
не забудьте префикс ваших общедоступных переменных сNEXT_PUBLIC_*
(пример:NEXT_PUBLIC_GOOGLE_ANALYTICS_TOKEN=1234
).
- Если вы используете
- На ваше
turbo.json
файл, добавьте переменные, в которых каждыйpipeline
работа зависит.- Пример:
{ "$schema": "https://turborepo.org/schema.json", "pipeline": { "dev:frontend": { "outputs": ["dist/**", ".next/**"], "env": ["NEXT_PUBLIC_GOOGLE_ANALYTICS_TOKEN"] }, "dev:backend": { "outputs": ["dist/**", ".next/**"], "env": ["DATABASE_URL"] } } }
- Перезапустите локальный сервер разработки. Попробуйте войти
process.env.NEXT_PUBLIC_GOOGLE_ANALYTICS_TOKEN
.
После завершения структура проекта должна выглядеть примерно так:
apps
backend <<< Your backend code. You don't need to keep any .env file here.
frontend <<< Your frontend code. You don't need to keep any .env file here.
package.json <<< Where you should install dotenv-cli as a dev dependency.
turbo.json <<< Where pipeline jobs and their dependencies on environment variables are specified.
.env <<< Where all your environment variables will be stored.
Вы можете указать
globalDependencies
вариант в вашей конфигурации турбо или используйте
--global-deps
Флаг CLI.
{
// ... rest of the turbo config
globalDependencies: ['.env']
}
или же
turbo run build --global-deps=".env.*"
Ссылки из документов:
https://turborepo.org/docs/reference/configuration#globaldependencies https://turborepo.org/docs/reference/command-line-reference#--global-deps
Следующие турбо-документы – Использование переменных среды
Шаги:
- Добавьте dotenv-cli в корень проекта.
# Installs dotenv-cli in the root workspace
yarn add dotenv-cli --ignore-workspace-root-check
- Обновите корневой скрипт (который запускает ваш проект с турбо), в моем случае «dev».
"scripts": {
"dev": "dotenv -- turbo run dev",
...
}
вы можете оставить настройку глобальных зависимостей турбо по умолчанию в турбо.json
"globalDependencies": ["**/.env.*local"]
Необязательный:
- Если у вас есть CRA, создайте .env.local в корне приложения CRA и разверните переменную.
в корне рабочей области .env:
VARIABLE=value
в корне CRA .env.local:
REACT_APP_VARIABLE=${VARIABLE}
Перезагрузить сервер.
Чтобы загрузить переменные env из .env в env процесса, вы можете использовать https://www.npmjs.com/package/dotenv.
Затем, чтобы поделиться переменными env в вашем монорепозитории:
В каждой рабочей области/приложении добавьте
require('dotenv').config({path: /custom/path/to/.env})
(предполагая здесь общее разрешение модуля js) как можно раньше в соответствии с документами (имеется в виду, например, для следующего приложения js в next.config.js), где
/custom/path/to/.env
будет относительный путь к вашему корневому .env (например, две папки вверх:
../../.env
)
Этот пакет @dotenv-run/cli может помочь.
.env.* files
может быть определен в корневой рабочей области и переопределен каждым приложением
/workspace
apps
frontend1
.env.local # API_USERS=http://localhost:3001/users
src/
.env.dev # API_BASE=https://dotenv-run.dev
.env.prod # API_BASE=https://dotenv-run.app
.env # API_USERS=$API_BASE/api/v1/users API_AUTH=https://$API_BASE/auth
package.json
turbo.json
$> cd /workspace/apps/frontend1
$> NODE_ENV=dev dotenv-run -- bash -c 'printf "✨API_USERS $API_USERS\n✨ API_AUTH $API_AUTH"'
✔ /workspace/apps/frontend1/.env.local
✔ /workspace/.env.dev
✔ /workspace/.env
✨ API_USERS http://localhost:3001/users
✨ API_AUTH https://dotenv-run.dev/api/v1/auth
- Добавьте dotenv-cli в корень вашего проекта.
npm add -D dotenv-cli
- обновить скрипт
"dev": "dotenv -- turbo run dev",
- Добавьте файл .env в корень проекта.
Из документов
The globalDependencies
упоминается в других ответах, как говорится в документах:
Список файловых глобусов для неявных глобальных хеш-зависимостей. Содержимое этих файлов будет включено в глобальный алгоритм хеширования и повлияет на хэши всех задач. Это полезно для очистки кеша на основе файлов .env (не в Git) или любого файла корневого уровня, который влияет на задачи рабочей области.
Таким образом, необходимо кэшировать эту конкретную задачу, создавать и т. Д. При турбо-кэшировании, но не загружать ее в приложение.
Чтобы загрузить переменные env из централизованного файла в несколько процессов, вы можете использовать мой новый пакет https://www.npmjs.com/package/dotenv-mono , который был разработан специально для этой цели.
Установите dotenv-моно (
yarn add dotenv-mono
илиnpm install dotenv-mono --save
)Разместите свой
.env
файл в корне вашего проектаЗатем загрузите его следующим образом в файл инициализации пакетов/приложений (
index.{js,ts}
,next.config.js
, и т. д...):require("dotenv-mono").load();
Посетите страницу github для получения дополнительной документации https://github.com/marcocesarato/dotenv-mono.
Я нашел этот подход к работе.
- Установить (
yarn install env-cmd
) - Создайте сценарий оболочки с именем
turbo-run.sh
который делает следующее:
# remember to use direct paths to files because yarn has a habit
# of stripping out `--` flags (which are used in turborepo to pass
# in extra args to turbo commands)
./node_modules/.bin/env-cmd \
--file $ENV_FILE \
./node_modules/.bin/turbo run \
$@
(такжеchmod +x
это так, чтобы вы могли его выполнить)
- Затем настройте сценарии package.json так, чтобы
turbo-run
команда, которая вызывает./turbo-run.sh
- Теперь вы можете сделать
yarn turbo-run foo
и убедитесь, что он всегда вызываетenv-cmd
с соответствующим файлом ENV_FILE.