2016-03-29 17 views
18

Sto guardando un codice da un collega ha scritto e sta usando il simbolo @ in istruzioni require. Questa è la prima linea di uno di questi file:Uso del simbolo @ nei nomi dei moduli Node

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

Quando provo a eseguire questo codice, ottengo un errore:

Error: Cannot find module '@company/config'

Che io francamente aspetto, non c'è nulla di simile a questa in la mia directory per richiedere di riconoscere! Sembra che qui ci sia un po 'di magia, che odio.

Tutto quello che posso immaginare è che si tratti di oscuri trucchi NPM o Nodi a cui non sono stato esposto, o forse che ci sia qualche altra arte oscura di configurazione che non riesco a ottenere. Qualsiasi informazione è apprezzata, anche se è solo una spiegazione di come @ funziona con require.

Altre idee: lo chef è coinvolto da qualche parte in tutto questo, quindi potrebbe essere rilevante.

Aggiornamento: 99% certo questo è un problema con il modo in npm config opere, a questo punto, ma ancora sicuri di come fare per risolverlo.

Update2 sulla base di alcune cose ho scoperto:

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. 
+3

Associato un'operazione con un ambito per un Registro di sistema di ambito . Utile quando si accede a un registro privato per la prima volta: npm login --scope = @ organization --registry = registry.organization.com, che causerà la mappatura di @organization nel registro per l'installazione futura di pacchetti specificati in base a il pattern @ organization/package. da https://docs.npmjs.com/misc/config –

risposta

7

Quindi l'ho risolto io stesso.

Risulta @company/config è uno dei nostri repository NPM privati, ospitato su npm e definito da questo alias in un repository GitHub interno: non ha nulla a che fare con il modo in cui funziona require.

L'utilizzo di @ può essere o meno un protocollo di cui non ero a conoscenza per i repository NPM privati, tenetelo presente se ci si imbatte in questo.

2

Quando si chiama require() si legge un percorso. Poiché non sembra esserci alcun problema se si nomina una cartella come @company, si dovrebbe essere in grado di richiedere qualcosa con un @.

Il tuo collaboratore potrebbe aver voluto mantenere @company/config.js da solo perché le configurazioni di solito sono personali e non possono essere le stesse per un altro utente.

require chiamerà i file all'interno della cartella di progetto, con un dettaglio:

  • Se si chiama file all'interno le cartelle di progetto è necessario aggiungere ./ di fronte al vostro percorso.
  • Se si chiama un pacchetto globale come http o qualsiasi npm moduli (che sono installati su node_modules), è possibile omettere lo ./.

Ho creato un percorso @company/config nella cartella del mio progetto di test. Mi permetteva solo di richiederlo usando ./@company/config. Solo quando ho spostato la cartella all'interno di node_modules, mi ha permesso di require('@company/config');.

Non consiglio di inserire alcun modulo all'interno di node_modules, è solo un 'contenitore' per i pacchetti npm. Prova a creare un nuovo file di configurazione e modifica la route richiesta o semplicemente elimina il require e crea un oggetto config nel tuo file principale.

+0

Grazie! Questa è una buona risposta con qualche utile, ma in realtà ho risolto il mio problema qualche tempo fa. Lo posterò per rispondere alle domande degli altri. –

12

pacchetti con ambito di NPM sono preceduti da un simbolo '@': https://docs.npmjs.com/misc/scope

La documentazione includere ulteriori informazioni sul richiedono pacchetti con ambito: https://docs.npmjs.com/misc/scope#requiring-scoped-packages

Requiring scoped packages

Because scoped packages are installed into a scope folder, you have to include the name of the scope when requiring them in your code, e.g.

require('@myorg/mypackage') 

There is nothing special about the way Node treats scope folders, this is just specifying to require the module mypackage in the folder called @myorg.

Problemi correlati