Uso de ámbitos de Npm en Azure Artifacts

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

Los ámbitos de Npm sirven como medio para clasificar los paquetes relacionados en grupos. Estos ámbitos permiten crear paquetes con nombres idénticos a los creados por distintos usuarios sin encontrar conflictos. Mediante el uso de ámbitos, tiene la capacidad de separar paquetes públicos y privados agregando el prefijo de ámbito @scopeName y configurando el archivo .npmrc para usar exclusivamente una fuente con ese ámbito determinado.

Azure Artifacts proporciona la capacidad de publicar y descargar paquetes con ámbito y no de ámbito desde fuentes o registros públicos. Los ámbitos de Npm son especialmente valiosos cuando se trabaja con servidores locales autohospedados que carecen de acceso a Internet, ya que la configuración de orígenes ascendentes en estos escenarios no es factible. En resumen, al usar ámbitos:

  • No tenemos que preocuparnos por las colisiones de nombres.
  • No es necesario cambiar el registro de npm para instalar o publicar nuestros paquetes.
  • Cada organización o usuario de npm tiene su propio ámbito, y solo el propietario o los miembros del ámbito pueden publicar paquetes en su ámbito.

Configuración del proyecto

  1. Inicie sesión en su organización de Azure DevOps y vaya a su proyecto.

  2. Seleccione Artefactos y, a continuación, seleccione Conectar para alimentar.

    Captura de pantalla que muestra cómo conectarse a una fuente.

  3. Seleccione npm y, a continuación, seleccione Otro.

  4. Agregue un .npmrc archivo en el mismo directorio que el package.json y pegue el siguiente fragmento de código en el archivo.

    • Fuente con ámbito de la organización:

      registry=https://pkgs.dev.azure.com/<ORGANIZATION_NAME/_packaging/<FEED_NAME>/npm/registry/
      
      always-auth=true
      
    • Fuente con ámbito de proyecto:

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

Configuración de credenciales

  1. Copie el siguiente fragmento de código en el archivo de nivel .npmrc de usuario (ejemplo: C:\Users\FabrikamUser.npmrc). Asegúrese de no pegarlo en el archivo .npmrc dentro del repositorio de origen.

    • Fuente con ámbito de la organización:

      ; 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
      
    • Fuente con ámbito de proyecto:

      ; 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. Genere un token de acceso personal con ámbitos de lectura y escritura de empaquetado>.

  3. Ejecute el comando siguiente para codificar el token de acceso personal recién generado. Cuando se le solicite, pegue el token de acceso personal y, a continuación, copie el valor codificado en 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 el .npmrc archivo y reemplace el marcador de posición [BASE64_ENCODED_PERSONAL_ACCESS_TOKEN] por el token de acceso personal codificado que acaba de crear.

Configuración del ámbito

En el archivo .npmrc, reemplace por registry=<YOUR_SOURCE_URL>@ScopeName:registry=<YOUR_SOURCE_URL>.

Asegúrese de incluir tanto el ámbito como los nombres de paquete en el archivo de package.json como se indica a continuación: { "name": "@ScopeName/PackageName" }. Consulte los ejemplos siguientes:

  • Fuente con ámbito de la organización:

    @ScopeName:registry=https://pkgs.dev.azure.com/<ORGANIZATION_NAME>/_packaging/<FEED_NAME>/npm/registry/
    
    always-auth=true
    
    {
    "name": "@ScopeName/PackageName" 
    }
    
  • Fuente con ámbito de proyecto:

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

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

Publicación de paquetes con ámbito

Abra una ventana del símbolo del sistema, vaya al directorio del proyecto y ejecute el siguiente comando para publicar el paquete con ámbito. En nuestro ejemplo, nuestro paquete aparece en la @local vista.

npm publish

Captura de pantalla que muestra un paquete con ámbito en una fuente de Azure Artifacts.

Orígenes ascendentes frente a ámbitos

Los orígenes ascendentes ofrecen la mayor flexibilidad para usar una combinación de paquetes con ámbito y no de ámbito en la fuente, así como paquetes con ámbito y sin ámbito de registros públicos, como npmjs.com.

Sin embargo, los ámbitos imponen una restricción de nomenclatura en los paquetes: cada nombre de paquete debe comenzar con @<scope>. Si desea publicar los paquetes privados en registros públicos, debe hacerlo con los ámbitos intactos. Si quita ámbitos de paquete al implementar los paquetes, deberá actualizar todas las referencias del archivo package.json . Teniendo esto en cuenta, los ámbitos pueden servir como una alternativa viable a los orígenes ascendentes.