Связывание пакета npm с равными devDependencies и peerDependencies нарушает работу приложения при разработке с использованием веб-пакета - PullRequest
0 голосов
/ 14 декабря 2018

У меня следующая ситуация:

Фронтенд package.json

{
  "dependencies": {
     "lib" : "1.0.0",
     "foo" : "1.0.0"
  }
}

lib package.json

{
  "devDependencies": {
     "foo" : "1.0.0"
  },
   peerDependencies": {
     "foo" : "1.0.0"
  }
}

Пока я работаю с webpack-dev-server some Frontend Я связываю модуль foo с npm link, ведущим в это дерево зависимостей Frontend :

├── foo@1.0.0  
└─┬ lib@1.0.0                
  └── foo@1.0.0

Вместо того, чтобы иметь что-то вроде этого:

├── foo@1.0.0  
└── lib@1.0.0                

Я уже обнаружил, что webpack находит модуль foo в моем lib в егоПапка node_modules, поскольку я определил этот пакет как devDependencies для своих модульных тестов.Теперь у меня есть пакет в моем исходном коде дважды, что приводит к некоторым ошибкам.

Вопрос : Как я могу заставить webpack или npm использоватьмодуль foo моего родителя ( Frontend ) в моем lib, как подсказывает peerDependencies?

1 Ответ

0 голосов
/ 02 марта 2019

Я предполагаю, что у вас есть внешний интерфейс и lib, проверенные локально в двух разных папках и связанные lib с внешним интерфейсом, используя что-то вроде cd frontend && npm link libТаким образом, ваша цель состоит в том, чтобы работать (изменить код в двух редакторах) одновременно на обоих пакетах, но также хотеть иметь возможность запускать компилятор и модульные тесты в frontend и lib по отдельности.

Ответ таков:Вы не можете (это легко).Это связано с тем, что зависимости разрешаются всегда в первую очередь в папке пакета.Это означает, что если у вас установлен foo в lib, он всегда будет выбирать lib: foo, а не root: foo.

Самое простое решение для этого - вообще не устанавливать lib: foo или просто удалять его.Он использует затем root: foo, как вы хотите.Однако, если вы используете npm link, он сначала устанавливает все зависимости lib.

Таким образом, для одноразовой сборки во внешнем интерфейсе вы можете просто удалить этот пакет lib: foo и затем выполнить сборку.Тем не менее, с точки зрения пакета lib, ничего не будет работать, поскольку его зависимости были испорчены.

Более надежное решение - установить lib в корневой каталог, который устанавливает только фактические зависимости foo, которые нев peer / devDependencies

Чтобы сделать это, вы можете использовать npm-local-development в https://github.com/marcj/npm-local-development

В основном это делает то же самое, что и npm link, но обходит ограничение devDependency путемнастройка наблюдателя файлов и синхронизация изменений файла в фоновом режиме, за исключением всех devDependencies / peerDependencies.

  1. Вы устанавливаете npm-local-development: npm i -g npm-local-development
  2. Вы создаете файл с именем .links.json в своем корневом пакете.
  3. Вы записываете в него каждое имя пакета с его относительным локальным путем к папке, например

    {"@ shared / core":" ../../my-library-repo/packages/core "}

  4. Откройте консоль и запустите npm-local-development в этом корневом пакете.Пусть он работает в фоновом режиме.

Отказ от ответственности: я являюсь автором этого бесплатного проекта с открытым исходным кодом.

...