我正在尝试部署一个pubsub
函数来运行我的Firestore数据库的预定备份,但是它将无法部署,并且我无法弄清楚为什么它不起作用。
这是最小的打字稿文件,具有可再现此行为的功能:
import * as functions from "firebase-functions";
import * as key from "../key.json";
export const backupFirestore = functions.pubsub
.schedule("0 22 * * *")
.timeZone("America/Los_Angeles")
.onRun(async (context) => {
const pk = key.private_key;
console.log(pk);
});
在我的index.ts文件中,按如下所示导出函数:
export { backupFirestore } from "./firestore_backup";
最后,这是我的firebase.json:
{
"functions": {
"predeploy": [
"npm --prefix \"$RESOURCE_DIR\" run lint",
"npm --prefix \"$RESOURCE_DIR\" run build"
],
"source": "functions"
}
}
我执行firebase deploy --only "functions:backupFirestore"
,一切看起来都很好,打字稿皮棉和编译器运行没有错误。但是部署过程会引发以下错误:
功能:指定了以下过滤器,但与项目中的任何功能都不匹配:backupFirestore
我还尝试运行firebase deploy --only functions
,这不会导致错误,但仍无法部署该功能。
这正是我对所有其他功能所做的工作,但是对于pubsub
函数,它却以某种方式失败。这个问题使我震惊,找不到任何现有的解决方案。
任何建议将不胜感激!
答案 0 :(得分:1)
通过查看lib文件夹,我发现了问题。编译器正在将.js
和.map
文件写入lib/src
文件夹而不是lib
文件夹中-因此,firebase部署过程没有选择它。
进一步研究(并创建了一个重现此问题的最小代码示例-感谢@DougStevenson),我找到了罪魁祸首。从另一个目录导入外部文件:
import * as key from "../key.json";
我确实为编译器指定了--outDir
,但是应该添加--rootDir
选项才能解决此问题。参见:https://github.com/microsoft/TypeScript/issues/16683
我选择通过用import
代替require
命令来解决此问题,尽管这不是首选的打字稿方式。
以下是更新后的代码,这些代码将输出文件生成到lib
中并成功部署到firebase:
import * as functions from "firebase-functions";
const key = require("../key.json");
export const backupFirestore = functions.pubsub
.schedule("0 22 * * *")
.timeZone("America/Los_Angeles")
.onRun(async (context) => {
const pk = key.private_key;
console.log(pk);
});
希望这对遇到这种行为的其他人很有帮助。