совместное использование переменной env между проектами turborepo monorepo

Я установил базовый проект turborepo и хочу использовать переменные .env для всех приложений и некоторых пакетов. Если я установлю один файл .env в корне проекта и как все приложения и пакеты могут получить к ним доступ. Или мне нужно установить несколько файлов .env во всех приложениях и пакетах?

8 ответов

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

  1. cd root-directory-of-your-project.
  2. npm add -D dotenv-cli(или сpnpm:pnpm add -D dotenv-cli -w).
  3. Создайте файл в корневом каталоге вашего проекта.
    • Добавьте свой в корень вашего проекта.gitignore.
  4. Добавьте свои переменные во вновь созданный.envфайл.
    • Если вы используетеnextjsне забудьте префикс ваших общедоступных переменных сNEXT_PUBLIC_*(пример:NEXT_PUBLIC_GOOGLE_ANALYTICS_TOKEN=1234).
  5. На ваше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"]
        }
      }
    }
    
  6. Перезапустите локальный сервер разработки. Попробуйте войти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

Следующие турбо-документы – Использование переменных среды

Шаги:

  1. Добавьте dotenv-cli в корень проекта.
      # Installs dotenv-cli in the root workspace
yarn add dotenv-cli --ignore-workspace-root-check
  1. Обновите корневой скрипт (который запускает ваш проект с турбо), в моем случае «dev».
      "scripts": {
    "dev": "dotenv -- turbo run dev",
    ...
}   

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

      "globalDependencies": ["**/.env.*local"]

Необязательный:

  1. Если у вас есть 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
  1. Добавьте dotenv-cli в корень вашего проекта.
      npm add -D dotenv-cli
  1. обновить скрипт
      "dev": "dotenv -- turbo run dev",
  1. Добавьте файл .env в корень проекта.

Из документов

The globalDependenciesупоминается в других ответах, как говорится в документах:

Список файловых глобусов для неявных глобальных хеш-зависимостей. Содержимое этих файлов будет включено в глобальный алгоритм хеширования и повлияет на хэши всех задач. Это полезно для очистки кеша на основе файлов .env (не в Git) или любого файла корневого уровня, который влияет на задачи рабочей области.

Таким образом, необходимо кэшировать эту конкретную задачу, создавать и т. Д. При турбо-кэшировании, но не загружать ее в приложение.

Чтобы загрузить переменные env из централизованного файла в несколько процессов, вы можете использовать мой новый пакет https://www.npmjs.com/package/dotenv-mono , который был разработан специально для этой цели.

  1. Установите dotenv-моно (yarn add dotenv-monoилиnpm install dotenv-mono --save)

  2. Разместите свой.envфайл в корне вашего проекта

  3. Затем загрузите его следующим образом в файл инициализации пакетов/приложений (index.{js,ts},next.config.js, и т. д...):

            require("dotenv-mono").load();
    

Посетите страницу github для получения дополнительной документации https://github.com/marcocesarato/dotenv-mono.

Я нашел этот подход к работе.

  1. Установить (yarn install env-cmd)
  2. Создайте сценарий оболочки с именем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это так, чтобы вы могли его выполнить)

  1. Затем настройте сценарии package.json так, чтобыturbo-runкоманда, которая вызывает./turbo-run.sh
  2. Теперь вы можете сделатьyarn turbo-run fooи убедитесь, что он всегда вызываетenv-cmdс соответствующим файлом ENV_FILE.
Другие вопросы по тегам