我使用Cloud Functions for Firebase和三个不同的项目进行开发,测试和制作。每个项目都有一个service-account.json。当我将源部署到环境时,初始化如下所示:
var serviceAccount = require("./service-account-dev.json");
firebase.initializeApp({
credential: firebase.credential.cert(serviceAccount),
databaseURL: "https://nwDEV.firebaseio.com"
});
这有点难以处理,因为每次我想要部署到不同的环境时我都必须更改代码。有没有办法进行整体配置,例如在firebase.json或.firebasesrc中,它允许集成服务帐户并决定部署选择哪个配置?
否则是否有可能检测代码在哪个环境下运行并加载特定的service-account.json并设置databaseURL-property?
答案 0 :(得分:7)
您可以使用环境变量。 https://firebase.google.com/docs/functions/config-env
选择项目(您可以使用命令 firebase list 查看它们):
firebase use my-project-development
设置环境变量
firebase functions:config:set app.environment="dev"
在函数文件中,应用条件来选择文件:
const serviceAccount = functions.config().app.environment === 'dev' ?
'credentials-dev.json' : 'credentials-prod.json';
然后您可以根据项目使用该文件:
firebase.initializeApp({
credential: firebase.credential.cert(serviceAccount),
databaseURL: "https://nwDEV.firebaseio.com"
});
答案 1 :(得分:3)
简短答案:
GCLOUD_PROJECT
环境变量对于您的项目将是唯一的,因此您可以像这样使用它(示例代码适用于2个不同的项目,但是您可以使用switch
或任何其他条件语句进行扩展< / em>):
const env = process.env.GCLOUD_PROJECT === 'my-app-prod' ? 'prod' : 'dev';
然后使用该env
变量加载预期的配置。
完整示例:(TypeScript)
更新.firebaserc
文件
{
"projects": {
"default": "my-app-dev",
"prod": "my-app-prod",
}
}
相应地创建和修改./somewhere/config.ts
文件,假设您正在使用AWS服务(请确保保护您的配置详细信息)
export const config = {
dev: {
awsRegion: 'myDevRegion',
awsAccessKey: 'myDevKey',
awsSecretKey: 'myDevSecretKey'
},
prod: {
awsRegion: 'myProdRegion',
awsAccessKey: 'myProdKey',
awsSecretKey: 'myProdSecretKey'
}
};
上面的项目现在可以在index.ts
文件中使用
import { config } from './somewhere/config';
import * as aws from 'aws-sdk';
. . .
const env = process.env.GCLOUD_PROJECT === 'my-app-prod' ? 'prod' : 'dev';
const awsCredentials = {
region: config[env].awsRegion,
accessKeyId: config[env].awsAccessKey,
secretAccessKey: config[env].awsSecretKey
};
aws.config.update(awsCredentials);
. . .
export const myFuncToUseAWS = functions....
现在部署
开发环境部署:$ firebase deploy --only functions -P default
产品环境部署:$ firebase deploy --only functions -P prod
答案 2 :(得分:2)
根据我对您的问题的理解,您正在寻找的内容归结为将您正在部署的云功能转换为适当的设置(即生产,开发和测试)的解决方案,我认为这意味着每个都是Firebase环境中的唯一项目,以及数据库。
如果以上情况属实,则以下内容应有所帮助。
Firebase云功能和更常见的CLI可以部署到Firebase环境中的特定项目。为此,请在云功能目录中的终端中执行以下命令。
$ firebase use --add
这将允许您选择其他项目(例如,开发)并为其分配别名(如果是这样,我建议“开发”)。然后,在部署函数时,您可以使用别名选择要部署到哪个项目(以及数据库)。
$ firebase use default # sets environment to the default alias
$ firebase use development # sets environment to the development alias
有关详细信息,请参阅:https://firebase.googleblog.com/2016/07/deploy-to-multiple-environments-with.html
您可能需要做的一件事就是使用云功能的默认配置设置。
$ admin.initializeApp(functions.config().firebase);