Ошибка сборки Gatsby, если отсутствует переменная среды

Я экспериментировал с добавлением переменных среды в свой проект Gatsby, используя файлы .env.development и .env.production, и он отлично работает.

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

Я прочитал документацию по переменным среды Gatsby, но не понимаю, как это сработает? Это возможно?

Я считаю, что он использует плагин dotenv / webpack define под капотом.


person harveyives    schedule 12.06.2020    source источник


Ответы (2)


Я уверен, что есть и другие способы сделать это, но после некоторых быстрых тестов этот подход, похоже, мне подходит.

В вашем gatsby-config.js файле вы можете явно указать dotenv, чтобы вы могли использовать эти переменные среды в своей конфигурации.

Я добавил следующее, и теперь сборка Gatsby завершится ошибкой, если не будут указаны указанные переменные среды.

// Load the environment variables, per
// https://www.gatsbyjs.org/docs/environment-variables/#server-side-nodejs
require('dotenv').config({
  path: `.env.${process.env.NODE_ENV}`,
})

function checkEnv(envName) {
  if (typeof process.env[envName] === 'undefined' || process.env[envName] === '') {
    throw `Missing required environment variables: ${envName}`
  }
}

try {
  checkEnv('NODE_ENV')
  checkEnv('EXAMPLE_MISSING_ENV')
  checkEnv('EXAMPLE_API_KEY')
} catch (e) {
  throw new Error(e)
}

// The rest of the config file

Я мог бы представить, как настроить это дальше, например. регистрация предупреждения для переменной с резервным вариантом вместо выдачи ошибки для переменной, которая требуется для вашего плагина или темы поиска контента. Надеюсь, это будет полезно в качестве отправной точки!

person kennethormandy    schedule 13.06.2020

Я также не смог найти встроенного решения для этого на Гэтсби. Вы можете сделать это вручную, но все же не так просто.

Первая проблема: если вы хотите загрузить среду из файла во время выполнения сценария npm; его нельзя сразу загрузить. Но вы можете запустить файл сценария, и он может загрузить эти переменные среды перед вашей проверкой.

скажем build.sh в корневом каталоге проекта:

source ./.env.development # this line will set env variables
if [ "$API_KEY" = 927349872349798 ] ; then
  npm run build
fi

Возникает другая проблема; некоторые разработчики могут захотеть запустить его в Windows. Так что лучше используйте известный пакет cross-env.

npm i cross-env

Тогда все готово, добавляем свой secure-build:

  "scripts": {
    "build": "gatsby build",
    "develop": "gatsby develop",
    "format": "prettier --write \"**/*.{js,jsx,json,md}\"",
    "start": "npm run develop",
    "serve": "gatsby serve",
    "clean": "gatsby clean",
    "test": "echo \"Write tests! -> https://gatsby.dev/unit-testing\" && exit 1",
    "secure-build": "cross-env-shell \"./build.sh\""
  },

И запускаем его:

npm run secure-build

Мне это решение кажется слишком большим, поскольку мы создали build.sh и установили новый пакет. Может есть более чистое решение. В конце концов, я не гуру Гэтсби.

person Kerem atam    schedule 12.06.2020