【问题标题】:Specifying private dependencies for NodeJS in Cloud Functions在 Cloud Functions 中为 NodeJS 指定私有依赖项
【发布时间】:2020-06-21 10:59:45
【问题描述】:

我有一个想要在 Cloud Functions 中部署的小型 NodeJS 项目。因为这个项目使用了Pubsub,所以我在本地机器上使用了模拟器来模拟Pubsub,所以我可以在本地测试而无需先部署。我按照 herehere 的 Functions Framework 和 Pubsub 模拟器的说明进行操作。

这就是我的文件夹的结构:

project-folder/
+|index.js
 |package.json
 |lib/
  +|mod_1.js
   |mod_2.js
   ...
   |mod_n.js
 |node_modules/

lib 文件夹中的 js 文件是我的实用程序函数。我将这些模块导入程序的入口点文件index.js(因为我不太熟悉“标准”NodeJS 依赖管理)在本地开发中,如下所示:

const mod_1 = require('./lib/mod_1');
const { mod_2a, mod_2b } = require('./lib/mod_2');
...

package.json 看起来像这样:

"scripts": {
  "start": "functions-framework --port=3000 --target=app",

我使用npm start 启动我的应用程序,这非常有效。

但是,当我尝试在 shell 中使用 gcloud functions deploy... 命令部署到 Cloud Functions 时,部署失败,因为它找不到我的私有模块。因此,阅读有关在 Cloud Functions here 中指定依赖项的文档后,我更新了 package.json 中的依赖项,以将我的模块包含在 lib 中:

"dependencies": {
  "@google-cloud/functions-framework": "^1.5.1",
  "@google-cloud/pubsub": "^2.1.0",
  "express": "^4.17.1",
  ...
  "mod_1": "file:./lib/mod_1",
  "mod_2": "file:./lib/mod_2",
  ...
},

但是由于同样的问题仍然无法部署,现在还有一个问题是,当我在本地运行我的程序时出现错误,因为它无法检测到模块。我在index.jspackage.json 中尝试了各种组合,例如删除require 中的lib 前缀、添加.js 等,但似乎都没有效果。

我的问题是:

(1) NodeJS 中的依赖项是否有一个单一的通用标准(文件夹命名、导入库等)?在我看来,不同的框架有不同的风格。

(2) 如何使依赖项在本地开发环境和部署到 Cloud Functions 时都能正常工作?

我的 NodeJS 运行时是版本 10(至少对于 Cloud Functions)。

【问题讨论】:

  • 这个“私有模块”存储在你的本地机器上吗?您需要在云功能可访问的地方发布。

标签: node.js google-cloud-functions


【解决方案1】:

Node.js 依赖项是通过 NPM 安装的其他模块,您的实用程序函数不是模块依赖项。您不需要将它们添加到 package.json。当你部署你的函数时,你的所有源代码都将被打包成一个 zip 文件并上传。这是您应该查看的正确指南的链接:https://cloud.google.com/functions/docs/deploying/filesystem

因此,请从您的 package.json 中删除 mod_1 和 mod_2 行,以及您可能在其中直接指向您自己的源代码的任何其他引用。

【讨论】:

  • 当我部署在本地机器上运行的原始设置时,我在 Cloud Functions 上遇到错误,它无法检测到 lib 文件夹中的模块。
  • 你能发布你的 index.js
猜你喜欢
  • 2019-04-07
  • 1970-01-01
  • 2021-10-25
  • 2018-03-15
  • 2019-02-13
  • 2021-07-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多