在 Azure Artifacts 中使用 Npm 范围

Azure DevOps Services | Azure DevOps Server 2022 - Azure DevOps Server 2019 | TFS 2018

Npm 范围用作将相关包分类为组的方法。 通过这些范围,可以创建与不同用户创建的名称相同的包,而不会遇到冲突。 通过使用范围,可以通过添加范围前缀 @scopeName 和配置 .npmrc 文件来专门使用具有该特定范围的源来隔离公共包和专用包。

Azure Artifacts 提供从源或公共注册表发布和下载作用域内包和非作用域包的功能。 使用缺少 Internet 访问权限的自承载本地服务器时,Npm 范围特别有用,因为在这种情况下配置上游源是不可行的。 总之,使用范围时:

  • 我们不必担心名称冲突。
  • 无需更改 npm 注册表即可安装或发布包。
  • 每个 npm 组织/用户都有自己的范围,只有所有者或作用域成员才能将包发布到其范围。

项目设置

  1. 登录到 Azure DevOps 组织,并导航到你的项目。

  2. 选择“项目,然后选择连接源

    A screenshot showing how to connect to a feed.

  3. 选择 npm,然后选择“ 其他”。

  4. .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
      

设置凭据

  1. 将以下代码片段复制到用户级 .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
      
  2. 使用打包>读取和写入范围生成个人访问令牌。

  3. 运行以下命令,对新生成的个人访问令牌进行编码。 出现提示时,粘贴个人访问令牌,然后复制生成的 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(); })"
    
  4. .npmrc打开文件,并将占位符[BASE64_ENCODED_PERSONAL_ACCESS_TOKEN]替换为刚刚创建的编码的个人访问令牌。

  1. 导航到项目 http://ServerName:8080/tfs/DefaultCollection/<ProjectName>

  2. 选择“生成”和“ 发布”。

  3. 选择“包”,然后选择连接来馈送

  4. 选择 npm,然后选择“生成 npm 凭据,然后复制凭据并将其添加到 .npmrc 文件。

    Screenshot showing how to generate npm credentials in TFS.

范围设置

在 .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

A screenshot showing a scoped package in an Azure Artifacts feed.

上游源与范围

上游源使你能够最灵活地在源中使用作用域内和非作用域包的组合,以及公共注册表中的作用域包和非作用域包(如 npmjs.com)。

但是,作用域对包施加命名限制:每个包名称必须以 @<scope>开头。 如果要将专用包发布到公共注册表,则必须在作用域保持不变的情况下执行此操作。 如果在部署包时删除包范围,则需要更新 package.json 文件中的所有引用。 考虑到这一点,范围可以作为上游源的可行替代方法