Come sovrascrivere le versioni nidificate di dipendenza NPM?


291

Vorrei usare il grunt-contrib-jasminepacchetto NPM. Ha varie dipendenze. Parte del grafico delle dipendenze è simile al seguente:

─┬ grunt-contrib-jasmine@0.4.1
  ├─┬ grunt-lib-phantomjs@0.2.0
   ├─┬ phantomjs@1.8.2-2

Sfortunatamente, c'è un bug in questa versione phantomjsche ne impedisce l'installazione corretta su Mac OS X. Questo problema è stato risolto nell'ultima versione.

Come posso grunt-lib-phantomjsusare una versione più recente di phantomjs?

Qualche ulteriore contesto:


git cloneModulo richiesto solo o fork. Puoi anche rimuovere phantomjsmanualmente nidificato .
Aleksei Zabrodskii,

3
grunt-contrib-jasmineè su 0.5.1, che utilizza grunt-lib-phantomjs@0.3.1, che utilizza phantomjs@1.9.1-0:)
gustavohenke

Risposte:


237

È possibile utilizzare la funzionalità npm shrinkwrap , al fine di ignorare qualsiasi dipendenza o sub-dipendenza.

L'ho appena fatto in un nostro grugnito progetto. Avevamo bisogno di una versione più recente di connect, dal 2.7.3. stava causando problemi per noi. Quindi ho creato un file chiamato npm-shrinkwrap.json:

{
  "dependencies": {
    "grunt-contrib-connect": {
      "version": "0.3.0",
      "from": "grunt-contrib-connect@0.3.0",
      "dependencies": {
        "connect": {
          "version": "2.8.1",
          "from": "connect@~2.7.3"
        }
      }
    }
  }
}

npm dovrebbe raccoglierlo automaticamente mentre esegue l'installazione per il progetto.

