我正试图部署一个pubsub
函数来运行我的消防仓库数据库的定时备份,但它不会部署,我也不知道为什么它不会工作。
这是一个最小的typescript文件,它具有再现这种行为的功能:
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"
,一切看起来都很好,typescript lint和编译器运行时没有错误。但是部署过程会抛出以下错误:
函数:指定了以下筛选器,但与项目中的任何函数都不匹配:backupFirestore
我还尝试运行firebase deploy --only functions
,但没有导致错误,但仍然没有部署该函数。
这正是我为所有其他函数所做的,但不知何故,对于pubsub
函数,它失败了。这个问题让我大吃一惊,我找不到任何现有的解决方案。
任何建议都将不胜感激!
通过查看lib文件夹,我发现了这个问题。编译器将.js
和.map
文件写入lib/src
而不是lib
文件夹,因此firebase部署过程没有接收到它。
经过进一步的研究(并创建了一个再现该问题的最小代码示例——感谢@DougStevenson(,我发现了罪魁祸首。从另一个目录导入外部文件:
import * as key from "../key.json";
我确实为编译器指定了--outDir
,但应该是添加了--rootDir
选项来解决这个问题。请参阅:https://github.com/microsoft/TypeScript/issues/16683
我选择用require
替换import
命令来解决这个问题,尽管这不是首选的打字方式。以下是更新后的代码,它将输出文件生成到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);
});
希望这对其他遇到这种行为的人有所帮助。