Compartilhar via


Usar escopos do npm no Azure Artifacts

Azure DevOps Services | Azure DevOps Server | Azure DevOps Server 2022

Os escopos do 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 separar 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.

Azure Artifacts fornece a capacidade de publicar e baixar pacotes com escopo e sem escopo de repositórios ou registros públicos. Os escopos do 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 precisamos nos preocupar com colisões de nomes.
  • Não é necessário alterar o registro npm para instalar ou publicar nossos pacotes.
  • Cada organização/usuário 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 selecione Conectar para feed.

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

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

  4. Adicione um .npmrc arquivo no mesmo diretório que o package.jsone cole o snippet a seguir no arquivo.

    • Feed da organização com escopo:

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

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

Configurar credenciais

  1. Copie o trecho a seguir no arquivo .npmrc no nível do usuário (exemplo: C:\Users\FabrikamUser.npmrc). Certifique-se de não colá-lo no arquivo .npmrc em seu repositório de origem.

    • Feed da organização com escopo:

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

      ; 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 escopos de empacotamento>leitura e gravação.

  3. Execute o comando a seguir para codificar o token de acesso pessoal recém-gerado. Quando solicitado, cole o token de acesso pessoal e copie o valor codificado em 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(); })"
    

    Observação

    A partir de julho de 2024, os PATs (Tokens de Acesso Pessoal) do Azure DevOps têm 82 caracteres. Algumas ferramentas podem inserir quebras de linha automáticas ao codificar tokens em Base64. Para evitar isso, use o -w0 sinalizador com o comando base64 para garantir que a saída permaneça em uma única linha. Neste tutorial, usamos o método Buffer do Node, que produz uma cadeia de caracteres Base64 de linha única por padrão.

  4. Abra o arquivo .npmrc e substitua o marcador de posição [BASE64_ENCODED_PERSONAL_ACCESS_TOKEN] pelo token de acesso pessoal codificado que você acabou de criar.

Configuração de escopo

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

Inclua os nomes do escopo e do pacote no arquivo package.json da seguinte maneira: { "name": "@ScopeName/PackageName" }. Veja os exemplos abaixo:

  • Feed da organização com escopo:

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

    @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 do prompt de comando, navegue até o diretório do projeto e execute o comando a seguir para publicar seu pacote com escopo. Em nosso exemplo, nosso pacote está listado na exibição @local .

npm publish

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

Fontes ascendentes versus escopos

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

Os escopos, no entanto, impõem uma restrição de nomenclatura em seus pacotes: cada 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 fazer a implantação dos seus pacotes, precisará atualizar todas as referências em seu arquivo package.json. Com isso em mente, os escopos podem servir como uma alternativa viável para fontes upstream.