Partilhar via


Usar escopos Npm em Artefatos do Azure

Serviços de DevOps do Azure | Azure DevOps Server 2022 - Azure DevOps Server 2019

Os escopos Npm servem como um meio de categorizar pacotes relacionados em grupos. Esses escopos permitem que você crie pacotes com nomes idênticos aos criados por usuários diferentes sem encontrar conflitos. Usando escopos, você tem a capacidade de segregar pacotes públicos e privados adicionando o prefixo de escopo @scopeName e configurando o arquivo .npmrc para usar exclusivamente um feed com esse escopo específico.

O Azure Artifacts fornece a capacidade de publicar e baixar pacotes com e sem escopo de feeds ou registros públicos. Os escopos Npm são particularmente valiosos ao trabalhar com servidores locais auto-hospedados sem acesso à Internet, pois a configuração de fontes upstream nesses cenários não é viável. Em resumo, ao usar escopos:

  • Não temos que nos preocupar com colisões de nomes.
  • Não há necessidade de alterar o registro npm para instalar ou publicar nossos pacotes.
  • Cada organização/usuário do npm tem seu próprio escopo, e somente o proprietário ou os membros do escopo podem publicar pacotes em seu escopo.

Configuração do projeto

  1. Entre em sua organização do Azure DevOps e navegue até seu projeto.

  2. Selecione Artefatos e, em seguida, selecione Conectar ao feed.

    Uma captura de tela mostrando como se conectar a um feed.

  3. Selecione npm e, em seguida, selecione Outro.

  4. Adicione um .npmrc arquivo no mesmo diretório que o package.json e cole o seguinte trecho no arquivo.

    • Feed com escopo da organização:

      registry=https://pkgs.dev.azure.com/<ORGANIZATION_NAME/_packaging/<FEED_NAME>/npm/registry/
      
      always-auth=true
      
    • Feed com escopo do projeto:

      registry=https://pkgs.dev.azure.com/<ORGANIZATION_NAME>/<PROJECT_NAME>/_packaging/<FEED_NAME>/npm/registry/
      
      always-auth=true
      

Configurar credenciais

  1. Copie o seguinte trecho para o arquivo de nível .npmrc de usuário (Exemplo: C:\Users\FabrikamUser.npmrc). Certifique-se de não colá-lo no arquivo .npmrc dentro do repositório de origem.

    • Feed com escopo da organização:

      ; 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
      
    • Feed com escopo do projeto:

      ; 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. Gere um token de acesso pessoal com Packaging>Read & write scopes.

  3. Execute o seguinte comando para codificar seu token de acesso pessoal recém-gerado. Quando solicitado, cole seu token de acesso pessoal e copie o valor codificado Base64 resultante.

    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. Abra o .npmrc arquivo e substitua o espaço reservado pelo token de [BASE64_ENCODED_PERSONAL_ACCESS_TOKEN] acesso pessoal codificado que você acabou de criar.

Configuração do escopo

No arquivo .npmrc, substitua registry=<YOUR_SOURCE_URL> por @ScopeName:registry=<YOUR_SOURCE_URL>.

Certifique-se de incluir o escopo e os nomes dos pacotes no arquivo package.json da seguinte maneira: { "name": "@ScopeName/PackageName" }. Veja os exemplos abaixo:

  • Feed com escopo da organização:

    @ScopeName:registry=https://pkgs.dev.azure.com/<ORGANIZATION_NAME>/_packaging/<FEED_NAME>/npm/registry/
    
    always-auth=true
    
    {
    "name": "@ScopeName/PackageName" 
    }
    
  • Feed com escopo do projeto:

    @ScopeName:registry=https://pkgs.dev.azure.com/<ORGANIZATION_NAME>/<PROJECT_NAME>/_packaging/<FEED_NAME>/npm/registry/
    
    always-auth=true
    
    {
    "name": "@ScopeName/PackageName" 
    }
    
  • Exemplo:

    @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"
      }
    

Publicar pacotes com escopo

Abra uma janela de prompt de comando, navegue até o diretório do projeto e execute o seguinte comando para publicar seu pacote com escopo. No nosso exemplo, o nosso pacote está listado sob a @local vista.

npm publish

Uma captura de tela mostrando um pacote com escopo em um feed de Artefatos do Azure.

Fontes upstream vs escopos

As fontes upstream oferecem a você a maior flexibilidade para usar uma combinação de pacotes com e sem escopo em seu feed, bem como pacotes com e sem escopo de registros públicos, como npmjs.com.

Os escopos, no entanto, impõem uma restrição de nomenclatura aos seus pacotes: cada nome de pacote deve começar com @<scope>. Se você quiser publicar seus pacotes privados em registros públicos, deverá fazê-lo com os escopos intactos. Se você remover escopos de pacote ao implantar seus pacotes, precisará atualizar todas as referências em seu arquivo de package.json . Com isso em mente, os escopos podem servir como uma alternativa viável às fontes a montante.