Qual é o significado do prefixo “at” (@) nos pacotes npm?

294

Na documentação do Angular Component Router, deparei-me com um comando npm que nunca tinha visto antes e não entendo o que está acontecendo:

npm install @angular/router --save

Qual é o significado de @angular/router?

A cadeia inteira é um nome de pacote? Mas não encontro esse pacote quando uso a pesquisa em npmjs.com . E também a pesquisa de linha de comando não retorna esse pacote:

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

Então, existe @angular/algum tipo de mecanismo de prefixo em npm? E como isso funciona?

jbandi
fonte
7
npm help scope
barra final 11/07
3
@trailingslash Essa é uma ótima resposta! (não deve ser um comentário.) #
Expiação limitada

Respostas:

324

Esse é um novo recurso do NPM chamado 'pacotes com escopo definido', que permite efetivamente que os pacotes do NPM sejam espaçados por nomes. Todo usuário e organização no NPM tem seu próprio escopo e são as únicas pessoas que podem adicionar pacotes a ele.

Isso é útil por vários motivos:

  • Ele permite que as organizações deixem claro quais pacotes são 'oficiais' e quais não são.
    • Por exemplo, se um pacote tiver o escopo @angular, você sabe que foi publicado pela equipe principal do Angular.
  • O nome do pacote só precisa ser exclusivo para o escopo em que é publicado, não para o registro inteiro.
    • Por exemplo, o nome do pacote httpjá está no repositório principal, mas o Angular também pode ter @angular/http.

A razão pela qual os pacotes com escopo definido não aparecem na pesquisa pública é porque muitos deles são pacotes privados criados por organizações que usam os serviços pagos da NPM, e eles não se sentem confortáveis ​​em abrir a pesquisa até que possam ter certeza de que não estão. tornar público qualquer coisa que não deva ser pública - de uma perspectiva legal, isso é bastante compreensível.

Para obter mais informações, consulte os documentos do NPM e os documentos angulares .

EDIT: Parece que os pacotes públicos com escopo agora aparecem corretamente na pesquisa!

Joe Clay
fonte
68

Basicamente, existem dois tipos de módulos no npm, eles são -

  • Módulos globais - são módulos que seguem a convenção de nomenclatura que existe hoje. Você require('foo')e há muita alegria. Eles pertencem a uma ou mais pessoas através do npm install XYZcomando.

  • Módulos com escopo definido - estes são novos módulos que são "escopos" sob um nome de organização que começa com @o nome da organização, uma barra e, finalmente, o nome do pacote, por exemplo @someOrgScope/packagename. Os escopos são uma maneira de agrupar pacotes relacionados e também afetam algumas coisas sobre a maneira como o npm trata o pacote.

Um pacote com escopo definido é instalado referenciando-o pelo nome, precedido por um símbolo @, na instalação do npm:

npm install @myorg/mypackage

Veja também

Pardeep Jain
fonte