Workspaces в npm/yarn

Рабочие пространства в npm и yarn

Рабочие пространства (workspaces) в npm и yarn — это мощная функция для организации многомодульных проектов. Она позволяет управлять зависимостями и скриптами для нескольких пакетов в одном репозитории, что значительно упрощает разработку, тестирование и деплой. Это особенно полезно при создании монорепозиториев, где проект состоит из множества взаимосвязанных пакетов, но при этом важно поддерживать централизованное управление зависимостями.

В контексте npm и yarn рабочее пространство — это каталог в проекте, который управляет зависимостями для нескольких пакетов, используя единый файл конфигурации. Структура проекта с рабочими пространствами обычно выглядит так:

/project-root
  /packages
    /package-1
      package.json
    /package-2
      package.json
  package.json

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

Основные особенности и преимущества

  1. Управление зависимостями: Рабочие пространства позволяют централизованно управлять зависимостями для всех пакетов в проекте. Это избавляет от необходимости устанавливать одну и ту же зависимость для каждого пакета отдельно.

  2. Согласованность версий: В случае использования одинаковых зависимостей в разных пакетах рабочие пространства обеспечивают согласованность версий этих зависимостей. Когда одна версия библиотеки обновляется, она будет автоматически синхронизирована по всем рабочим пространствам.

  3. Скрипты: Рабочие пространства позволяют запускать скрипты для всех пакетов в проекте или для отдельных пакетов. Это позволяет значительно упростить тестирование, сборку и деплой всех пакетов из одного места.

  4. Упрощение разработки: При использовании рабочих пространств разработка становится более структурированной. Пакеты, которые зависят друг от друга, могут быть легко связаны и обновлены. Например, изменения в одном пакете могут быть сразу протестированы в другом, без необходимости выполнять дополнительные шаги для обновления версий.

Настройка рабочих пространств в npm

Сначала необходимо создать проект с несколькими пакетами. Для этого создается основная директория с проектом и внутри нее несколько подкаталогов для пакетов.

Пример структуры:

/my-project
  /packages
    /package-a
      package.json
    /package-b
      package.json
  package.json

Файл package.json в корне проекта должен содержать поле workspaces, которое указывает пути к рабочим пространствам:

{
  "name": "my-project",
  "private": true,
  "workspaces": [
    "packages/*"
  ]
}

Параметр private: true важен, так как рабочие пространства не поддерживаются для публичных пакетов, чтобы избежать случайного публикации в реестр npm.

После настройки рабочие пространства можно использовать для установки зависимостей:

npm install

Этот процесс установит зависимости для всех пакетов, указанных в рабочем пространстве. В отличие от обычной установки зависимостей, npm создает один node_modules в корневой директории, и все зависимости для пакетов в рабочих пространствах будут установлены туда.

Настройка рабочих пространств в Yarn

Yarn также поддерживает рабочие пространства и имеет схожий процесс настройки. Важно отметить, что для работы с рабочими пространствами в Yarn необходимо использовать версии Yarn 1.0 или выше.

Пример структуры проекта:

/my-project
  /packages
    /package-a
      package.json
    /package-b
      package.json
  package.json

В корневом package.json добавляется поле workspaces:

{
  "name": "my-project",
  "private": true,
  "workspaces": [
    "packages/*"
  ]
}

После этого можно установить зависимости, используя команду:

yarn install

Yarn также создаст один node_modules в корневой директории и установит все зависимости для всех рабочих пространств.

Управление зависимостями между рабочими пространствами

Когда несколько пакетов в проекте зависят друг от друга, рабочие пространства упрощают процесс. Например, если package-a зависит от package-b, достаточно указать зависимость в файле package.json в package-a:

{
  "name": "package-a",
  "dependencies": {
    "package-b": "*"
  }
}

При этом Yarn или npm автоматически создадут правильные ссылки между пакетами, не требуя вручную прописывать версии или устанавливать локальные зависимости.

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

Скрипты можно запускать для всех рабочих пространств или для конкретного пакета. Например, для выполнения скрипта во всех пакетах проекта можно использовать:

npm run build --workspace package-a

В Yarn это делается немного по-другому:

yarn workspace package-a run build

Кроме того, можно запускать скрипты для всех пакетов одновременно. Например, для запуска тестов в каждом пакете:

npm run test --workspaces

В Yarn аналогичная команда:

yarn workspaces run test

Публикация пакетов

Когда проект готов к публикации, каждый пакет в рабочих пространствах можно публиковать отдельно, если нужно, но при этом важно убедиться, что структура пакетов остаётся согласованной. В npm для публикации пакетов из рабочих пространств можно использовать команду:

npm publish --workspace package-a

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

Рекомендации по использованию рабочих пространств

  1. Организация структуры: Разделяйте проект на логические части, каждый из которых будет отдельным пакетом. Например, это могут быть утилиты, компоненты или API-сервисы.

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

  3. Автоматизация процесса: Использование рабочих пространств значительно упрощает процесс автоматизации сборки и тестирования проекта. Настройте CI/CD для работы с рабочими пространствами, чтобы обеспечить непрерывную интеграцию и доставку.

  4. Приватность пакетов: При использовании рабочих пространств для монорепозиториев с приватными пакетами, важно использовать настройки private: true в корневом файле package.json, чтобы избежать случайного опубликования пакетов в публичный реестр.

Заключение

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