簡體   English   中英

如何使用帶有雲功能的私有 NPM 包?

[英]How to use private NPM packages with cloud functions?

我正在嘗試將應用程序切換到 Firebase 並將后端轉移到 Firebase Cloud Functions。

此應用程序使用私有包 ( @org/name ) 作為依賴項。

我嘗試了不同的解決方案,但似乎都不起作用:

  • 傳遞NPM_TOKEN env:不可能,因為 Firebase 限制為小寫配置
  • npm install模塊npm install在函數目錄中
  • 使用 YARN 和 NPM 身份驗證令牌在函數目錄中創建一個.npmrc文件

它總是拒絕部署:

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

Firebase 支持私有包嗎?

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

為了使用私有 npm 模塊,您必須在位於函數目錄中的 .npmrc 文件中為 npm 注冊表提供憑據(身份驗證令牌)。 當您使用 npm login 命令登錄 npm 時,您可以簡單地復制在您的主目錄中創建的 .npmrc 文件。

如果您不使用私有存儲庫,請不要包含 .npmrc 文件,因為它可能會增加您的功能的部署時間。

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

目前沒有方便的方法。

在我看來 GCF 不使用 npm 客戶端從 npm 注冊表中獲取,而是直接獲取它。 這可以防止使用標准的.npmrc文件或 npm 客戶端知道的任何其他方法。

您必須在本地打包並安裝您的軟件包並將其提交到源代碼:

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

這會將本地 tarball 添加到您的package.json ,Google Cloud Functions 將知道使用它。

我真的希望他們能從項目根路徑中讀取.npmrc ,或者,我們可以將 TOKEN 作為 env 變量傳遞給他們。

有一個懸而未決的問題: https : //issuetracker.google.com/issues/36665861

Firebase 現在支持帶有.npmrc文件的私有 npm 模塊。 看看這個鏈接。

如果您想要包含通過npm不公開的軟件包,您必須自己打包它們並將它們包含在您的函數文件夾中。 整個函數文件夾在部署時上傳,因此您應該能夠像在本地一樣需要它。

參考谷歌問題跟蹤器,這已被修復。 有關更多信息,您可以查看Google Cloud Platform 上的文檔。

使用私有模塊

為了使用私有 npm 模塊,您必須在位於函數目錄中的.npmrc文件中為 npm 注冊表提供憑據(身份驗證令牌)。 當您使用 npm login 命令登錄 npm 時,您可以簡單地復制在您的主目錄中創建的.npmrc文件。

如果您不使用私有存儲庫,請不要包含.npmrc文件,因為它可能會增加您的功能的部署時間。

如果任何問題仍然存在,請向Google 問題跟蹤器報告,他們將重新打開進行檢查。

創建 .npmrc 文件並添加如下內容 -

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

注意:對於 _authToken,輸入命令cat ~/.npmrc在其中找到 _authToken。

注冊表 URL 可以是 npm public 或您自己在 gcloud VM Instance 或 AWS 中的私有注冊表。 就像我使用 Verdaccio https://verdaccio.org/在 gcloud 虛擬機中擁有我的私有 npm 注冊表一樣

此解決方案在 gcloud 函數部署期間有效,因為 gcloud 在公共 npm 中的 package.json 中搜索依賴項提及。 因此,要指定一些私有 npm 注冊表或您自己創建的或其他人管理的注冊表節點包注冊表,請使用它。

與這里的答案相反,據我所知,GCF 不支持私有注冊表,例如 Github 包注冊表。

官方文檔中是這樣說的: 注意:Cloud Functions 不支持 npm 以外的注冊表,例如 GitHub 包。

目前,我正在嘗試找出“npm pack”方法,但是(並且我正在使用 Serverless.com)部署仍然不起作用。 但這是另一個問題,我想。

如果您嘗試firebase deploy來自 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

我也遇到了同樣的問題,但后來我意識到我忘記將依賴項添加到package.json文件中,該文件應該與index.js位於同一目錄中

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM