Dotenv-webpack в производстве?

Я пытаюсь использовать плагин dotenv-webpack. Это отлично работает локально. Но терпит неудачу, когда я развертываю в Heroku.

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

Моя конфигурация веб-пакета выглядит так:

const path = require('path');
const Dotenv = require('dotenv-webpack');

module.exports = {
  context: path.join(__dirname, '/src'),

  entry: {
    javascript: './js/index'
  },

output: {
  filename: 'bundle.js',
  path: path.join(__dirname, '/dist'),
},

resolve: {
  alias: {
    react: path.join(__dirname, 'node_modules', 'react')
  },
  extensions: ['.js', '.jsx'],
},

module: {
  rules: [
  {
    test: /\.jsx?$/,
    exclude: /node_modules/,
    loaders: ['babel-loader'],
  },
  {
    test: /\.html$/,
    loader: 'file?name=[name].[ext]',
  },
 ],
},
plugins: [
  new Dotenv({
    path: path.resolve(__dirname,'.env')
  }),
 ]
};

Я ожидаю, что там, где плагин dotenv написан, как указано выше, он разрешит мой файл .env (который находится в корне проекта вместе с webpack.config) во время сборки, тем самым предоставив моему проекту доступ к env vars. Вместо этого env vars undefined в Heroku. У меня есть env var, установленный в Heroku. Ключ установлен на что-то вроде SECRET_KEY. Значение установлено на что-то вроде 123456. Может ли кто-нибудь дать мне некоторое представление?


person sWarren    schedule 18.01.2019    source источник
comment
вы можете установить свои env vars на панели инструментов heroku для производства...   -  person SakoBu    schedule 19.01.2019
comment
@SakoBu Привет, спасибо за ответ. Я сделал на самом деле. Может я их не правильно сопоставляю? Мой файл .env выглядит примерно так: SECRET_KEY=123456 В моей панели управления Heroku ключ установлен на SECRET_KEY, а значение установлено на 123456. Имеет ли это смысл?   -  person sWarren    schedule 19.01.2019
comment
github.com/motdotla/dotenv/issues/126 .env для производства НЕ РЕКОМЕНДУЕТСЯ геройку. Set config vars — это то, что они рекомендуют для настроек ENV.   -  person Robert Rowntree    schedule 19.01.2019


Ответы (4)


Я не использую Heroku и не пробовал. Но я понимаю, что если вы определили переменные на панели инструментов Heroku, то эти переменные являются системными переменными, поэтому вам нужно использовать опцию systemvars: true «dotenv-webpack».

В качестве декларации (повторяю, я никогда не использовал Heroku): все это зависит от того, как работает развертывание Heroku, если вы создаете приложение внутри Heroku (вы вызываете Webpack внутри Heroku), тогда оно работает, но если вы отправляете построенное приложение в Heroku (вы не вызываете Webpack внутри Heroku), тогда он не работает.

person xeladejo    schedule 02.11.2019

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

const path = require('path');
const webpack = require('webpack')
module.exports = {
  entry: './src/index.js',
  mode: 'production',
  output: {
    filename: 'main.js',
    path: path.resolve(__dirname, 'dist'),
  },
  node: {
    fs: 'empty'
  },
  plugins: [
    new webpack.DefinePlugin({
      'process.env': {
         'API_KEY': JSON.stringify(process.env.API_KEY)
      }
    })
  ]
};

Как и эти образцы в вашем файле webpack.prod.js.

person OLUWATOSIN.A AKINYELE    schedule 30.07.2019
comment
Или вы можете использовать new webpack.EnvironmentPlugin и напрямую передать свой объект с именами переменных - person Radu Chiriac; 25.10.2019

На самом деле, эта проблема возникает из-за значений среды сервера Heroku. потому что в производственном режиме dotenv вызывает реальную переменную среды, я имею в виду это:

echo $SECRET_KEY

Но он возвращает undefined, почему? потому что в производственном режиме файл .env не будет виден. поэтому, если вы серьезно относитесь к использованию плагина dotenv-webpack, вам следует передать path для разработки так же, как ваш код:

plugins: [
  new Dotenv({
    path: path.resolve(process.cwd(), '.env'),
  }),
 ],

А для производства есть два пути:

  1. передавая непосредственно в конфигурации веб-пакета:
plugins: [
  new webpack.DefinePlugin({
    'process.env': {
      'SECRET_KEY': '123456'
    },
  }),
],
  1. заполните переменную среды сервера. для простого сервера Linux я предпочитаю использовать export SECRET_KEY=123456, но для Heroku прочитайте эту статью

Совет. В других случаях, например при использовании Docker или Kubernetes, необходимо использовать образ или файл конфигурации кластера для передачи переменных среды.

person AmerllicA    schedule 11.03.2020

Согласно документации dotenv, вы не используете Метод config, который считывает и анализирует содержимое вашего .env файла.

Кстати, поскольку вы имеете дело с веб-пакетом, я бы предложил использовать dotenv-webpack пакет. В данной документации показан пример базовой конфигурации вместе с некоторыми другими допустимыми аргументами.

Если вас интересуют другие способы настройки переменных среды конкретно в React, я рекомендую эта ссылка подробная статья.

person zsgomori    schedule 18.01.2019
comment
Спасибо, я действительно использую dotenv-webpack. Работает локально, но не в производстве по какой-то причине! - person sWarren; 19.01.2019
comment
Вы пробовали просматривать журналы, созданные Heroku? Нет ли какой-либо конкретной детали, которая могла бы рассказать больше об ошибке, которую вы получаете? Я не могу поверить, что dotenv-webpack не работает в продакшене, должно быть что-то, что мешает развёртыванию. - person zsgomori; 19.01.2019