(Vedi: https://nodejs.org/en/blog/npm/managing-node-js-dependencies-with-shrinkwrap/ )


7
Quando lo faccio, grunt-contrib-connectvengono installati solo la dipendenza e i relativi figli. Tutte le altre mie dipendenze in package.json non sono installate.
iDVB,

5
Ho avuto lo stesso problema di @iDVB. Ho finito per modificare la node_modulesdirectory in modo che il dump completo della dipendenza shrinkwrap fosse esattamente quello che volevo, non solo le sostituzioni. Ma ancora una sorta di soluzione dolorosa.
Kobold,

2
@Domi questo file viene creato eseguendo npm shrinkwrap, le voci non vengono aggiunte a mano
glasspill

13
Sfortunatamente, come menzionato in quel bug, con npm4, l'approccio minimalista non funziona più. (Quando si elimina node_modules, l'esecuzione di un'installazione con un restringimento minimo sembra lasciare devDependenciesintatta sebbene ignorando dependencies, ma l'esecuzione di un'altra installazione rimuove gli elementi non espliciti, quindi per ora è importante eseguire npm shrinkwrapper ottenere un file completo, modificare la parte in questione e quindi correre di npm installnuovo)
Brett Zamir,

6
npm 6.4 sovrascriverà semplicemente il file
shrinkwrap

86

Per quelli a partire dal 2018 e oltre, utilizzando npm versione 5 o successive: modifica il tuo package-lock.json: rimuovi la libreria dalla "requires"sezione e aggiungila in "dipendenze".

Ad esempio, si desidera che il deglobpacchetto utilizzi la globversione del pacchetto 3.2.11anziché quella corrente. Apri package-lock.jsone vedi:

"deglob": {
  "version": "2.1.0",
  "resolved": "https://registry.npmjs.org/deglob/-/deglob-2.1.0.tgz",
  "integrity": "sha1-TUSr4W7zLHebSXK9FBqAMlApoUo=",
  "requires": {
    "find-root": "1.1.0",
    "glob": "7.1.2",
    "ignore": "3.3.5",
    "pkg-config": "1.1.1",
    "run-parallel": "1.1.6",
    "uniq": "1.0.1"
  }
},

Rimuovi "glob": "7.1.2",da "requires", aggiungi "dependencies"con la versione corretta:

"deglob": {
  "version": "2.1.0",
  "resolved": "https://registry.npmjs.org/deglob/-/deglob-2.1.0.tgz",
  "integrity": "sha1-TUSr4W7zLHebSXK9FBqAMlApoUo=",
  "requires": {
    "find-root": "1.1.0",
    "ignore": "3.3.5",
    "pkg-config": "1.1.1",
    "run-parallel": "1.1.6",
    "uniq": "1.0.1"
  },
  "dependencies": {
    "glob": {
      "version": "3.2.11"
    }
  }
},

Ora rimuovi la tua node_modulescartella, esegui npm installe aggiungerà parti mancanti alla "dependencies"sezione.


4
Questo è bello, purché funzioni npm installuna volta. Nel mio caso le modifiche sono necessarie in quanto il dep nidificato sta causando un errore.
ppasler

60
questo verrà rimosso ogni volta che esegui npm iinvece di modificare il pacchetto-lock.json e aggiungere la dipendenza figlio alle "dipendenze" lì, aggiungi la dipendenza figlio alla sezione "dipendenze" package.json
trickpatty

6
Ho creato una libreria che fa esattamente questo per te automaticamente: github.com/rogeriochaves/npm-force-resolutions
Rogerio Chaves

14
Funziona ma poi se corro di npm installnuovo, tutte le modifiche package-lock.jsonvengono ripristinate e ottengo la versione errata del dep.
2:00 e

14
Corro npm cie questo non tocca ilpackage-lock.json
sschoof del


0

Ho riscontrato un problema a causa del quale una delle dipendenze nidificate presentava una vulnerabilità di controllo npm, ma volevo comunque mantenere la versione di dipendenza principale. la soluzione npm shrinkwrap non ha funzionato per me, quindi cosa ho fatto per sovrascrivere la versione di dipendenza nidificata:

  1. Rimuovere la dipendenza nidificata nella sezione "richiede" in package-lock.json
  2. Aggiungi la dipendenza aggiornata in DevDependencies in package.json, in modo che i moduli che la richiedono siano ancora in grado di accedervi.
  3. npm i

-1

La termoretraibile NPM offre una buona soluzione a questo problema. Ci consente di sovrascrivere quella versione di una particolare dipendenza di un particolare sottomodulo.

In sostanza, quando si esegue npm install, npm cercherà innanzitutto nella directory principale per vedere se esiste un file npm-shrinkwrap.json. In tal caso, utilizzerà prima questo per determinare le dipendenze dei pacchetti, quindi tornerà al normale processo di elaborazione dei file package.json.

Per creare un npm-shrinkwrap.json, tutto ciò che devi fare è

 npm shrinkwrap --dev

codice:

{
  "dependencies": {
    "grunt-contrib-connect": {
      "version": "0.3.0",
      "from": "grunt-contrib-connect@0.3.0",
      "dependencies": {
        "connect": {
          "version": "2.8.1",
          "from": "connect@~2.7.3"
        }
      }
    }
  }
}

3
È diverso dalla risposta attualmente accettata? Questa risposta ha due commenti positivi che suggeriscono che le versioni più recenti di npm richiedono passaggi manuali aggiuntivi o eseguono operazioni indesiderate con questa soluzione. Non è così?
Fabio Beltramini,

-1

Ho trovato una soluzione che ha funzionato per me.

Così. Prima modifica il tuo file npm-shrinkwrap.json come raccomandato da tutte le altre soluzioni.

Quindi, (su Windows):

  • Fare clic con il tasto destro del mouse sul file 'npm-shrinkwrap.json'
  • Proprietà
  • In Attributi seleziona "Sola lettura". Ciò impedirà a npm di modificare il file mpn-shrinkwrap.json.

Le altre soluzioni proposte sono abbastanza buone se si esegue l'operazione 'npm install' una sola volta. Ma dopo la prima 'npm install' il file 'npm-shrinkwrap.json' viene nuovamente modificato come prima della modifica.


-1: ciò richiederebbe di sbloccare nuovamente il file ogni volta che si desidera apportare modifiche. In quei casi, perdi comunque le modifiche manuali nel file degli strizzacervelli. Inoltre, tutti coloro che collaborano al tuo codice devono abilitare anche questo hack.
thomaux,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.