NodeJS Cloud Functions部署错误-monorepo中缺少依赖项

blmhpbnm  于 2023-05-28  发布在  Node.js
关注(0)|答案(1)|浏览(198)

我有一个monorepo,我的云函数从工作区中的另一个包导入。导入的包在package.json中作为devDependencies的一部分,如下所示:

// stuff
 "dependencies": {
 "@app/config": "../../packages/config/dist/cjs",
}
// more stuff

当使用firebase deploy通过CLI进行部署时,我最终得到以下错误消息:
函数加载用户代码失败。这很可能是由于用户代码中的一个错误。错误信息:无法加载提供的模块。你是否在package.json依赖项中列出了所有必需的模块?详细的堆栈跟踪:错误:找不到模块“@app/config”
由于我在npm工作区的上下文中工作,云函数node_modules中的依赖项是符号链接的,而不是实际安装的。所以我假设当CLI上传代码并尝试在Google Cloud中构建它时,链接指向死胡同,构建中断。
经过一段时间的思考,我的两个选择是:

  • 在(私有)注册表上发布我的软件包:github,npm等
  • 添加一个构建步骤到npm pack我的依赖项,并将其复制到云函数代码库。我假设这可能是通过firebase.json中的predeploy钩子和repo中的自定义脚本来完成的。

有没有更简单的选择?我的方向对吗?
谢谢

qrjkbowd

qrjkbowd1#

事实证明,随着npm和yarn工作空间推动的mono repos的兴起,这个问题变得越来越受欢迎,并在GH上的这个5年前的问题中详细记录:https://github.com/firebase/firebase-tools/issues/653
这个问题实际上是由firebase工具的限制引起的,这些工具假设所有依赖项都发布到注册表。
目前还没有正式的解决方案,而且不太可能像谷歌员工所说的那样,这些变化会影响太多层面。
因此,解决方案是:

  • 发布到私有注册表
  • npm包
  • 使用rollup,webpack等。以在部署之前捆绑功能。

对于选项2(pack),一些社区成员已经制作了一些包来解决这个问题,还有一些可以通过predeploy钩子执行的特别脚本,所有这些都可以在GH线程中使用。
我现在求助于npm pack我的依赖项,并更新我的package.json来引用tarball,如下所示:

"dependencies": {
  "@app/internalpackage": "file:./tmp/internalpackage-x.x.x.tgz"
}

它做的工作。

相关问题