Skip to content

Настройка менеджера пакетов: Автоопределение и настройка

Что вы сможете после изучения

  • ✅ Автоматически определять используемый в проекте менеджер пакетов (npm/pnpm/yarn/bun)
  • ✅ Понимать 6-уровневый механизм приоритетов определения
  • ✅ Настраивать менеджер пакетов на глобальном и уровне проекта
  • ✅ Использовать команду /setup-pm для быстрой настройки
  • ✅ Работать с разными менеджерами в многопроектной среде

Ваша текущая проблема

У вас всё больше проектов: где-то используется npm, где-то pnpm, а где-то yarn или bun. Каждый раз, работая в Claude Code, приходится вспоминать:

  • В этом проекте использовать npm install или pnpm install?
  • Использовать npx, pnpm dlx или bunx?
  • Скрипты запускать как npm run dev, pnpm dev или bun run dev?

Одна ошибка — команда падает, теряется время.

Когда использовать эту настройку

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

Зачем настраивать менеджер пакетов?

Хуки и агенты Everything Claude Code автоматически генерируют команды для работы с менеджерами пакетов. Если определение неверно, все команды будут использовать неправильный инструмент и падать с ошибкой.

🎒 Подготовка к началу

Предварительные проверки

Перед началом убедитесь, что выполнили руководство по установке и плагин корректно установлен в Claude Code.

Проверьте, установлены ли в системе менеджеры пакетов:

bash
# Проверка установленных менеджеров
which npm pnpm yarn bun

# Или в Windows (PowerShell)
Get-Command npm, pnpm, yarn, bun -ErrorAction SilentlyContinue

Если вы видите подобный вывод, значит установлены:

/usr/local/bin/npm
/usr/local/bin/pnpm

Если какой-то менеджер не найден, его нужно установить (в этом уроке установка не рассматривается).

Основная концепция

Everything Claude Code использует интеллектуальный механизм определения, который автоматически выбирает менеджер пакетов по 6-уровневой приоритизации. Вам нужно настроить всего один раз в подходящем месте — и он будет работать корректно во всех сценариях.

Приоритеты определения (от высшего к низшему)

1. Переменная окружения CLAUDE_PACKAGE_MANAGER  ─── Высший приоритет, временное переопределение
2. Конфигурация проекта .claude/package-manager.json  ─── Уровень проекта
3. Поле packageManager в package.json  ─── Спецификация проекта
4. Lock-файл (pnpm-lock.yaml и др.)  ─── Автоопределение
5. Глобальная конфигурация ~/.claude/package-manager.json  ─── Глобальные настройки по умолчанию
6. Fallback: поиск первого доступного  ─── Запасной вариант

Зачем такой порядок?

  • Переменная окружения — высший приоритет: удобно для временного переключения (например, в CI/CD)
  • Конфигурация проекта — второй приоритет: единообразие в рамках проекта
  • Поле packageManager в package.json: это стандарт Node.js
  • Lock-файл: фактически используемый файл
  • Глобальная конфигурация: личные предпочтения по умолчанию
  • Fallback: гарантия, что всегда будет доступен инструмент

Практическое руководство

Шаг 1: Проверка текущих настроек

Почему Сначала нужно понять текущую ситуацию с определением и решить, требуется ли ручная настройка.

bash
# Определение текущего менеджера пакетов
node scripts/setup-package-manager.js --detect

Ожидаемый вывод:

=== Package Manager Detection ===

Current selection:
  Package Manager: pnpm
  Source: lock-file

Detection results:
  From package.json: not specified
  From lock file: pnpm
  Environment var: not set

Available package managers:
  ✓ npm
  ✓ pnpm (current)
  ✗ yarn
  ✓ bun

Commands:
  Install: pnpm install
  Run script: pnpm [script-name]
  Execute binary: pnpm dlx [binary-name]

Если отображаемый менеджер пакетов совпадает с ожидаемым, определение работает корректно и ручная настройка не требуется.

Шаг 2: Настройка глобального менеджера пакетов по умолчанию

Почему Установка глобальных настроек по умолчанию уменьшит необходимость повторной настройки для каждого проекта.

bash
# Установка глобального значения по умолчанию — pnpm
node scripts/setup-package-manager.js --global pnpm

Ожидаемый вывод:

✓ Global preference set to: pnpm
  Saved to: ~/.claude/package-manager.json

Проверьте созданный файл конфигурации:

bash
cat ~/.claude/package-manager.json

Ожидаемый вывод:

