在 Azure Artifacts 中使用 Npm 範圍
Azure DevOps Services | Azure DevOps Server 2022 - Azure DevOps Server 2019
Npm 範圍可作為將相關套件分類為群組的方法。 這些範圍可讓您建立套件,其名稱與不同使用者所建立的套件相同,而不會發生衝突。 藉由使用範圍,您可以新增範圍前置詞 @scopeName 並設定 .npmrc 檔案,以獨佔使用該特定範圍的摘要來隔離公用和私人套件。
Azure Artifacts 提供從摘要或公用登錄發佈和下載範圍和非範圍套件的功能。 Npm 範圍在使用缺乏因特網存取的自我裝載內部部署伺服器時特別有價值,因為在這種情況下設定上游來源不可行。 總而言之,使用範圍時:
- 我們不必擔心名稱衝突。
- 不需要變更 npm 登錄,即可安裝或發佈我們的套件。
- 每個 npm 組織/使用者都有自己的範圍,而且只有擁有者或範圍成員可以將套件發佈至其範圍。
專案設定
登入您的 Azure DevOps 組織,然後瀏覽至您的專案。
選取 [成品],然後選取要摘要 連線。
選取 npm,然後選取 [ 其他]。
.npmrc
將檔案新增至與package.json相同的目錄中,並將下列代碼段貼到您的檔案中。組織範圍的摘要:
registry=https://pkgs.dev.azure.com/<ORGANIZATION_NAME/_packaging/<FEED_NAME>/npm/registry/ always-auth=true
專案範圍的摘要:
registry=https://pkgs.dev.azure.com/<ORGANIZATION_NAME>/<PROJECT_NAME>/_packaging/<FEED_NAME>/npm/registry/ always-auth=true
設定認證
將下列代碼段複製到您的用戶層級
.npmrc
檔案(範例:C:\Users\FabrikamUser.npmrc)。 請確定您未將它貼到來源存放庫中的 .npmrc 檔案中。組織範圍的摘要:
; begin auth token //pkgs.dev.azure.com/<ORGANIZATION_NAME>/_packaging/<FEED_NAME>/npm/registry/:username=[ENTER_ANY_VALUE_BUT_NOT_AN_EMPTY_STRING] //pkgs.dev.azure.com/<ORGANIZATION_NAME>/_packaging/<FEED_NAME>/npm/registry/:_password=[BASE64_ENCODED_PERSONAL_ACCESS_TOKEN] //pkgs.dev.azure.com/<ORGANIZATION_NAME>/_packaging/<FEED_NAME>/npm/registry/:email=npm requires email to be set but doesn't use the value //pkgs.dev.azure.com/<ORGANIZATION_NAME>/_packaging/<FEED_NAME>/npm/:username=[ANY_VALUE_BUT_NOT_AN_EMPTY_STRING] //pkgs.dev.azure.com/<ORGANIZATION_NAME>/_packaging/<FEED_NAME>/npm/:_password=[BASE64_ENCODED_PERSONAL_ACCESS_TOKEN] //pkgs.dev.azure.com/<ORGANIZATION_NAME>/_packaging/<FEED_NAME>/npm/:email=npm requires email to be set but doesn't use the value ; end auth token
專案範圍的摘要:
; begin auth token //pkgs.dev.azure.com/<ORGANIZATION_NAME>/<PROJECT_NAME>/_packaging/<FEED_NAME>/npm/registry/:username=[ENTER_ANY_VALUE_BUT_NOT_AN_EMPTY_STRING] //pkgs.dev.azure.com/<ORGANIZATION_NAME>/<PROJECT_NAME>/_packaging/<FEED_NAME>/npm/registry/:_password=[BASE64_ENCODED_PERSONAL_ACCESS_TOKEN] //pkgs.dev.azure.com/<ORGANIZATION_NAME>/<PROJECT_NAME>/_packaging/<FEED_NAME>/npm/registry/:email=npm requires email to be set but doesn't use the value //pkgs.dev.azure.com/<ORGANIZATION_NAME>/<PROJECT_NAME>/_packaging/<FEED_NAME>/npm/:username=[ENTER_ANY_VALUE_BUT_NOT_AN_EMPTY_STRING] //pkgs.dev.azure.com/<ORGANIZATION_NAME>/<PROJECT_NAME>/_packaging/<FEED_NAME>/npm/:_password=[BASE64_ENCODED_PERSONAL_ACCESS_TOKEN] //pkgs.dev.azure.com/<ORGANIZATION_NAME>/<PROJECT_NAME>/_packaging/<FEED_NAME>/npm/:email=npm requires email to be set but doesn't use the value ; end auth token
使用封裝>讀取和寫入範圍產生個人存取令牌。
執行下列命令來編碼您新產生的個人存取令牌。 出現提示時,貼上您的個人存取令牌,然後複製產生的Base64編碼值。
node -e "require('readline') .createInterface({input:process.stdin,output:process.stdout,historySize:0}) .question('PAT> ',p => { b64=Buffer.from(p.trim()).toString('base64');console.log(b64);process.exit(); })"
開啟您的
.npmrc
檔案,並將佔位元[BASE64_ENCODED_PERSONAL_ACCESS_TOKEN]
取代為您剛才建立的編碼個人存取令牌。
範圍設定
在您的 .npmrc 檔案中,將 取代 registry=<YOUR_SOURCE_URL>
為 @ScopeName:registry=<YOUR_SOURCE_URL>
。
請務必在package.json檔案中包含範圍和套件名稱,如下所示: { "name": "@ScopeName/PackageName" }
。 請參閱下列範例:
組織範圍的摘要:
@ScopeName:registry=https://pkgs.dev.azure.com/<ORGANIZATION_NAME>/_packaging/<FEED_NAME>/npm/registry/ always-auth=true
{ "name": "@ScopeName/PackageName" }
專案範圍的摘要:
@ScopeName:registry=https://pkgs.dev.azure.com/<ORGANIZATION_NAME>/<PROJECT_NAME>/_packaging/<FEED_NAME>/npm/registry/ always-auth=true
{ "name": "@ScopeName/PackageName" }
範例:
@local:registry=https://pkgs.dev.azure.com/FabrikamOrg/NpmDemo/_packaging/FabrikamFeed/npm/registry/ always-auth=true
{ "name": "@demo/js-e2e-express-server", "version": "2.0.0", "description": "JavaScript server written with Express.js", "main": "index.js", "directories": { "doc": "docs", "test": "test" }
發佈限定範圍的套件
開啟命令提示字元視窗,流覽至您的專案目錄,然後執行下列命令來發佈您的範圍套件。 在我們的範例中,套件會列在檢視底下 @local 。
npm publish
上游來源與範圍
上游來源可讓您彈性地在摘要中使用範圍和非範圍套件的組合,以及來自公用登錄的範圍和非範圍套件,例如 npmjs.com。
不過,範圍會對您的套件施加命名限制:每個套件名稱都必須以 @<scope>
開頭。 如果您想要將私人套件發佈至公用登錄,則必須完整完成範圍。 如果您在部署套件時移除套件範圍,則必須更新package.json檔案中的所有參考。 考慮到這一點,範圍可作為上游來源的可行替代方案。