如何将应用环境变量用于 Firebase Cloud Functions?

Posted

技术标签:

【中文标题】如何将应用环境变量用于 Firebase Cloud Functions?【英文标题】:How can I use app environment variables for Firebase Cloud Functions? 【发布时间】:2019-04-13 11:24:16 【问题描述】:

这是一个 Angular CLI 应用程序,但只是有点相关。

我们有非常典型的环境变量,在这种情况下,要么

src/environments/environment.ts

src/environments/environment.prod.ts

我只使用

导入我的环境
import  environment  from 'environments/environment'

但是,如果我运行“ng build”,它使用“environment.ts”,如果我运行“ng build --prod”,它使用“environment.prod.ts”

纯魔法。

喜欢它!

但 Firebase Cloud Functions 实际上是一个单独的项目,具有单独的构建过程,所以无论它只使用“environment.ts”,所以我必须记住手动切换到从“environment.prod.ts”导入每个我何时部署到生产环境?

我知道这一点:https://firebase.google.com/docs/functions/config-env 但我不明白它如何解决上述问题。也许我遗漏了一些东西,但在我看来,我仍然必须每次使用更繁琐的终端命令语法切换我的变量(也可以在我的导入中添加“.prod”)。

这是可行的,当然,但它消除了安全性和环境配置的一些便利性。最终有人必然会进行生产部署而忘记进行该切换......在我们的情况下,即使是使用生产变量测试服务器的意外部署也是有害的,因为它会弄乱我们的搜索索引。

我错过了什么?如何自动切换?

询问Firebase

【问题讨论】:

如果您想自动化某些事情,请考虑编写脚本来完成这项工作。甚至更好的是,使用 CI/CD 系统来消除人为错误的可能性。这就是成熟的开发团队会做的事情,以尽量减少错误。 听起来不错。我如何/在哪里可以为云功能模块编写一个脚本来识别 Angular 项目的构建环境?函数本质上表现为它自己的项目,具有自己的 package.json 等... TBH,我实际上不知道 Angular CLI 项目如何识别“--prod”被附加到“ng build”以使用不同的环境多变的。主项目的 package.json 只有“构建”脚本,而 angular.json 指定了“配置”下的替换,但不会延续到函数。 我对 Angular 一无所知。无论如何,您的 Web 应用程序将与您的功能完全分开部署。不过,您的问题非常广泛 - 是时候对脚本进行一些研究了,然后当您遇到更离散的问题时再发回这里。 【参考方案1】:

我终于找到了办法。

事实证明,您可以在任何时候使用以下方法访问函数中的项目名称:

const project = process.env.GCP_PROJECT;

在我的例子中,我为我的两个主要项目创建了一个枚举,如下所示:

enum Projects 
    mynametest = 'mynametest',
    mynameprod = 'mynameprod',

我导入了这两个环境,给每个环境一个别名,如下所示:

import  environment as devEnv  from '../../src/environments/environment';
import  environment as prodEnv  from '../../src/environments/environment.prod';

在我使用的相关函数中:

const project = process.env.GCP_PROJECT;
let currentEnv;
if (project === Projects.mynametest) 
    currentEnv = devEnv;
 else if (project === Projects.mynameprod) 
    currentEnv = prodEnv;
 else 
    console.error('No valid environment for <something relevant here>');
    return null;

// use "currentEnv.<myVar>" as you would normally use "environment.<myVar>"

如果有人找到更好和/或更简洁的方法,请分享!

【讨论】:

以上是关于如何将应用环境变量用于 Firebase Cloud Functions?的主要内容,如果未能解决你的问题,请参考以下文章

Firebase 函数环境变量

谷歌云构建不使用环境变量替换 Firebase 令牌

如何保护将 Firebase 存储用于以下应用程序的网站?

如何将 Firebase 隐形 reCAPTCHA 用于 Angular Web 应用程序?

将 Firebase 用于两个应用

如何获取/设置 firebase 云函数 v1 环境变量