json
{
  "packageManager": "pnpm",
  "setAt": "2026-01-25T12:00:00.000Z"
}

Шаг 3: Настройка менеджера пакетов на уровне проекта

Почему Некоторые проекты могут требовать использования конкретного менеджера пакетов (например, из-за зависимости от специфических функций). Конфигурация на уровне проекта переопределяет глобальные настройки.

bash
# Установка для текущего проекта — bun
node scripts/setup-package-manager.js --project bun

Ожидаемый вывод:

✓ Project preference set to: bun
  Saved to: .claude/package-manager.json

Проверьте созданный файл конфигурации:

bash
cat .claude/package-manager.json

Ожидаемый вывод:

json
{
  "packageManager": "bun",
  "setAt": "2026-01-25T12:00:00.000Z"
}

Глобальная vs Проектная конфигурация

  • Глобальная конфигурация: ~/.claude/package-manager.json, влияет на все проекты
  • Проектная конфигурация: .claude/package-manager.json, влияет только на текущий проект, имеет более высокий приоритет

Шаг 4: Использование команды /setup-pm (опционально)

Почему Если вы не хотите запускать скрипт вручную, можно использовать slash-команду прямо в Claude Code.

В Claude Code введите:

/setup-pm

Claude Code вызовет скрипт и отобразит интерактивные опции.

Ожидается примерно такой вывод:

[PackageManager] Available package managers:
  - npm
  - pnpm (current)
  - bun

To set your preferred package manager:
  - Global: Set CLAUDE_PACKAGE_MANAGER environment variable
  - Or add to ~/.claude/package-manager.json: {"packageManager": "pnpm"}
  - Or add to package.json: {"packageManager": "pnpm@8"}

Шаг 5: Проверка логики определения

Почему Понимая приоритеты определения, вы сможете предсказывать результаты в разных ситуациях.

Протестируем несколько сценариев:

Сценарий 1: Определение по lock-файлу

bash
# Удаляем конфигурацию проекта
rm .claude/package-manager.json

# Запускаем определение
node scripts/setup-package-manager.js --detect

Ожидаемый результат: Source: lock-file (если lock-файл существует)

Сценарий 2: Поле package.json

bash
# Добавляем в package.json
cat >> package.json << 'EOF'
  "packageManager": "[email protected]"
EOF

# Запускаем определение
node scripts/setup-package-manager.js --detect

Ожидаемый результат: From package.json: [email protected]

Сценарий 3: Переопределение через переменную окружения

bash
# Временно устанавливаем переменную окружения
export CLAUDE_PACKAGE_MANAGER=yarn

# Запускаем определение
node scripts/setup-package-manager.js --detect

Ожидаемый результат: Source: environment и Package Manager: yarn

bash
# Очищаем переменную окружения
unset CLAUDE_PACKAGE_MANAGER

Контрольные точки ✅

Убедитесь, что выполнены все контрольные точки:

  • [ ] Команда --detect корректно определяет текущий менеджер пакетов
  • [ ] Глобальный конфигурационный файл создан: ~/.claude/package-manager.json
  • [ ] Проектный конфигурационный файл создан (при необходимости): .claude/package-manager.json
  • [ ] Ожидаемые отношения приоритетов переопределения работают корректно
  • [ ] Отображаемые доступные менеджеры пакетов соответствуют фактически установленным

Частые ошибки

❌ Ошибка 1: Конфигурация не применяется

Проявление: Вы настроили pnpm, но определение показывает npm.

Причина:

  • Lock-файл имеет более высокий приоритет, чем глобальная конфигурация (если lock-файл существует)
  • Поле packageManager в package.json также имеет более высокий приоритет, чем глобальная конфигурация

Решение:

bash
# Проверьте источник определения
node scripts/setup-package-manager.js --detect

# Если это lock-файл или package.json, проверьте эти файлы
ls -la | grep -E "(package-lock|yarn.lock|pnpm-lock|bun.lockb)"
cat package.json | grep packageManager

❌ Ошибка 2: Настроен несуществующий менеджер пакетов

Проявление: Вы настроили bun, но он не установлен в системе.

Результат определения:

Available package managers:
  ✓ npm
  ✗ bun (current)  ← Обратите внимание: помечен как current, но не установлен

Решение: Сначала установите менеджер пакетов или настройте другой, уже установленный.

bash
# Проверьте доступные менеджеры пакетов
node scripts/setup-package-manager.js --list

# Переключитесь на установленный
node scripts/setup-package-manager.js --global npm

