Heroku PG Миграция базы данных по умолчанию на производство, когда NODE_ENV настроен на подготовку - PullRequest
0 голосов
/ 28 марта 2020

Мое приложение использует библиотеки Express, Knex и PG. Я настроил свой NODE_ENV в Heroku на подготовку с помощью команды https://devcenter.heroku.com/articles/nodejs-support#runtime-behavior ( source ):

Setting NODE_ENV and restarting    
NODE_ENV: staging

У меня есть промежуточный env в knexfile:

require('dotenv').config();

module.exports = {
    test: {
        client: 'pg',
        connection: process.env.DB_URL_TEST,
        migrations: {
            directory: './db/migrations',
        },
        seeds: {
            directory: './db/seeds/dev',
        },
        useNullAsDefault: true,
    },
    development: {
        client: 'pg',
        connection: process.env.DB_URL,
        migrations: {
            directory: './db/migrations',
        },
        seeds: {
            directory: './db/seeds/dev',
        },
        useNullAsDefault: true,
    },

    staging: {
        client: 'pg',
        connection: process.env.DATABASE_URL,
        migrations: {
            directory: './db/migrations',
        },
        seeds: {
            directory: './db/seeds/dev',
        },
        useNullAsDefault: true,
    },

    production: {
        client: 'pg',
        connection: process.env.DB_URL_PRODUCTION,
        migrations: {
            directory: './db/migrations',
        },
        seeds: {
            directory: './db/seeds/production',
        },
        useNullAsDefault: true,
    },
};

Мой файл конфигурации базы данных прослушивает NODE_ENV:

    const knex = require('knex');
const config = require('../knexfile');

const dbEnv = process.env.NODE_ENV;

module.exports = knex(config[dbEnv]);

Никаких других конфигурационных переменных в Heroku:

enter image description here

Когда я запускаю миграцию heroku, это продолжает задавать значения по умолчанию для рабочей среды:

Running knex migrate:latest
Using environment: production

Единственный способ принудительно выполнить переход в промежуточную среду env - это установить NODE_ENV в стадию явной переменной enok Heroku. Я не понимаю, почему промежуточная среда не запускается при запуске миграции.

edit : 1-й и 3-й скриншоты преобразованы в текст. Не могу изменить другое, это всего лишь скриншот части переменных enok Heroku.

** edit 2 **: добавлена ​​команда для установки NODE_ENV на этап

1 Ответ

0 голосов
/ 05 апреля 2020

Побеседовав со службой поддержки Heroku, найдите ниже их ответ, который решил мою проблему:

Это не от NODE_ENV, а от побочного эффекта установки NPM_CONFIG_PRODUCTION = true. Подробнее см. В этой статье.

Установите значение true для запуска в «производственном» режиме.

devDependencies не устанавливаются на самом верхнем уровне при запуске локальной установки npm без каких-либо аргументов. Установите NODE_ENV = "production" для сценариев жизненного цикла. Это не интуитивное поведение, поэтому мы пытаемся предупредить об этом в журнале сборки:

-----> Создание среды выполнения

   NPM_CONFIG_LOGLEVEL=error
   NPM_CONFIG_PRODUCTION=true
   NODE_VERBOSE=false
   NODE_ENV=staging
   NODE_MODULES_CACHE=true

   npm scripts will see NODE_ENV=production (not 'staging')
   https://docs.npmjs.com/misc/config#production The functionality of user-env-compile is now built into the standard build process.

NODE_ENV по умолчанию не установлено Heroku. То, что вы видите, является результатом NPM_CONFIG_PRODUCTION во время сборки. Это верно по умолчанию во время сборок (это значительно ускоряет их, не устанавливая devDependencies). Npm устанавливает NODE_ENV в рабочий режим, когда NPM_CONFIG_PRODUCTION имеет значение true:

-----> Node.js приложение обнаружено

-----> Чтение пакета состояния приложения. json. .. каталог сборки ... каталог кэша ... переменные среды ...

   Node engine:         0.10.x
   Npm engine:          unspecified
   Start mechanism:     Procfile
   node_modules source: package.json
   node_modules cached: true

   NPM_CONFIG_PRODUCTION=true
   NODE_MODULES_CACHE=true If you'd like to disable production mode for npm, you can set NPM_CONFIG_PRODUCTION to false using the

команда heroku config: set NPM_CONFIG_PRODUCTION = false -a Это предотвратит npm переопределение NODE_ENV.

...