2015-02-01 16 views
5

DatoWrapping richiede

3 Node.js proietta principale - quadro - Repository

principale ha gli altri due progetti collegati tramite collegamento NPM.

In una prova ho avvolto il requisito in un metodo. Ho alcuni problemi di risoluzione progetti legati (dettagli vedi sotto)

codice semplificato simile a questo:

module.export.resolve = function(file){ 
[...]//Some more logik to handle relative pathes 
return require(file) 
} 

Questo funziona bene nella maggior parte degli scenari. Ho anche lavorato fuori per ottenere maneggiato con parenti pathes (alzando lo sguardo per il chiamante e applicare sentieri basate su questa strada)

ora questo è in progetto quadro che è collegata (link NPM) per Main Project. Project main ha anche Repository di progetto collegati.

Ora in Main Project ho:

require('ProjectRepositories/foo') // Works as expected 
myRequire.resolve('ProjectRepositories/foo') // Returns MODULE_NOT_FOUND "Cannot find module 'ProjectRepositories/foo' 

Suppongo che il problema è che Repository Progetto ist non legato nel quadro Progetto. Ma c'è un altro modo che collegarli?

Preferirei avere meno dipendenze. Qualche suggerimento su questo?

+0

Non mi è del tutto chiaro come sia la tua struttura. Potresti chiarire? Nel frattempo, lo sapevi che puoi avere un ['NODE_PATH'] (https://nodejs.org/api/modules.html#modules_loading_from_the_global_folders) env var? – gustavohenke

+0

Dici "funziona come previsto" ma non dici cosa restituisce. Quindi, potrebbe restituire lo stesso. Da quello che hai postato, fa esattamente la stessa cosa, tranne che hai scritto una logica aggiuntiva che potrebbe effettivamente rovinare ciò che richiede importazioni. Se crei una funzione resolve2 che restituisce direttamente 'require (file)', dovrebbe funzionare esattamente come la richiesta diretta '' '('ProjectRepos/foo')'. Quindi probabilmente concluderei che la tua logica personalizzata è in realtà dove si trova l'errore, presumo. – EricG

risposta

1

Lei ha assolutamente corretta in quanto il motivo per cui il progetto quadroresolve non funziona è perché il requireFn in uso all'interno di quel progetto conosce solo sui moduli installati in tale contesto. Questo perché quando si esegue il file javascript require, il nodo valuta lo script all'interno del modulo context e non il contesto del progetto corrente (questo è il modo in cui i moduli di dipendenza "require s funzionano quando si utilizza lo script di livello superiore).

Che cosa si può fare, tuttavia, è fornire un modo per il resolver quadro di utilizzare un specificato dall'utente richiedono funzione per fare il suo lavoro, una volta che ha trasformato i sentieri.

module.exports.resolve = function(file, resolver) { 
    //Some more logik to handle relative pathes 
    resolver = typeof resolver == 'function' ? resolver : require; 
    return resolver(file) 
} 

Ora nel codice, si potrebbe fare

myRequire.resolve('ProjectRepositories/foo', require); 

Così ora la tua Main Project richiede saranno utilizzati per risolvere il file.

Si può anche fare un ulteriore passo avanti se lo si desidera e avere il modulo in stato e ricordare il resolver che si suppone utilizzi.

var _requireFn = require; 

module.exports = { 
    resolve: resolve, 
    setRequireFn: setRequireFn 
}; 

function resolve(path) { 
    return _requireFn(path); 
} 

function setRequireFn(requireFn) { 
    _requireFn = requireFn; 
} 

In un'altra nota, vorrei essere attenti a usare il termine resolve perché in nodo che è semanticamente utilizzato per guardando il percorso file corretto da richiedere, alla require.resolve.

Infine, in termini di riduzione al minimo delle dipendenze, consiglio di includere i sottoprogetti in npm utilizzando i repository github. Questo ha funzionato abbastanza bene per me in passato, a meno che i tuoi due subrepos non siano in uno stato costante di flusso. Vedi lo install docs per maggiori informazioni.