【问题标题】:How to use private NPM packages with cloud functions?如何使用私有 NPM 包和云功能?
【发布时间】:2017-08-11 13:58:15
【问题描述】:

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

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

我尝试了不同的解决方案,但似乎都不起作用:

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

它总是拒绝部署:

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

Firebase 是否支持私有包?

【问题讨论】:

  • 我昨天也遇到了同样的问题!在找到合理的解决方法后,我在this other similar question 的答案中分享了详细信息。希望这会有所帮助!

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


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

    目前没有方便的方法。

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

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

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

    这会将本地压缩包添加到您的package.json,Google Cloud Functions 会知道使用它。

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

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

    【讨论】:

    • 我试过了,但是 firebase deploy 命令失败了:npm ERR! addLocal 无法安装 /path/to/my.tgz
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      参考Google issue tracker,已修复。有关更多信息,您可以查看Google Cloud Platform 的文档。

      使用私有模块

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

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

      如果任何问题仍然存在,请通过Google issue tracker 报告,他们将重新打开进行检查。

      【讨论】:

        【解决方案5】:

        创建 .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 注册表或您自己创建或其他人管理的注册表节点包注册表,请使用此。

        【讨论】:

          【解决方案6】:

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

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

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

          【讨论】:

            【解决方案7】:

            如果您尝试使用来自 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】:

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

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2019-09-09
                • 2021-06-11
                • 1970-01-01
                • 2016-11-06
                相关资源
                最近更新 更多