Global Module Shims
В режиме shim глобальный CLI, который вы ставите через npm (или yarn, pnpm, …) — например tsc, eslint или prettier — не запускается прямо из каталога активной версии Node.js.
NVM for Windows ставит в ваш PATH hardlink (или копию) proxy.exe как {DataRoot}/.shim/{name}.exe.
Вы по-прежнему вводите ту же команду. Proxy выбирает нужную версию Node.js (те же правила, что у node shim), проверяет доверие к установке и инструменту, затем стартует реальный launcher под этой версией.
Менеджеры пакетов (npm, npx, yarn, yarnpkg, pnpm, vlt, corepack и bun, если обёртка bun включена) используют тот же бинарник proxy.exe — см. Package Manager Shims.
node shim — отдельный бинарник.
npm install -g typescript
tsc --version
tsc --nvm-which --version
tsc --nvm-use=22 --version
yarn global add @vue/cli
vue --version
Как шимится глобальная команда
В общих чертах:
- Вы устанавливаете глобальный пакет — например
npm install -g typescript. - Reshim сканирует launchers — после установки (или позже proxy-triggered reshim) NVM собирает basenames
*.cmdв каталоге активной версии Node. - Дополнительные места сканирования
- pnpm — также
PNPM_HOME\bin, если задан; shimpnpmвсегда держится на PATH. - Yarn Classic (
yarn global) — также%LOCALAPPDATA%\Yarn\bin. Yarn 2+ не используетyarn global.
- pnpm — также
- Для каждого имени создаётся shim —
{DataRoot}/.shim/{name}.exeкак hardlink (или копия){DataRoot}/proxy.exe. - Вы запускаете команду —
tscпопадает в proxy. Дальше proxy:- Обрабатывает
--nvm-useи--nvm-which(снимаются до реального инструмента). Если первый аргумент —--nvm-shim-version, печатает версию proxy и завершает работу. - Разрешает активную версию Node.js (preference, detection проекта или
--nvm-use). - Безопасность каталога (NVM4305) — каталог Node не должен быть reparse point и не должен быть writable другими пользователями.
- Находит
tsc.cmd/.exe/.batв этой установке (или в%LOCALAPPDATA%\Yarn\binдля globals Yarn Classic). - Проверяет доверие к себе,
node.exeи делегированной цели, затем запускает реальный инструмент.
- Обрабатывает
Короткий prewarm-список (node, npm, npx, yarn, pnpm) прогоняется после reshim. Остальные globals появляются после install + reshim.
Сам node — отдельный бинарник shim (не proxy.exe). Глобальные CLI и менеджеры пакетов делят proxy.exe.
Когда выполняется reshim
nvm reshim обновляет hardlink (или копии) после:
- Установки или активации версии Node
- Операций менеджеров пакетов, затрагивающих globals (например
npm install -g, yarn global/dlx/plugins, corepack enable/use) - Явного ремонта (
nvm doctor --autofix/ sync reshim)
Если новый глобальный CLI отсутствует в PATH, выполните reshim (или переустановите / активируйте версию), чтобы создать {DataRoot}/.shim/{name}.exe.
Проверка целостности
Если проверка доверия не проходит, команда не запускается.
| Проверка | Поведение |
|---|---|
| Self-check shim | {DataRoot}/.shim/{name}.exe должен побайтно совпадать с {DataRoot}/proxy.exe |
node.exe | Verify-cache / Authenticode (NVM4301 / NVM4303) |
Делегированный .cmd / .bat / .exe | Script trust cache (SHA-256 + TPM-подпись) или verify-cache для .exe — отказ → NVM4306 |
| Недоверенный self-update | Entrypoint изменился, пока модуль не доверен → аудит NVM4406 (deny / allow / prompt); см. NVM Firewall |
Записи доверия пишутся при install, activation и reshim.
Если self-update global CLI блокируется (NVM4306), выполните nvm firewall trust module <name>.
Одного nvm reshim недостаточно, чтобы модуль оставался доверенным после следующего self-update.
Подробнее: Package Manager Shims — Integrity.
Схема размещения
{DataRoot}/
├── proxy.exe ← канонический shim менеджеров / globals
├── .shim/
│ ├── npm.exe ← менеджеры пакетов (тот же бинарник)
│ ├── tsc.exe ← пример глобального CLI → proxy.exe
│ ├── eslint.exe
│ ├── <global-cli>.exe
│ └── node.exe ← отдельный node shim
└── .verify/
{InstallRoot}/
└── vX.Y.Z/
├── tsc.cmd ← реальный launcher в активном Node
└── node_modules/
└── …
См. также
- Package Manager Shims
- node (shim)
- Режимы работы
- NVM Firewall — доверие после self-update глобального CLI
- Коды ошибок — NVM4301, NVM4303, NVM4305, NVM4306, NVM4406