Чтобы установить зависимости для одного пакета в проекте с npm workspaces на macOS, выполните npm install --workspace="packages/web" из корня проекта, заменив packages/web на путь к рабочей области или имя её пакета. Вы также можете перейти в каталог этой рабочей области и выполнить npm install. Эти команды выбирают рабочую область в проекте npm; они не создают отдельный каталог установки и не гарантируют, что изменятся файлы только этого пакета.

Убедитесь, что проект использует npm workspaces

Рабочая область (npm workspace) — это каталог пакета, указанный в корневом package.json в свойстве workspaces. Например, репозиторий может содержать корневой package.json и packages/web/package.json, при этом "packages/*" входит в список workspaces корневого файла. npm использует эту конфигурацию для распознавания и связывания локальных пакетов. Если папка не настроена как workspace, --workspace не сможет выбрать её в качестве таковой. См. документацию по workspaces в npm.

В Terminal перейдите в корень репозитория. В macOS заключайте пути, содержащие пробелы, в кавычки, чтобы командная оболочка воспринимала путь как единый аргумент:

cd "$HOME/Projects/sample monorepo"
npm install --workspace="packages/web"

Здесь packages/web — это пример пути относительно корня репозитория. Вместо него вы можете использовать имя пакета настроенной рабочей области, например npm install --workspace="@example/web". Документация npm указывает в качестве допустимых селекторов имена рабочих областей, пути к каталогам рабочих областей и пути к родительским рабочим областям. Рекомендуется указывать конкретный путь или имя пакета: выбор родительского каталога рабочей области может привести к выбору всех находящихся внутри него рабочих областей. Описание селектора можно найти в разделе параметры npm install в npm.

Установите объявленные зависимости выбранной рабочей области

Приведенная выше команда запускает установку в контексте выбранной рабочей области. Если после install имя пакета не указано, npm устанавливает зависимости, уже объявленные в манифестах проекта; она не добавляет новую зависимость в packages/web/package.json. По умолчанию в конфигурации npm workspaces корневой проект исключается при выборе отдельной рабочей области, если не включен параметр include-workspace-root. Обе опции описаны в справочнике по конфигурации npm.

Чтобы добавить пакет, укажите его имя перед селектором рабочей области:

npm install date-fns --workspace="packages/web"

Это указывает npm добавить date-fns в зависимости этой рабочей области и установить его. После этого проверьте файл package.json рабочей области, чтобы убедиться, что зависимость была записана в нужное место. Руководство по npm workspaces предлагает тот же шаблон для добавления зависимости в указанную рабочую область.

Использование каталога рабочей области

Если вы уже находитесь в папке пакета, вы можете выполнить npm install прямо там, не указывая --workspace:

cd "$HOME/Projects/sample monorepo/packages/web"
npm install

Согласно документации npm, выполнение команды из рабочей области неявно задает ее контекст и использует корень рабочей области в качестве префикса проекта. Это может быть удобно во вкладке терминала, выделенной под один пакет. Если вы не уверены, к какому пакету относится текущий каталог, используйте явную команду --workspace из известного корня репозитория.

Что означает и чего не означает выбор «одной рабочей области»

Выбор одной рабочей области ограничивает контекст выполнения команды, но не гарантирует физически обособленное дерево node_modules. Рабочие области npm управляются из проекта верхнего уровня, и npm может связывать локальные рабочие области внутри корневого каталога node_modules. Зависимости могут подниматься (hoisting) или использоваться совместно, если это допускает дерево зависимостей. Таким образом, установка может повлиять на общее состояние зависимостей репозитория и lock-файл. Проверьте полученные изменения в системе контроля версий, особенно если вы ожидали изменения файлов исключительно одного пакета. Поведение дерева зависимостей и связывание рабочих областей описаны в документации по установке npm.

Если ваша цель — полностью автономная установка, изолированная от монорепозитория, селектор рабочей области не предназначен для этого. Рабочая область является частью настроенного корневого проекта; выбор отдельной области не превращает её в независимый репозиторий или отдельное дерево установки.

Если npm не распознает цель

Сначала убедитесь, что путь указан правильно относительно корня репозитория и что его package.json существует. Затем проверьте корневой package.json и убедитесь, что шаблоны в свойстве workspaces включают эту папку. Если используется имя, убедитесь, что оно совпадает с полем name в пакете рабочей области. Запустите команду из корня репозитория или перейдите непосредственно в нужный каталог рабочей области. Не используйте --workspaces, если вам нужен только один пакет: параметр во множественном числе выбирает все настроенные рабочие области. Практическое правило простое: используйте --workspace="path" из корня при явном указании цели и проверяйте манифест и изменения в репозитории после завершения работы npm.

Источники