¿Cuál es el significado del prefijo "at" (@) en los paquetes npm?

294

En el documentación de Angular Component Router, me topé con un comando npm que nunca había visto antes y no entiendo lo que está sucediendo:

npm install @angular/router --save

¿Cuál es el significado de @angular/router?

¿Es toda la cadena un nombre de paquete? Pero luego no encuentro ese paquete cuando uso la búsqueda en npmjs.com . Y también la búsqueda de línea de comandos no devuelve dicho paquete:

npm search @angular/router
:No match found for "@angular/router"

Entonces, ¿hay @angular/algún tipo de mecanismo de prefijo en npm? Y, ¿cómo funciona?

jbandi
fuente
77
npm help scope
corte final
3
@trailingslash ¡Esa es una gran respuesta! (no debería ser un comentario).
Expiación limitada el

Respuestas:

324

Esta es una nueva característica de NPM llamada 'paquetes con ámbito', que efectivamente permite que los paquetes NPM tengan espacios de nombres. Cada usuario y organización en NPM tiene su propio alcance, y son las únicas personas que pueden agregarle paquetes.

Esto es útil por varias razones:

  • Permite a las organizaciones dejar en claro qué paquetes son 'oficiales' y cuáles no.
    • Por ejemplo, si un paquete tiene el alcance @angular, usted sabe que fue publicado por el equipo central de Angular.
  • El nombre del paquete solo debe ser exclusivo del alcance en el que se publica, no el registro completo.
    • Por ejemplo, el nombre del paquete httpya está en el repositorio principal, pero Angular también puede tenerlo @angular/http.

La razón por la que los paquetes de ámbito no aparecen en la búsqueda pública es porque muchos de ellos son paquetes privados creados por organizaciones que utilizan los servicios pagos de NPM, y no se sienten cómodos abriendo la búsqueda hasta que puedan estar totalmente seguros de que no hará público todo lo que no debería ser público: desde una perspectiva legal, esto es bastante comprensible.

Para obtener más información, consulte los documentos de NPM y los documentos angulares. .

EDITAR: ¡Parece que los paquetes de ámbito público ahora se muestran correctamente en la búsqueda!

Joe Clay
fuente
68

Básicamente, hay dos tipos de módulos en npm, que son:

  • Módulos globales: son módulos que siguen la convención de nomenclatura que existe hoy en día. Tú require('foo')y hay mucho regocijo. Son propiedad de una o más personas a través del npm install XYZcomando.

  • Módulos con ámbito: estos son módulos nuevos que están "con ámbito" bajo el nombre de una organización que comienza con @el nombre de la organización, una barra diagonal y finalmente el nombre del paquete, por ejemplo @someOrgScope/packagename. Los ámbitos son una forma de agrupar paquetes relacionados, y también afectan algunas cosas sobre la forma en que npm trata el paquete.

Un paquete con ámbito se instala haciendo referencia a él por nombre, precedido por un símbolo @, en npm install:

npm install @myorg/mypackage

ver también

Pardeep Jain
fuente