21

我正在尝试将应用程序切换到 Firebase 并将后端传输到 Firebase Cloud Functions。

此应用程序使用私有包 ( @org/name) 作为依赖项。

我尝试了不同的解决方案,但似乎没有一个可行:

  • 传递NPM_TOKENenv: 不可能,因为 Firebase 限制为小写配置
  • npm install功能目录中的模块
  • .npmrc使用 YARN 和 NPM 身份验证令牌在函数目录中创建一个文件

它总是拒绝部署:

Deploy Error: Build failed: Module @org/name not found in npm registry

Firebase 是否支持私有软件包?

4

8 回答 8

18

Google Cloud Functions 现在支持私有 NPM 包。

为了使用私有 npm 模块,您必须在函数目录中的 .npmrc 文件中为 npm 注册表提供凭据(身份验证令牌)。当您使用 npm login 命令登录到 npm 时,您可以简单地复制在您的主目录中创建的 .npmrc 文件。

如果您不使用私有存储库,请不要包含 .npmrc 文件,因为它可能会增加您的函数的部署时间。

来源:https ://cloud.google.com/functions/docs/writing/dependencies#using_private_modules

于 2017-12-20T05:26:45.450 回答
8

目前没有方便的方法。

在我看来,GCF 不使用 npm 客户端从 npm 注册表中获取,而是直接获取它。这可以防止使用标准.npmrc文件或 npm 客户端知道的任何其他方法。

您必须在本地打包和安装您的包并将其提交到源代码:

$ npm pack @org/name
$ npm install --save tarball-output.tgz

这会将本地 tarball 添加到您的package.json和 Google Cloud Functions 将知道使用它。

我真的希望他们.npmrc从项目根路径中读取,或者我们可以将 TOKEN 作为环境变量传递给他们。

有一个未解决的问题: https ://issuetracker.google.com/issues/36665861

于 2017-03-28T08:52:09.157 回答
4

Firebase 现在支持带有.npmrc文件的私有 npm 模块。看看这个链接。

于 2019-02-16T16:51:47.503 回答
2

参考谷歌问题跟踪器,已修复。有关更多信息,您可以查看Google Cloud Platform上的文档。

使用私有模块

为了使用私有 npm 模块,您必须在.npmrc位于函数目录中的文件中为 npm 注册表提供凭据(身份验证令牌)。当您使用 npm login 命令登录到 npm 时,您可以简单地复制.npmrc在您的主目录中创建的文件。

.npmrc如果您不使用私有存储库,请不要包含该文件,因为它可能会增加您的功能的部署时间。

如果任何问题仍然存在,请在Google 问题跟踪器上报告,他们将重新打开以进行检查。

于 2017-12-15T19:13:29.933 回答
0

如果您尝试firebase deploy从 CI 部署函数,并且您的 .npmrc 文件如下所示。

@acmecorp:registry=https://npm.pkg.github.com/

//npm.pkg.github.com/:_authToken=${NPM_REGISTRY_TOKEN}

即使您设置了 env var,您也会遇到问题。

Build failed: Error: Failed to replace env in config: ${NPM_REGISTRY_TOKEN}

Firebase 出于某种原因需要访问该私有仓库。但是 env var 不会发送到 firebase。

我实施的解决方案是在每次运行 CI 管道时替换 .npmrc 文件中的 ${NPM_REGISTRY_TOKEN} 。

sed -i.bak "s/\${NPM_REGISTRY_TOKEN}/${NPM_REGISTRY_TOKEN}/g" .npmrc
于 2021-08-02T19:44:48.857 回答
0

创建 .npmrc 文件并添加类似这样的内容 -

registry=https://xxx.xxx.com
_authToken="MXfyoClMIzrXu7lnOhDuXXXxXXXXXxxxXXXXXxxx="

注意:对于 _authToken 输入命令cat ~/.npmrc,您可以在其中找到 _authToken。

注册表 URL 可以是 npm 公共或您自己在 gcloud VM 实例或 AWS 中的私有注册表。就像我在 gcloud 虚拟机中使用 Verdaccio https://verdaccio.org/有我的私人 npm 注册表

此解决方案有效,因为在 gcloud 功能部署 gcloud 期间搜索公共 npm 中 package.json 中的依赖项提及。因此,要指定一些私有 npm 注册表或您自己创建的或其他人管理的注册表节点包注册表,请使用它。

于 2020-06-10T18:16:23.413 回答
0

与这里的答案相反,据我了解,GCF 不支持私有注册表,例如 Github 包注册表。

它在官方文档中这样说: 注意:Cloud Functions 不支持 npm 以外的注册表,例如 GitHub 包。

目前,我正在尝试找出“npm pack”方法,但是(我正在使用 Serverless.com)部署仍然无法正常工作。但这是另一个问题,我猜。

于 2021-03-10T12:27:27.080 回答
-3

我也遇到了同样的问题,但是后来我意识到我忘记将依赖项添加到package.json文件中,该文件应该与您的目录位于同一目录中index.js

于 2017-03-20T13:40:18.283 回答