[英]How to use private NPM packages with cloud functions?
我正在嘗試將應用程序切換到 Firebase 並將后端轉移到 Firebase Cloud Functions。
此應用程序使用私有包 ( @org/name
) 作為依賴項。
我嘗試了不同的解決方案,但似乎都不起作用:
NPM_TOKEN
env:不可能,因為 Firebase 限制為小寫配置npm install
模塊npm install
在函數目錄中.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.