Quelle est la signification du préfixe «at» (@) sur les packages npm?

294

Dans la documentation du routeur de composants angulaires, je suis juste tombé sur une commande npm que je n'avais jamais vue auparavant et je ne comprends pas ce qui se passe:

npm install @angular/router --save

Quelle est la signification de @angular/router?

La chaîne entière est-elle un nom de package? Mais je ne trouve pas ce package lorsque j'utilise la recherche sur npmjs.com . Et aussi la recherche en ligne de commande ne retourne pas un tel paquet:

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

Est-ce que le @angular/mécanisme de préfixe est dans npm? Et comment ça marche?

jbandi
la source
7
npm help scope
slash arrière
3
@trailingslash C'est une excellente réponse! (ne devrait pas être un commentaire.)
Expiation limitée le

Réponses:

324

Il s'agit d'une nouvelle fonctionnalité de NPM appelée «packages étendus», qui permet effectivement aux packages NPM d'être espacés de noms. Chaque utilisateur et organisation sur NPM a sa propre portée, et ce sont les seules personnes qui peuvent y ajouter des packages.

Ceci est utile pour plusieurs raisons:

  • Il permet aux organisations d'indiquer clairement quels packages sont «officiels» et lesquels ne le sont pas.
    • Par exemple, si un package a la portée @angular, vous savez qu'il a été publié par l'équipe de base Angular.
  • Le nom du package doit uniquement être unique à l'étendue dans laquelle il est publié, pas à l'ensemble du registre.
    • Par exemple, le nom du package httpest déjà pris dans le référentiel principal, mais Angular peut également l'avoir @angular/http.

La raison pour laquelle les packages étendus n'apparaissent pas dans la recherche publique est parce que beaucoup d'entre eux sont des packages privés créés par des organisations utilisant les services payants de NPM, et ils ne sont pas à l'aise d'ouvrir la recherche jusqu'à ce qu'ils puissent être totalement certains qu'ils ne le sont pas va rendre public tout ce qui ne devrait pas l'être - d'un point de vue juridique, c'est assez compréhensible.

Pour plus d'informations, consultez les documents NPM et les documents Angular .

EDIT: Il semble que les packages de portée publique s'affichent désormais correctement dans la recherche!

Joe Clay
la source
68

Fondamentalement, il existe deux types de modules sur npm, ils sont -

  • Modules globaux - ce sont des modules qui suivent la convention de dénomination qui existe aujourd'hui. Vous require('foo')et il y a beaucoup de joie. Ils appartiennent à une ou plusieurs personnes via la npm install XYZcommande.

  • Modules étendus - ce sont de nouveaux modules qui sont "étendus" sous un nom d'organisation qui commence par @le nom de l'organisation, une barre oblique et enfin le nom du package, par exemple @someOrgScope/packagename. Les étendues sont un moyen de regrouper des packages associés et affectent également certaines choses sur la façon dont npm traite le package.

Un package de portée est installé en le référençant par son nom, précédé d'un @ -symbol, dans l'installation de npm:

npm install @myorg/mypackage

voir également

Pardeep Jain
la source