Как избежать добавления пакета в node_modules, если он размещен локально

#npm #yarnpkg

#npm #yarnpkg

Вопрос:

У меня есть репозиторий с приложением и модулями. Модули включаются в приложение package.json подобным:

"application-module": "file:../modules/application-module"

После yarn install добавления этой зависимости в node_modules .

Я хочу создать приложение на основе модуля. app папка воспроизводит корневой модуль. Другие модули, такие как admin-panel-module , account-module должны быть в modules папке. Итак, приложение может иметь не только node_modules внутреннюю, но и modules папку для модулей. Эти модули будут добавлены git subtree из другого репозитория. Итак, таким образом, я могу разрабатывать независимо

Есть ли какой-либо способ избежать добавления и использования локальных каталогов?

Комментарии:

1. Какое конкретное поведение вы имеете в виду под «локальными каталогами»?

2. @Sergeon repository-folder(-app, -modules) Я хочу использовать modules inside app , инициализировать новое приложение React и быть счастливым

3. Итак, в основном вы хотите вместо этого node_modules переименоваться в modules ? Почему (если это так)?

4. @Sergeon позвольте мне объяснить. Я хочу создать приложение на основе модуля. app папка воспроизводит корневой модуль. Другие модули, такие как admin-panel-module , account-module должны быть в modules папке. Итак, app может иметь node_modules внутри, но также и modules папку для модулей. Эти модули будут добавлены git subtree из другого репозитория. Итак, таким образом, я могу разрабатывать независимо

5. Кажется, теперь я это понимаю. Итак, у вас есть app/ а затем некоторые модули, специфичные для вашего приложения, такие как account-module или admin-module . Вы хотите иметь node_modules in app/ , который обрабатывает все общие зависимости, но затем, если admin-module у него есть зависимость, специфичная для него самого, вы не хотите размещать эту зависимость в node_modules локальном для этого модуля. Это верно?

Ответ №1:

Несколько node_modules и package.json

В любом проекте node / npm у вас может быть несколько package.json в вашем дереве каталогов, например:

 app/
  package.json
  node_modules
  src...
  account_module/
    package.json
    node_modules
    src...
  admin_module/
    package.json
    node_modules
    src..
  

При вызове yarn (или npm install ofc) любого из дочерних модулей зависимости, перечисленные в их local package.json , будут установлены в локальной папке node_modules.

Таким образом, в принципе, вы можете решить свою проблему, гарантируя, что у каждого дочернего элемента есть свой собственный package.json со своими зависимостями.

Тем не менее, вы можете разместить общие зависимости в корневой app папке. Например, если все ваши проекты используют lodash , вы можете поместить lodash зависимость в add package_json . После выполнения yarn в app папке lodash пакет будет установлен в node_modules приложении.

После этого, если вы:

require('lodash');

В любом из дочерних элементов они будут искать lodash в node_modules папке приложения, если они не найдут lodash в своей собственной node_modules .

Если у вас нет root node_modules , вы все равно можете объявить package.json local для любого из подмодулей, и у них будут свои собственные node_modules .

Итак, возможно, вы захотите вообще избежать общих зависимостей, или, может быть, вы хотите сохранить общие зависимости в app папке. В Npm вы рассмотрели оба способа.

Однако, если вы не хотите обрабатывать общие зависимости, но обеспокоены необходимостью хранить много дублированных пакетов на локальных компьютерах, вы можете использовать pnpm, который является оболочкой поверх npm, позволяющей сэкономить много места на локальных компьютерах разработки.

Комментарии:

1. Большое спасибо за столь подробный ответ. Очень полезно

Ответ №2:

У меня (почти) такая же проблема с yarn.

Я создал пакет (typescript) под названием «test». В этом пакете после сборки в основном 3 каталога: dist (после сборки), node_modules и src.

Затем я создал другой пакет «test2» и в этот пакет добавил «test» в качестве зависимости «yarn add c:/…/…/test «. Пакет правильно установлен в node_module test2. НО в «test2/node_modules /test» я могу найти node_modules из test ( «test2/node_modules/test/node_modules». Почему? Это значительно увеличивает размер пакета.

В обоих tsconfig.json (test и test2) node_modules исключен…

спасибо