Як я можу замінити вкладені версії залежності NPM?


290

Я хотів би використовувати grunt-contrib-jasmineпакет NPM. Він має різні залежності. Частина графіка залежності виглядає так:

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

На жаль, в цій версії є помилка, phantomjsяка не дозволяє їй правильно встановитись на Mac OS X. Це виправлено в останній версії.

Як я можу отримати grunt-lib-phantomjsновішу версію phantomjs?

Деякі додаткові контексти:


Просто git cloneабо вилка необхідний модуль. Ви також можете видалити вкладені phantomjsвручну.
Олексій Забродський

3
grunt-contrib-jasmineзнаходиться на 0.5.1, який використовує grunt-lib-phantomjs@0.3.1, який використовує phantomjs@1.9.1-0:)
gustavohenke

Відповіді:


238

Ви можете використовувати функцію скорочення термоусадок npm , щоб перекрити будь-яку залежність або субзалежність.

Я щойно це робив у нашому бурхливому проекті. Нам потрібна була нова версія підключення, оскільки 2.7.3. заподіювала нам неприємності. Тому я створив файл на ім'я 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 повинен автоматично підбирати його під час встановлення для проекту.

(Див.: Https://nodejs.org/en/blog/npm/managing-node-js-dependitions-with-shrinkwrap/ )


7
Коли я це роблю, встановлюється лише grunt-contrib-connectзалежність та її дітей. Всі інші мої залежності в package.json не встановлені.
iDVB

5
У мене був той самий випуск, що і @iDVB. Я закінчив редагувати node_modulesкаталог, щоб повний дамп залежності від скорочення був саме тим, що я хотів, а не тільки переосмислював. Але все одно своєрідне хворобливе рішення.
Кобольд,

2
@Domi цей файл створений за допомогою npm shrinkwrap, записи не додаються від руки
glasspill

13
На жаль, як згадується в цій помилці, з npm4 мінімалістичний підхід вже не працює. (При видаленні node_modulesзапуск інсталяції з мінімальним термоусадочним пакетом, здається, залишається devDependenciesнедоторканим, хоча ігнорується dependencies, але запуск іншої інсталяції видаляє неявні елементи, тому наразі важливо запустити, npm shrinkwrapщоб отримати повний файл, змінити відповідну частину та потім npm installзнову біжи )
Бретт Замір

6
npm 6.4 просто замінить файл
скорочення

85

Для тих, хто починає з 2018 року і пізніше, використовуючи npm версії 5 або пізнішої версії: відредагуйте package-lock.json: видаліть бібліотеку з "requires"розділу та додайте її в розділі "залежності".

Наприклад, ви хочете, щоб deglobпакунок використовував globверсію пакету 3.2.11замість поточної. Ви відкриваєте package-lock.jsonі бачите:

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

Видаліть "glob": "7.1.2",із "requires", додайте "dependencies"з належною версією:

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

Тепер видаліть node_modulesпапку, запустіть, npm installі вона додасть відсутні частини до "dependencies"розділу.


4
Це приємно, якщо npm installпрацює один раз. У моєму випадку зміни потрібні, оскільки вкладений dep викликає збій.
ppasler

60
це буде видалений в будь-який час запуску npm iзамість редагування пакетів-lock.json і додавання дитячої залежності до «залежності» там, додайте дитячу залежність до вашого package.json «залежностей» розділ
trickpatty

6
Я створив бібліотеку, яка робить саме це для вас автоматично: github.com/rogeriochaves/npm-force-resolutions
Rogerio Chaves

14
Це працює, але тоді, якщо я запускаю npm installзнову, то всі зміни, щоб package-lock.jsonповернутись, і я повертаю погану версію dep назад.
2rs2ts

14
Я біжу, npm ciі це не package-lock.json
зачіпає


0

У мене виникла проблема, коли одна з вкладених залежностей мала вразливість аудиту npm, але я все ж хотів підтримувати версію батьківської залежності. Рішення npm shrinkwrap не працювало для мене, тому що я зробив, щоб замінити вкладену версію залежності:

  1. Видаліть вкладену залежність у розділі «вимагає» в пакет-lock.json
  2. Додайте оновлену залежність під DevDependitions в package.json, щоб модулі, які потребують її, змогли отримати доступ до неї.
  3. npm i

-1

Усадочна упаковка NPM - це приємне рішення цієї проблеми. Це дозволяє нам перекрити цю версію певної залежності певного підмодуля.

По суті, коли ви запускаєте npm install, npm спочатку зазирне у ваш кореневий каталог, щоб побачити, чи існує файл npm-shrinkwrap.json. Якщо це так, він спочатку скористається цим для визначення залежностей від пакета, а потім повернеться до звичайного процесу роботи через файли package.json.

Щоб створити npm-shrinkwrap.json, все, що вам потрібно зробити - це

 npm shrinkwrap --dev

код:

{
  "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
Чи відрізняється це від прийнятої відповіді? У цій відповіді є два обґрунтовані коментарі, які свідчать про те, що новіші версії npm або потребують додаткових кроків вручну, або роблять небажані речі з цим рішенням. Хіба це не так?
Фабіо Белтраміні

-1

Я знайшов рішення, яке працювало на мене.

Так. Спочатку відредагуйте файл npm-shrinkwrap.json як рекомендовано всі інші рішення.

Потім (у Windows):

  • Клацніть правою кнопкою миші на файл 'npm-shrinkwrap.json'
  • Властивості
  • У розділі Атрибути виберіть "Тільки для читання". Це дозволить запобігти npm для зміни файлу mpn-shrinkwrap.json.

Інші запропоновані рішення досить хороші, якщо ви робите операцію 'npm install' лише один раз. Але після першого встановлення 'npm' файл 'npm-shrinkwrap.json' знову змінюється, як і до вашої модифікації.


-1: це вимагатиме від вас знову розблокувати файл кожного разу, коли ви хочете внести зміни. У цих випадках ви все одно втратите вручну правки до файлу скорочення. Крім того, кожен, хто співпрацює з вашим кодом, повинен увімкнути і цей хак.
thomaux
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.