Как заставить npm 3 устанавливать вложенные зависимости?
Я просто обновился до npm version 3 и заметил, что одно из самых больших изменений, которое оно произвело, заключается в том, что оно обеспечивает плоское дерево зависимостей.
Теперь ваши зависимости будут установлены максимально плоскими. Насколько возможно, все ваши зависимости, их зависимости и их зависимости будут установлены в вашей папке проекта node_modules
без вложенности. Вы увидите только модули, вложенные под друг друга, когда два (или более) модуля имеют конфликтующие зависимости.
Так, например, если пакет A зависит от пакета B, то при npm install A
вы получите эту структуру:
--- root/
|--- node_modules/
|--- A/
|--- B/
вместо старой файловой структуры из версии 2 или ниже:
--- root/
|--- node_modules/
|--- A/
|--- node_modules/
|--- B/
Первая (и Im sure not the last) проблема, с которой я столкнулся, заключалась в следующем:
Пакет A не знает о поведении npm v3s и зависит от пакета B. Но A предполагает старую (v2) файловую структуру, потому что она имеет node_modules/B
в своем коде вместо правильного ../node_modules/B
. Теперь код из A не будет компилироваться, потому что он ищет B/
в неправильном каталоге.
Если мне не хочется навязывать разработчику исправление кода и ожидание обновления A, мне интересно, могу ли я установить параметр, который заставит npm устанавливать A в своей собственной папке node_modules
, так же, как это сделал npm v2.
Ответы
Ответ 1
Вы пробовали --legacy-bundling
для npm install
?
https://docs.npmjs.com/cli/install
Аргумент -legacy-bundling приведет к тому, что npm установит пакет таким образом, чтобы версии npm до 1.4, например, входящие в node 0.8, могли установить пакет. Это устраняет все автоматическое удаление.
Ответ 2
Это то, что происходит, когда я не спал. Очевидное решение как-то ускользнуло от меня.
$ cd node_modules/A/
$ npm install
$ cd ../../
Ответ 3
Я только что столкнулся с этой проблемой и нашел альтернативу для исправления этой проблемы. Поскольку Node.js поставляется с NPM, единственный способ, о котором я мог думать, - перейти на версию Node.js 0.10, которая поставляется с более старой версией на NPM, которая будет устанавливать зависимости по-старому. Для понижения я использовал NVM и запустил nvm use 0.10.0
. Вы можете переключаться между версиями npm, следуя этому трюку. Надеюсь, это поможет!