如何使用具有云功能的私有NPM包?

时间:2017-03-20 10:22:06

标签: node.js firebase npm google-cloud-functions

我正在尝试将应用程序切换到Firebase并将后端转移到Firebase云功能。

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

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

  • 传递NPM_TOKEN env:由于Firebase限制为小写配置,因此无法实现
  • npm install函数目录中的模块
  • 在函数目录中使用YARN和NPM身份验证令牌创建.npmrc文件

它始终拒绝部署:

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

Firebase是否支持私有包?

9 个答案:

答案 0 :(得分:7)

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

  

要使用私有npm模块,您必须提供凭据   (auth token)用于位于.npmrc文件中的npm注册表   功能的目录。您只需复制.npmrc文件即可   使用npm登录npm时在主目录中创建   登录命令。

     

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

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

答案 1 :(得分:6)

目前没有方便的方法。

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

您必须在本地打包并安装软件包并将其提交给源代码:

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

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

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

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

答案 2 :(得分:2)

如果您想要包含通过npm不公开的软件包,您必须自己打包并将它们包含在您的函数文件夹中。部署时会上传整个函数文件夹,因此您应该能够像在本地一样需要它们。

答案 3 :(得分:2)

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

答案 4 :(得分:1)

参考Google issue tracker,这已得到修复。有关详细信息,请查看Google Cloud Platform处的文档。

使用私人模块

为了使用私有npm模块,您必须在位于函数目录中的.npmrc文件中为npm注册表提供凭据(auth令牌)。使用npm login命令登录npm时,只需复制在主目录中创建的.npmrc文件。

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

如果问题仍然存在,请在Google issue tracker报告,然后重新审核。

答案 5 :(得分:0)

创建.npmrc文件并添加类似以下内容-

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

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

注册表URL可以是npm public,也可以是gcloud VM Instance或AWS中您自己的私有注册表。就像我使用Verdaccio https://verdaccio.org/

在gcloud Virtual Machine中拥有我的私有npm注册表一样

此解决方案在gcloud函数部署gcloud搜索公共npm的package.json中的依赖项时有效。因此,要指定一些私有npm注册表或您自己创建的注册表或其他托管的注册表节点程序包注册表,请使用此功能。

答案 6 :(得分:0)

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

official docs 中是这样说的:注意:Cloud Functions 不支持 npm 以外的注册表,例如 GitHub 包。

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

答案 7 :(得分:0)

如果您尝试使用来自 CI 的 firebase deploy 部署您的函数,并且您的 .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

答案 8 :(得分:-3)

我也遇到了同样的问题,但后来我意识到我忘了将依赖项添加到{{1}}文件中,该文件应与{{1}}

位于同一目录中