Настройка менеджера пакетов: Автоопределение и настройка
Что вы сможете после изучения
- ✅ Автоматически определять используемый в проекте менеджер пакетов (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.
Проверьте, установлены ли в системе менеджеры пакетов:
# Проверка установленных менеджеров
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: Проверка текущих настроек
Почему Сначала нужно понять текущую ситуацию с определением и решить, требуется ли ручная настройка.
# Определение текущего менеджера пакетов
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: Настройка глобального менеджера пакетов по умолчанию
Почему Установка глобальных настроек по умолчанию уменьшит необходимость повторной настройки для каждого проекта.
# Установка глобального значения по умолчанию — pnpm
node scripts/setup-package-manager.js --global pnpmОжидаемый вывод:
✓ Global preference set to: pnpm
Saved to: ~/.claude/package-manager.jsonПроверьте созданный файл конфигурации:
cat ~/.claude/package-manager.jsonОжидаемый вывод:
{
"packageManager": "pnpm",
"setAt": "2026-01-25T12:00:00.000Z"
}Шаг 3: Настройка менеджера пакетов на уровне проекта
Почему Некоторые проекты могут требовать использования конкретного менеджера пакетов (например, из-за зависимости от специфических функций). Конфигурация на уровне проекта переопределяет глобальные настройки.
# Установка для текущего проекта — bun
node scripts/setup-package-manager.js --project bunОжидаемый вывод:
✓ Project preference set to: bun
Saved to: .claude/package-manager.jsonПроверьте созданный файл конфигурации:
cat .claude/package-manager.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-pmClaude 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-файлу
# Удаляем конфигурацию проекта
rm .claude/package-manager.json
# Запускаем определение
node scripts/setup-package-manager.js --detectОжидаемый результат: Source: lock-file (если lock-файл существует)
Сценарий 2: Поле package.json
# Добавляем в package.json
cat >> package.json << 'EOF'
"packageManager": "[email protected]"
EOF
# Запускаем определение
node scripts/setup-package-manager.js --detectОжидаемый результат: From package.json: [email protected]
Сценарий 3: Переопределение через переменную окружения
# Временно устанавливаем переменную окружения
export CLAUDE_PACKAGE_MANAGER=yarn
# Запускаем определение
node scripts/setup-package-manager.js --detectОжидаемый результат: Source: environment и Package Manager: yarn
# Очищаем переменную окружения
unset CLAUDE_PACKAGE_MANAGERКонтрольные точки ✅
Убедитесь, что выполнены все контрольные точки:
- [ ] Команда
--detectкорректно определяет текущий менеджер пакетов - [ ] Глобальный конфигурационный файл создан:
~/.claude/package-manager.json - [ ] Проектный конфигурационный файл создан (при необходимости):
.claude/package-manager.json - [ ] Ожидаемые отношения приоритетов переопределения работают корректно
- [ ] Отображаемые доступные менеджеры пакетов соответствуют фактически установленным
Частые ошибки
❌ Ошибка 1: Конфигурация не применяется
Проявление: Вы настроили pnpm, но определение показывает npm.
Причина:
- Lock-файл имеет более высокий приоритет, чем глобальная конфигурация (если lock-файл существует)
- Поле
packageManagerв package.json также имеет более высокий приоритет, чем глобальная конфигурация
Решение:
# Проверьте источник определения
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, но не установленРешение: Сначала установите менеджер пакетов или настройте другой, уже установленный.
# Проверьте доступные менеджеры пакетов
node scripts/setup-package-manager.js --list
# Переключитесь на установленный
node scripts/setup-package-manager.js --global npm❌ Ошибка 3: Проблемы с путями в Windows
Проявление: Скрипт не находит файлы при запуске в Windows.
Причина: Проблема с разделителями путей в Node.js скриптах (в исходном коде обработано, но нужно убедиться в использовании правильной команды).
Решение: Используйте PowerShell или Git Bash, убедитесь, что путь указан правильно:
# PowerShell
node scripts\setup-package-manager.js --detect❌ Ошибка 4: Конфигурация проекта влияет на другие проекты
Проявление: Проект A настроен на bun, после переключения в проект B всё ещё используется bun.
Причина: Конфигурация проекта действует только в директории текущего проекта, при смене директории определение выполняется заново.
Решение: Это нормальное поведение. Конфигурация проекта влияет только на текущий проект и не затрагивает другие проекты.
Резюме урока
Механизм определения менеджера пакетов в Everything Claude Code очень интеллектуален:
- 6 уровней приоритетов: переменная окружения > конфигурация проекта > package.json > lock-файл > глобальная конфигурация > fallback
- Гибкая настройка: поддержка глобальных настроек по умолчанию и переопределения на уровне проекта
- Автоопределение: в большинстве случаев ручная настройка не требуется
- Унификация команд: после настройки все хуки и агенты используют правильные команды
Рекомендуемая стратегия настройки:
- Глобально установите менеджер пакетов, который используете чаще всего (например,
pnpm) - Переопределяйте на уровне проекта для особых случаев (например, для производительности
bun) - Пусть автоопределение обрабатывает остальные случаи
Следующий урок
В следующем уроке изучим Настройку MCP-серверов.
Вы узнаете:
- Как настроить 15+ предустановленных MCP-серверов
- Как MCP-серверы расширяют возможности Claude Code
- Как управлять состоянием MCP-серверов и использованием токенов
Приложение: Справочник по исходному коду
Нажмите для просмотра расположения исходного кода
Обновлено: 2026-01-25
| Функциональность | Путь к файлу | Номер строки |
|---|---|---|
| Основная логика определения менеджера пакетов | scripts/lib/package-manager.js | 157-236 |
| Определение по lock-файлу | scripts/lib/package-manager.js | 92-102 |
| Определение по package.json | scripts/lib/package-manager.js | 107-126 |
| Определение менеджера пакетов (конфигурация) | scripts/lib/package-manager.js | 13-54 |
| Определение приоритетов | scripts/lib/package-manager.js | 57 |
| Сохранение глобальной конфигурации | scripts/lib/package-manager.js | 241-252 |
| Сохранение конфигурации проекта | scripts/lib/package-manager.js | 257-272 |
| Входная точка CLI-скрипта | scripts/setup-package-manager.js | 158-206 |
| Реализация команды определения | scripts/setup-package-manager.js | 62-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 исходного кода):
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' };
}