Я создал свой собственный пакет npm, назовем его XYZ, он имеет зависимость от @material-ui
в файле package.json
.
Когда я устанавливаю его в проекте A, у меня есть вложенные node_modules внутри папки XYZ (так что это A\node_modules\XYZ\node_modules\@material-ui
), но когда я устанавливаю его в проекте B, у меня нет вложенной папки node_modules. Оба проекта A и B имеют @material-ui
в своих файлах package.json
с одинаковыми версиями.
Как заставить мой пакет XYZ использовать @material-ui
из A\node_modules
?
Есть положительный момент в том, что меньше вложенных папок, а в обратную сторону - больше папок непосредственно в папке node_modules, а также проблемы с контролем версий.
Правильные yarn
и npm
(например, npm v3) не должны иметь такой проблемы со структурой. Он всегда должен сглаживать всю конструкцию, где это возможно, и иметь вложенные node_modules только в том случае, если версии несовместимы с предыдущей.
Так что, если он правильно работает в одном проекте, а не в другом, это, вероятно, связано с версией. Проверьте, является ли @material-ui
одной и той же версией на обоих устройствах. Возможно, в какой-то момент два разных пакета конфликтуют друг с другом.
Из вашего вопроса говорится, что это та же версия. Однако вы не упомянули, как вы установили свой пакет в обоих проектах. Если вы устанавливаете с yarn link
или npm link
, он должен правильно установить зависимости, как и ожидалось.
Если вы проверите пакет, то недавно material-ui
устарел, а в уведомлении говорится о необходимости обновления до @material-ui/core
. Возможно, некоторые пакеты внутри этой папки не совпадают. В любом случае, так происходит всякий раз, когда возникает конфликт зависимостей. Загляните в папку @material-ui
.
Есть несколько пакетов для принудительного решения этой проблемы. Они пройдут через вложенные папки node_modules и объединят их в одну папку.
flatten-packages
npm install -g flatten-packages
.flatten-packages
, чтобы переставить все пакеты в папке node_modules в каталоге проекта.Ответьте, что сработало, а что нет, чтобы мы могли понять, что произошло. :)
Похоже, у меня была такая же версия @ material-ui / core, но @ material-ui / значки были другими, поэтому у меня были вложенные node_modules. Спасибо!
Почему бы не использовать npm dedupe
(не опасно) для сглаживания дерева зависимостей?
Для этого вы можете использовать команду npm dedupe
.
Вы можете поместить команду в сценарий postinstall
в package.json
, и каждый раз, когда NPM устанавливает пакет, команда npm dedupe
будет сглаживать все дублированные пакеты одной и той же версии для вас.
Для получения дополнительной информации см. https://docs.npmjs.com/cli/dedupe.
Это отлично работает для вложенных зависимостей одного уровня. Для следующего сценария он не работает - node_modules/dependency1/node_moduels/dependency2/node_modules/dependency_not_being_removed
любые предложения по удалению на этом уровне
У меня была такая же проблема в приложении React Native с моим пакетом NPM. Проблема заключалась в том, что в проекте A использовалась версия React Native (0,59,5) ниже версии, используемой в моем пакете (0,59,8). При установке пакета в новый проект (B), конечно, использовалась последняя версия React Native на тот момент, которая была такой же, как и мой пакет (0.59.8).
У меня есть еще одно дополнение к принятому ответу:
rm -rf node_modules
Обращаться осторожно: Иногда перенос проектов на новые модули npm может вызвать странные проблемы с кешем внутри папки node_modules
, особенно те, которые существуют уже некоторое время или имеют более новые версии пакетов, установленных во вложенных зависимостях, который отличается от установленной версии в корневом каталоге.
После удаления прямых зависимостей через зависимости package.json пакеты будут удалены с <root>/node_modules
. Это может вызвать ошибку, при которой новые модули по-прежнему вложены в вашу зависимость, а не перемещаются в корневой каталог, как ожидалось.
Таким образом, с помощью уничтожение ваших локальных node_modules вы можете выполнить чистую переустановку и позволить выравниванию работать.
Спасибо за объяснение. Я дважды проверю в понедельник и приму, решило ли это мою проблему