Citando @npm_support a:
https://twitter.com/npm_support/status/968195526989512705
2/2 Se vuoi evitare problemi di installazione relativi a dipendenze, una via è per voi di scrivere un wrapper che è richiesto come una dipendenza regolare, e per assicurarsi che abbia optionalDeps
(e anche assicurarsi che il wrapper verifichi di avere tutto il necessario per funzionare).
Ma IMHO sembra più una soluzione alternativa alla risoluzione del problema per davvero.
posso capire che NPM vuole preservare la portabilità ed evitare di trattare con le specifiche della piattaforma, ma deve essere fatto comunque e secondo me fare questo in fase di esecuzione non è ottimale (specialità se uno vuole fare di ottimizzare le dimensioni del codice).
Quindi oggi non ho una soluzione ottimale da condividere ma una discussione aperta per la proposta.
Non è possibile supportare "dipendenze condizionali" in npm?
La prima cosa che mi è venuta in mente è stata aggiungere una sezione "override" che cambierà (+ aggiungi, -remove, = sostituisci) le sezioni analizzate in corso.
Ad esempio:
dependencies: { "common-stuff": "*" } overrides: { "os: { linux: { dependencies: { "+best-linux-module" } } } }
E altra opzione suggerita da uno sviluppatore lo so, potrebbe essere quella di introdurre un fornisce parola chiave, quindi più moduli potrebbe fornire una stessa semantica di quanto sarebbe soddisfatto da resolver (a la debian), ma sta generando un overhead simile.
Sto cercando un approccio generico non solo incentrato sul supporto del sistema operativo ma anche su altri tipi di pacchetto (a seconda dei motori, ad esempio).
Conosci qualche problema correlato nel tracker NPM? se non sto considerando di presentare un bug di essere monitorati a:
https://github.com/npm/npm/issues?q=dependencies+conditional
Commenti benvenuto su questa idea.
Buona domanda. So che c'è il campo 'os' in [package.json] (https://npmjs.org/doc/json.html), ma questo non ti permette di scambiare dipendenze basate sulla piattaforma corrente - è solo dichiara a quali piattaforme un pacchetto è inserito nella whitelist/blacklist. Per esempio, questa struttura in 'package.json': ' "os": [ "! Win32", "Darwin"] ' significa "questo pacchetto non verrà eseguito in Windows, ma verrà eseguito su Mac".Sfortunatamente, questo non raggiunge davvero quello che stai chiedendo. – smithclay
^Questo è esattamente il problema, se il modulo dbus ha binding nativi che verranno compilati solo su un sistema operativo specifico ([come menzionato di seguito nel commento] (http://stackoverflow.com/questions/15176082/npm-package-json- os-specific-dependency # comment22801812_15670089)), il suo package.json dovrebbe includere quel campo 'os'. –