Как NPM решает, где должны быть установлены зависимости проекта? - PullRequest
0 голосов
/ 08 апреля 2019

Мы используем форк Create-React-App в нашей компании и проект, похожий на «response-scripts» (и основанный на нем).

В нашем эквиваленте response-scripts у нас есть пакет.json с множеством зависимостей.Этих двух будет достаточно для этого примера:

"A": "2.0.0-rc.5",
"B": "^0.5.0",

В моем проекте, в котором в качестве зависимости есть эти «реакции-скрипты», я запускаю «npm install».Тем не менее, результат:

  • A установлен под node_modules

  • B установлен под node_modules / our-реакции-scripts / node_modules

Это разрушает наши сценарии реакции.Я могу добавить пару псевдонимов в мой webpack.config.js, чтобы «помочь» Webpack узнать, где найти эти пакеты, но возникает новая ошибка: зависимости B установлены в root / node_modules, хотя сам пакет не является.

Это означает, например, что, когда B хочет использовать свою зависимость "autosize", он попытается разрешить ее из своих './node_modules, но не получится, поскольку этот пакет был установлен в соответствии с проектом.root node_modules.

Я могу вспомнить сценарий postinstall, который перемещает наши пакеты в корневую папку node_modules, но это похоже на сокрытие грязи под ковром и неизбежное разрушение в будущем.

Добавление псевдонимов в webpack.config.js не помогает, так как зависимости этих зависимостей устанавливаются в корневой каталог node_modules проекта, а сама зависимость - нет, поэтому разрешение относительных зависимостей просто не работает.

Я хочу избежать этого в нашем webpack.config.js, а также в пост-установках в нашей паckage.json.

            alias: {
                '@ether/uiverse-widgets': path.resolve(
                    './node_modules/@ether/ether-scripts/node_modules/@ether/uiverse-widgets'
                ),
                '@ether/uiverse-core': path.resolve(
                    './node_modules/@ether/ether-scripts/node_modules/@ether/uiverse-core'
                ),
            },

tl; dr: моя зависимость A зависит от B и C. Он устанавливает B под ./node_modules, но C под ./node_modules/A/node_modules.

...