【问题标题】:How To Setup Private NPM Module With Firebase Cloud Functions .npmrc?如何使用 Firebase Cloud Functions .npmrc 设置私有 NPM 模块?
【发布时间】:2020-02-01 14:51:00
【问题描述】:

我创建了一个私有类型 npm 模块,用于我的 firebase 功能和应用程序项目。当我去部署 firebase 函数时,对于基本上说 ERR! remote: Invalid username or password. 的每个函数,我都会遇到一个大错误

对于我所阅读的内容,看来我需要创建一个 .npmrc 文件并将其放在 /functions 目录中。 (https://cloud.google.com/functions/docs/writing/specifying-dependencies-nodejs#using_private_modules)

但是,我无法在任何地方找到有关如何执行此操作的正确说明。根据我的发现,我做了以下事情:

  • 运行 npm 登录
  • 运行 npm token create --read-only

这给了我一个看起来像这样的令牌:XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX

然后我在我的函数目录中创建一个名为 .npmrc 的文件,并将 //registry.npmjs.org/:_authToken=XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX 放入其中。

此外,我看到错误消息是尝试使用 ssh 安装我的私人 repo 包,我没有设置 ssh 而是使用 https,因此我将包文件更改为 git+https://github.com/accounts-name/repo#commit-num 以便它使用HTTPS。

但是,我仍然收到相同的错误消息。我错过了什么?以上是我从大量谷歌搜索中整理出来的。

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 这不是我想要的解决方案,但我想这是我应得的解决方案..
    【解决方案2】:

    看起来你在尝试让它工作的时候做了太多不同的改变,所以让我们一步一步来完成整个过程。

    1. 检查你的 npm 模块的 package.json 并发布它:

      • 删除“私有”属性或将其设置为false,因为 npm 中的私有模块意味着永远不会发布。这并不明显,但确实如此。
      • 下一步是对包应用受限访问。为此,请在package.json 文件中添加这样的property
      "publishConfig": {
          "access": "restricted"
      },
      
      • 确保您使用npm 帐户发布supports 私有包。
      • 现在打开包根目录下的终端,输入npm login,然后登录npm。检查您是否将正确的版本放入 package.json
      • 运行npm publish。该软件包应在几秒钟内发布。不用担心,感谢publishConfig 属性,没有人可以访问它。
    2. 现在是时候允许在您的项目中安装包了

      • 进入项目目录,打开package.json文件
      • 检查您的包的名称和版本是否在 dependencies 列表中
      • 打开浏览器,导航到https://npmjs.com,登录您的帐户,导航到您帐户的设置页面并打开tokens标签
      • 创建新令牌并复制它
      • 现在再次转到您的项目目录,位于package.json 文件所在的同一级别(这很重要!)并在那里创建.npmrc 文件。
      • 将这样的字符串放入.npmrc文件中:
      //registry.npmjs.org/:_authToken=TOKEN_HERE
      

      你已经完成了!

    3. 使用远程 CI/CD 服务进行部署

      • 最简单的方法是不要将.npmrc 添加到.gitignore 中。在这种情况下,文件将始终在存储库中,因此npm install 将在任何克隆项目的机器上顺利运行
      • 如果您不想在存储库中包含令牌字符串,可以将其移动到 CI/CD 服务的环境变量中,然后将 .npmrc 文件链接到该变量。例如,您可以将生成的令牌放入 NPM_TOKEN env 变量中(只是来自 npmjs 的令牌,而不是来自 .npmrc 的整个字符串!) 然后用下一种方式更改.npmrc文件: //registry.npmjs.org/:_authToken=${NPM_TOKEN}

    因此,通过这些步骤,您应该能够安装受限软件包而不会出现任何问题。祝你好运!

    【讨论】:

    • 从安全角度来看,将这样的令牌提交到您的存储库是一个坏主意。我建议遵循环境变量或类似方法
    • @Michael 谢谢,我同意。这就是我使用 env 变量选项扩展答案的原因。
    • @ArtemArkhipov 太棒了,感谢您花时间解释。刚刚按照你的指示完成了这一切:) - 只花了我 7 美元哈哈哈
    • @ArtemArkhipov 谢谢!抱歉,我不知道我必须单独按下蓝色奖励按钮。
    猜你喜欢
    • 1970-01-01
    • 2022-12-13
    • 2021-12-15
    • 1970-01-01
    • 2021-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-23
    相关资源
    最近更新 更多