Я разрабатываю приложение с моей командой с помощью Firebase и хочу развернуть свое приложение как в среде разработки, так и в рабочей среде.
Чтобы добиться этого, я сделал несколько вещей. (Подробности ниже)
Но NODE_ENV остается установленным как «разработка», когда я развертываю его в приложении функций Firebase.
Как я могу развернуть его как «разработку» в firebase?
Это то, что я сделал для достижения своей цели.
Это код, который я написал, чтобы узнать, в какой среде работает мой сервер
node_env console.info
А это из моего журнала действий на github и журнала консоли firebase
Действия на github и журнал консоли firebase
Когда я запускаю свое приложение локально с помощью команды «обслуживать», console.info печатает «разработка», как я и ожидал. Я предполагаю, что команда «firebase deploy» автоматически изменяет мой NODE_ENV на производственный при его развертывании. Или я сделал некоторые ошибки, чтобы сделать это?
Рекомендуемый способ иметь среду разработки и производства — иметь два отдельных проекта Firebase, которые вы уже используете. Для примера предположим, что у вас есть hyositive-app
в качестве производственного проекта и hyositive-dev
в качестве проекта разработки.
Использование переменных среды с облачными функциями для Firebase основано на .env
файлах, совместимых с пакетом dotenv. По умолчанию поддерживаются следующие файлы (остальные игнорируются!):
.env
Переменные среды, общие для всех сред
.env.<projectID>
Переменные среды, используемые при развертывании в названном проекте (например, .env.hyositive-app
)
.env.<alias>
Переменные среды, используемые при развертывании в проекте с псевдонимом (например, .env.dev
). default
— это единственный псевдоним, настроенный по умолчанию. dev
/prod
/и т.д. не определены.
.env.local
Переменные среды, используемые при использовании функций эмуляции в вашей системе с помощью эмулятора Cloud Functions.
Чтобы использовать .env.dev
и .env.prod
, вам нужно будет определить их как псевдонимы проекта в вашем файле .firebaserc
(или вы можете продолжать использовать псевдонимы development
и production
и просто обновить имена файлов, чтобы они соответствовали):
{
"projects": {
"default": "hyositive-dev",
"dev": "hyositive-dev",
"prod": "hyositive-app"
}
}
Это позволит вам использовать .env.dev
и .env.prod
вместо .env.hyositive-dev
и .env.hyositive-app
соответственно.
Среда выполнения облачных функций (процесс, который запускает развернутый код) определяет ряд встроенных переменных среды, которые имеют различные цели (например, позволяют использовать initializeApp()
без аргументов).
В дополнение к этим переменным среда выполнения также определяет несколько переменных, зависящих от языка, чтобы упростить развертывание кода. Однако в документации Cloud Functions указано, что нельзя полагаться на их значения, если только вы сами не установите значения.
Среда выполнения облачных функций Node.js построена с использованием Cloud Functions Framework (однако не гарантируется полное соответствие этой версии с открытым исходным кодом). Поскольку эта среда выполнения выполняется с использованием Node.js и использует другие пакеты, такие как express, она устанавливает NODE_ENV
на production
, чтобы свести к минимуму неожиданное поведение, зависящее от его значения. Но, как упоминалось выше, на это поведение не следует полагаться, даже если оно вряд ли изменится.
Чтобы заменить NODE_ENV
на development
, вы должны добавить его в .env.dev
, .env.hyositive-dev
и/или .env.local
(в зависимости от обстоятельств). Точно так же вы также должны определить NODE_ENV
как production
в .env.prod
или .env.hyositive-app
(в зависимости от ситуации).
Вместо того, чтобы полагаться на NODE_ENV
, я бы рекомендовал определить поведение вокруг другой переменной, над которой у вас есть полный контроль (например, HYOSITIVE_ENV
), или сравнить с идентификатором исполняемого проекта, чтобы определить, работает ли он в рабочем проекте или нет.
const PROD_PROJECT_ID = "hyositive-app",
// DEV_PROJECT_ID = "hyositive-dev",
PROJECT_ID = JSON.parse(process.env.FIREBASE_CONFIG).projectId,
isProduction = PROJECT_ID === PROD_PROJECT_ID;
Примечание. В этой другой теме может быть полезная справочная информация.
Вау, спасибо большое! Я многому научился у вас!! Желаю тебе всего самого наилучшего :)