Comment remplacer les versions de dépendance NPM imbriquées?

290

Je voudrais utiliser le grunt-contrib-jasminepackage NPM. Il a différentes dépendances. Une partie du graphique des dépendances ressemble à ceci:

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

Malheureusement, il y a un bogue dans cette version phantomjsqui l'empêche de s'installer correctement sur Mac OS X. Il est corrigé dans la dernière version.

Comment puis-je grunt-lib-phantomjsutiliser une version plus récente de phantomjs?

Un contexte supplémentaire:

georgebrock
la source
Juste git cloneou fourchez le module requis. Vous pouvez également supprimer phantomjsmanuellement l' imbrication .
Aleksei Zabrodskii
3
grunt-contrib-jasmineest sur 0.5.1, qui utilise [email protected], qui utilise [email protected]:)
gustavohenke

Réponses:

238

Vous pouvez utiliser la fonctionnalité de rétrécissement npm , afin de remplacer toute dépendance ou sous-dépendance.

Je viens de le faire dans un de nos plus gros projets. Nous avions besoin d'une version plus récente de connect, depuis 2.7.3. nous causait des problèmes. J'ai donc créé un fichier nommé npm-shrinkwrap.json:

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

npm devrait le récupérer automatiquement lors de l'installation du projet.

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

tuxpiper
la source
7
Lorsque je fais cela, seules la grunt-contrib-connectdépendance et ses enfants sont installés. Toutes mes autres dépendances dans package.json ne sont pas installées.
iDVB
5
J'ai eu le même problème que @iDVB. J'ai fini par éditer le node_modulesrépertoire pour que le vidage de dépendance de film rétractable soit exactement ce que je voulais, pas seulement des remplacements. Mais toujours une sorte de solution douloureuse.
Kobold
2
@Domi ce fichier est créé en exécutant npm shrinkwrap, les entrées ne sont pas ajoutées à la main
glasspill
13
Malheureusement, comme mentionné dans ce bogue, avec npm4, l'approche minimaliste ne fonctionne plus. (Lors de la suppression node_modules, l'exécution d'une installation avec un emballage minimal semble laisser devDependenciesintacte bien qu'elle soit ignorée dependencies, mais l'exécution d'une autre installation supprime les éléments non explicites, il est donc important pour l'instant de s'exécuter npm shrinkwrappour obtenir un fichier complet, de modifier la partie en question, et puis exécutez à npm installnouveau)
Brett Zamir
6
npm 6.4 écrasera simplement le fichier de film rétractable et utilisera les dépendances obsolètes
ShadSterling
83

Pour ceux de 2018 et au-delà, en utilisant npm version 5 ou ultérieure: éditez votre package-lock.json: supprimez la bibliothèque de la "requires"section et ajoutez-la sous "dépendances".

Par exemple, vous souhaitez que le deglobpackage utilise la globversion du package 3.2.11au lieu de sa version actuelle. Vous ouvrez package-lock.jsonet voyez:

"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"
  }
},

Supprimer "glob": "7.1.2",de "requires", ajouter "dependencies"avec la version appropriée:

"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"
    }
  }
},

Maintenant, supprimez votre node_modulesdossier, exécutez npm installet il ajoutera des parties manquantes à la "dependencies"section.

izogfif
la source
4
C'est bien, tant qu'il npm installs'exécute une seule fois. Dans mon cas, les modifications sont nécessaires car le dépôt imbriqué provoque un échec.
ppasler
59
cela sera supprimé à chaque fois que vous exécuterez npm iau lieu de modifier votre package-lock.json et d'ajouter la dépendance enfant aux "dépendances", ajoutez la dépendance enfant à votre section "dépendances" de package.json
trickpatty
6
J'ai créé une bibliothèque qui fait exactement cela pour vous automatiquement: github.com/rogeriochaves/npm-force-resolutions
Rogerio Chaves
14
Cela fonctionne, mais si je lance à npm installnouveau, toutes les modifications package-lock.jsonsont annulées et je récupère la mauvaise version du dep.
2rs2ts
14
Je cours npm ciet cela ne touche pas lepackage-lock.json
sschoof
0

J'ai eu un problème où l'une des dépendances imbriquées avait une vulnérabilité d'audit npm, mais je voulais toujours conserver la version de la dépendance parent. la solution npm shrinkwrap n'a pas fonctionné pour moi, donc ce que j'ai fait pour remplacer la version de dépendance imbriquée:

  1. Supprimez la dépendance imbriquée dans la section «requiert» dans package-lock.json
  2. Ajoutez la dépendance mise à jour sous DevDependencies dans package.json, afin que les modules qui en ont besoin puissent toujours y accéder.
  3. npm i
Ethan Yang
la source
-1

Le film rétractable NPM offre une bonne solution à ce problème. Cela nous permet de remplacer cette version d'une dépendance particulière d'un sous-module particulier.

Essentiellement, lorsque vous exécutez l'installation de npm, npm recherchera d'abord dans votre répertoire racine pour voir s'il existe un fichier npm-shrinkwrap.json. Si tel est le cas, il l'utilisera d'abord pour déterminer les dépendances des packages, puis reviendra au processus normal de traitement des fichiers package.json.

Pour créer un npm-shrinkwrap.json, tout ce que vous devez faire est

 npm shrinkwrap --dev

code:

{
  "dependencies": {
    "grunt-contrib-connect": {
      "version": "0.3.0",
      "from": "[email protected]",
      "dependencies": {
        "connect": {
          "version": "2.8.1",
          "from": "connect@~2.7.3"
        }
      }
    }
  }
}
Murtaza Hussain
la source
3
Est-ce différent de la réponse actuellement acceptée? Cette réponse contient deux commentaires positifs suggérant que les nouvelles versions de npm nécessitent des étapes manuelles supplémentaires ou font des choses indésirables avec cette solution. N'est-ce pas le cas?
Fabio Beltramini
-1

J'ai trouvé une solution qui a fonctionné pour moi.

Alors. Modifiez d'abord votre fichier npm-shrinkwrap.json comme recommandé pour toutes les autres solutions.

Ensuite, (sous Windows):

  • Faites un clic droit sur le fichier 'npm-shrinkwrap.json'
  • Propriétés
  • Sous Attributs, sélectionnez «Lecture seule». Cela empêchera npm de modifier le fichier mpn-shrinkwrap.json.

Les autres solutions proposées sont suffisantes si vous effectuez l'opération «npm install» une seule fois. Mais après la première 'installation de npm', le fichier 'npm-shrinkwrap.json' est à nouveau modifié comme avant votre modification.

Shlomo Sfez
la source
-1: cela vous obligerait à déverrouiller le fichier à chaque fois que vous souhaitez apporter des modifications. Dans ces cas, vous perdriez de toute façon les modifications manuelles apportées au fichier de film rétractable. De plus, toute personne collaborant à votre code doit également activer ce piratage.
thomaux