如何使用 Firebase Cloud Functions .npmrc 设置私有 NPM 模块?

Eli*_*Eli 3 node.js npm firebase google-cloud-functions

我创建了一个私有类型 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。

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

Art*_*pov 5

似乎您在尝试使其工作时进行了太多不同的更改,所以让我们一步一步地完成整个过程。

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

    • 删除“private”属性或将其设置为false因为 npm 中的私有模块永远不会发布。这并不明显,但确实如此。
    • 下一步是对包应用受限访问。为此,请在文件中添加这样的属性package.json
    "publishConfig": {
        "access": "restricted"
    },
    
    Run Code Online (Sandbox Code Playgroud)
    • 确保npm您用于发布的帐户支持私有包。
    • 现在在包的根目录中打开终端,输入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
    
    Run Code Online (Sandbox Code Playgroud)

    你完成了!

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

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

因此,通过这些步骤,您应该能够毫无问题地安装受限制的软件包。祝你好运!

  • 从安全角度来看,将这样的令牌提交到存储库并不是一个好主意。我建议遵循环境变量或类似的方法 (2认同)