2014-12-31 25 views
5

Ho un servizio in cui voglio consentire agli utenti in fase di installazione di specificare quale motore di persistenza utilizzare, cioè file-based, MongoDB o Redis, e sto cercando un po 'di magia npm in cui si scaricano solo i moduli necessari (nessuno, mongodb o redis, rispettivamente).Posso specificare dipendenze del modulo opzionali in npm package.json?

È possibile? Non riesco a trovare tutte le opzioni diverse da quelle che definisce le dipendenze e devDependencies in package.json, e che non è appropriato per questo.

Si noti inoltre che mentre i moduli mongodb e redis possono essere relativamente piccoli, si consideri un caso alternativo in cui è possibile che sia necessario Java per la comunicazione RMI.

Grazie!

+0

C'è un campo ['optionalDependencies'] (https://docs.npmjs.com/files/package.json#optionaldependencies), ma non è quello che stai cercando. – Scimonster

+0

In realtà penso che sarà sufficiente. Se un MongoDB facoltativa non riesce a installare perché non c'è compilatore C++ o un nodo-JMX opzionale fallisce perché non c'è JRE, allora va bene. Anche la documentazione solo mostra il codice JS, ma è possibile aggiungere ' "optionalDependencies": {}' nel vostro package.json e funziona. Se modifichi qualcosa intorno a questo nella tua risposta, lo segnerò correttamente. – anthonyserious

risposta

2

È possibile utilizzare uno script di post-installazione, quindi installarli.

È possibile installare le cose utilizzando lo npm module a livello di programmazione.

Quindi, si potrebbe fare qualcosa di simile:

var npm = require('npm'); // make sure npm is in your package.json! 
npm.load({/* some object properties, if needed */}, function(err) { 
    if (err) {return handleError(err)} 
    if (usingMongoDB) { 
     npm.commands.install(['mongodb'], function(err){ 
     if (err) {return handleError(err)} 
     console.log('mongodb successfully installed'); 
    }); 
}); 

Ora, non ho mai fatto qualcosa di simile, quindi vi consiglio di guardare la documentazione per programmatica npm install, e anche load.

+0

Interessante. L'esecuzione di uno script post-installazione può funzionare, ovviamente, ma spero in una soluzione a una sola riga. Mi sentirei strano anche a scaricare pacchetti da un'app dopo che l'app è già stata distribuita. – anthonyserious

+0

Non consiglierei questo approccio dato che npm ti avvisa di non usare la sua API: [_Sebbene npm possa essere usato a livello di programmazione, la sua API è pensata per essere utilizzata solo dalla CLI e non viene fornita alcuna garanzia sulla sua idoneità per altri scopi. _] (https://github.com/npm/npm#using-npm-programmatically) Invece è possibile utilizzare [questo metodo] (http://stackoverflow.com/a/17537559/516433) – Lucas

Problemi correlati