无法部署“pubsub”云功能

Posted

技术标签:

【中文标题】无法部署“pubsub”云功能【英文标题】:Unable to deploy "pubsub" Cloud Function 【发布时间】:2021-01-30 14:53:21 【问题描述】:

我正在尝试部署 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",一切看起来都很好,打字稿 lint 和编译器运行没有错误。但是部署过程抛出如下错误:

函数:指定了以下过滤器,但与项目中的任何函数都不匹配:backupFirestore

我也试过运行firebase deploy --only functions,没有报错,但还是没有部署函数。

这正是我为所有其他函数所做的,但不知何故,对于 pubsub 函数它失败了。这个问题让我很震惊,我找不到任何现有的解决方案。

任何建议将不胜感激!

【问题讨论】:

请编辑问题以显示任何人都可以用来重现问题的complete, minimal code。不要编辑太多,以至于我们不得不猜测如何复制。 感谢@DougStevenson 的指点和道歉。我添加了完整的代码。 清理工作区中的 lib 文件夹,然后尝试重建源代码,然后在部署之前手动检查 lib 文件夹中的函数是否存在 你是说 index.ts 只包含那个导出行? 为了创建一个 minimal 示例,最好去掉不相关的代码,在最小状态下对其进行测试,然后显示结果。换句话说:你能想出的最少代码量是多少? 【参考方案1】:

通过查看 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);
  );

希望这对遇到这种行为的其他人有所帮助。

【讨论】:

以上是关于无法部署“pubsub”云功能的主要内容,如果未能解决你的问题,请参考以下文章

如何使用消息排序部署 pubsub 触发的云功能?

PubSub 主题不从云功能中提取数据

Firebase 云功能无法正确记录

云功能不向 PubSub 发送消息

使用 pubsub 推送触发器运行云功能

GCP 云功能未正确接收/确认 PubSub 消息