❌ Ошибка 3: Проблемы с путями в Windows

Проявление: Скрипт не находит файлы при запуске в Windows.

Причина: Проблема с разделителями путей в Node.js скриптах (в исходном коде обработано, но нужно убедиться в использовании правильной команды).

Решение: Используйте PowerShell или Git Bash, убедитесь, что путь указан правильно:

powershell
# PowerShell
node scripts\setup-package-manager.js --detect

❌ Ошибка 4: Конфигурация проекта влияет на другие проекты

Проявление: Проект A настроен на bun, после переключения в проект B всё ещё используется bun.

Причина: Конфигурация проекта действует только в директории текущего проекта, при смене директории определение выполняется заново.

Решение: Это нормальное поведение. Конфигурация проекта влияет только на текущий проект и не затрагивает другие проекты.

Резюме урока

Механизм определения менеджера пакетов в Everything Claude Code очень интеллектуален:

  • 6 уровней приоритетов: переменная окружения > конфигурация проекта > package.json > lock-файл > глобальная конфигурация > fallback
  • Гибкая настройка: поддержка глобальных настроек по умолчанию и переопределения на уровне проекта
  • Автоопределение: в большинстве случаев ручная настройка не требуется
  • Унификация команд: после настройки все хуки и агенты используют правильные команды

Рекомендуемая стратегия настройки:

  1. Глобально установите менеджер пакетов, который используете чаще всего (например, pnpm)
  2. Переопределяйте на уровне проекта для особых случаев (например, для производительности bun)
  3. Пусть автоопределение обрабатывает остальные случаи

Следующий урок

В следующем уроке изучим Настройку MCP-серверов.

Вы узнаете:

  • Как настроить 15+ предустановленных MCP-серверов
  • Как MCP-серверы расширяют возможности Claude Code
  • Как управлять состоянием MCP-серверов и использованием токенов

Приложение: Справочник по исходному коду

Нажмите для просмотра расположения исходного кода

Обновлено: 2026-01-25

ФункциональностьПуть к файлуНомер строки
Основная логика определения менеджера пакетовscripts/lib/package-manager.js157-236
Определение по lock-файлуscripts/lib/package-manager.js92-102
Определение по package.jsonscripts/lib/package-manager.js107-126
Определение менеджера пакетов (конфигурация)scripts/lib/package-manager.js13-54
Определение приоритетовscripts/lib/package-manager.js57
Сохранение глобальной конфигурацииscripts/lib/package-manager.js241-252
Сохранение конфигурации проектаscripts/lib/package-manager.js257-272
Входная точка CLI-скриптаscripts/setup-package-manager.js158-206
Реализация команды определенияscripts/setup-package-manager.js62-95

Ключевые константы:

  • PACKAGE_MANAGERS: поддерживаемые менеджеры пакетов и их конфигурация команд (строки 13-54)
  • DETECTION_PRIORITY: порядок приоритетов определения ['pnpm', 'bun', 'yarn', 'npm'] (строка 57)

Ключевые функции:

  • getPackageManager(): основная логика определения, возвращает менеджер пакетов по приоритету (строки 157-236)
  • detectFromLockFile(): определение по lock-файлу (строки 92-102)
  • detectFromPackageJson(): определение по package.json (строки 107-126)
  • setPreferredPackageManager(): сохранение глобальной конфигурации (строки 241-252)
  • setProjectPackageManager(): сохранение конфигурации проекта (строки 257-272)

Реализация приоритетов определения (строки 157-236 исходного кода):

javascript
function getPackageManager(options = {}) {
  // 1. Переменная окружения (высший приоритет)
  if (envPm && PACKAGE_MANAGERS[envPm]) { return { name: envPm, source: 'environment' }; }

  // 2. Конфигурация проекта
  if (projectConfig) { return { name: config.packageManager, source: 'project-config' }; }

  // 3. Поле package.json
  if (fromPackageJson) { return { name: fromPackageJson, source: 'package.json' }; }

  // 4. Lock-файл
  if (fromLockFile) { return { name: fromLockFile, source: 'lock-file' }; }

  // 5. Глобальная конфигурация
  if (globalConfig) { return { name: globalConfig.packageManager, source: 'global-config' }; }

  // 6. Fallback: поиск первого доступного по приоритету
  for (const pmName of fallbackOrder) {
    if (available.includes(pmName)) { return { name: pmName, source: 'fallback' }; }
  }

  // По умолчанию npm
  return { name: 'npm', source: 'default' };
}