javascript node.js npm chef

javascript - Uso del símbolo @ en los nombres de los módulos de nodo



node.js npm (5)

Además de los paquetes de ámbito, la ''@'' puede surgir debido al paquete de alias de módulo en npm. Mediante el alias de módulos, puede usar módulos de uso frecuente sin requerir su ruta completa. También es efectivo cuando la estructura del directorio es larga. ej.) require(''../../../../some/very/deep/module'')

En su lugar, puede usar: var module = require(''@deep/module'')

En package.json puede proporcionar los módulos para los que está proporcionando alias:

"_moduleAliases": { "@root" : ".", // Application''s root "@deep" : "src/some/very/deep/directory/or/file", "@my_module" : "lib/some-file.js", "something" : "src/foo", // Or without @. Actually, it could be any string }

Y en el archivo principal de la aplicación use esto:

require(''module-alias/register'');

Consulte aquí para obtener información detallada: module-alias

Estoy mirando un código de un compañero de trabajo que escribió y está usando el símbolo @ en las declaraciones obligatorias. Esta es la primera línea de uno de estos archivos:

var restServer = require(''@company/config'')

Cuando intento ejecutar este código, aparece un error:

Error: Cannot find module ''@company/config''

Lo que francamente espero, ¡no hay nada que se vea así en mi directorio que deba reconocer! Parece que hay algo de magia aquí, lo cual odio.

Todo lo que puedo adivinar es que este es un oscuro truco npm o Node al que no he estado expuesto, o tal vez hay algún otro arte oscuro de configuración que no estoy entendiendo. Cualquier información apreciada, incluso si es solo una explicación de cómo funciona @ require.

Otras ideas: Chef está involucrado en algún lugar de todo esto, por lo que podría ser relevante.

Actualización : 99% seguro de que este es un problema con la forma en que funciona npm config en este momento, pero aún no está seguro de cómo solucionarlo.

Update2 basado en algunas cosas que descubrí:

Dereks-MacBook-Pro:project-dir derekjanni$ npm config set //registry.npmjs.org/:authtoken $SECRET_TOKEN Dereks-MacBook-Pro:project-dir derekjanni$ npm install npm ERR! Darwin 15.0.0 npm ERR! argv "/usr/local/Cellar/node/5.5.0/bin/node" "/usr/local/bin/npm" "install" npm ERR! node v5.5.0 npm ERR! npm v3.5.3 npm ERR! code E404 npm ERR! 404 Not found : @company/config npm ERR! 404 ''@company/config'' is not in the npm registry.


Así que lo resolví yo mismo.

Resulta que @company/config es uno de nuestros repositorios privados de NPM, alojado en npm y definido por este alias en un repositorio interno de GitHub: no tenía nada que ver con cómo funciona.

Usar @ puede o no ser un protocolo que desconocía para los repositorios privados de NPM, tenlo en cuenta si te encuentras con esto.


Cuando llamas a require() , lee una ruta. Dado que parece que no hay problema si nombra una carpeta como @company , debería poder solicitar algo con una @ .

Es posible que su compañero de trabajo haya querido quedarse con @company/config.js para sí mismo porque las configuraciones generalmente son personales y podrían no ser las mismas para otro usuario.

require llamará a los archivos dentro de su carpeta de proyecto, con un detalle:

  • Si llama archivos dentro de las carpetas de su proyecto, debe agregar ./ delante de su ruta.
  • Si llama a cualquier paquete global como http o cualquier módulo npm (que están instalados en node_modules ), puede omitir el ./ .

Creé una ruta @company/config dentro de mi carpeta de proyecto de prueba. Solo me permitió requerirlo usando ./@company/config . Solo cuando moví la carpeta dentro de node_modules , me permitió require(''@company/config''); .

No recomendaría poner ningún módulo dentro de node_modules , es solo un ''contenedor'' para paquetes npm . Intente crear un nuevo archivo de configuración y cambie la ruta requerida o simplemente elimine el requisito y cree un objeto de configuración en su archivo principal.


Los paquetes con ámbito en npm están precedidos por un símbolo ''@'': https://docs.npmjs.com/misc/scope

Los documentos incluyen información adicional sobre la necesidad de paquetes con alcance: https://docs.npmjs.com/misc/scope#requiring-scoped-packages

Requerir paquetes con alcance

Debido a que los paquetes con ámbito se instalan en una carpeta de alcance, debe incluir el nombre del alcance cuando los requiera en su código, p. Ej.

require(''@myorg/mypackage'')

No hay nada especial en la forma en que Node trata las carpetas de alcance, esto solo especifica que se requiere el módulo mypackage en la carpeta llamada @myorg.


El alcance @ indica la propiedad del paquete

La principal ventaja de los ámbitos que he visto hasta ahora es que cada ámbito está controlado por la cuenta npm de una organización / usuario, al igual que los nombres de usuario / nombres de organizaciones de GitHub.

De esta manera, facilita determinar si el paquete que está buscando pertenece a una organización en la que confía, o si es una herramienta de terceros.

Por ejemplo, si ves:

@angular/cli

entonces sabes que proviene del equipo de Angular y se puede confiar.

Por otro lado, no se podría decir lo mismo sobre:

angular-cli

Consulte también: ¿Cuál es el significado del prefijo "at" (@) en los paquetes npm?