Как переопределить вложенные версии зависимостей NPM?


291

Я хотел бы использовать 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

Ответы:


237

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

Я только что сделал это в нашем грандиозном проекте. Нам нужна была более новая версия connect, начиная с 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-dependencies-with-shrinkwrap/ )


7
Когда я делаю это, устанавливаются только grunt-contrib-connectзависимость и ее дочерние элементы. Все мои другие зависимости в package.json не установлены.
iDVB

5
У меня была та же проблема, что и у @iDVB. В итоге я отредактировал node_modulesкаталог так, что полный дамп зависимостей shrinkwrap был именно тем, что я хотел, а не просто переопределял. Но все же своего рода болезненное решение.
Кобольд

2
@Domi этот файл создается путем запуска npm shrinkwrap, записи не добавляются вручную
glasspill

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

6
npm 6.4 просто перезапишет файл
shrinkwrap

86

Для пользователей с 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работает один раз. В моем случае правка необходима, поскольку вложенный файл вызывает сбой.
ppasler

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

6
Я создал библиотеку, которая делает именно это для вас автоматически: github.com/rogeriochaves/npm-force-resolutions
Рожерио Чавес

14
Это работает, но потом, если я запустлю npm installснова, все изменения package-lock.jsonбудут отменены, и я получу неверную версию депо.
2rs2ts

14
Я бегу, npm ciи это не касаетсяpackage-lock.json
sschoof


0

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

  1. Удалите вложенную зависимость в разделе 'require' в package-lock.json
  2. Добавьте обновленную зависимость в DevDependencies в package.json, чтобы модули, которым она требуется, по-прежнему имели доступ к ней.
  3. нпм я

-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 install' файл 'npm-shrinkwrap.json' снова изменяется, как и до вашей модификации.


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