chore: wiki +2 концепта (nvm-junction isMain gotcha, nvm-windows switch), 4 июльских ⚪-блока флипнуты 🟢, handoff: волна вышла, ретест в след. сессии
This commit is contained in:
76
.wiki/concepts/nvm-junction-ismain-gate-gotcha.md
Normal file
76
.wiki/concepts/nvm-junction-ismain-gate-gotcha.md
Normal file
@@ -0,0 +1,76 @@
|
||||
---
|
||||
title: "nvm-junction isMain-gate gotcha — ESM main() молча не выполняется"
|
||||
type: concept
|
||||
tags: [node, esm, nvm, windows, junction, symlink, cli, gotcha, postmortem]
|
||||
sources: []
|
||||
related: [concepts/nvm-windows-node-switch.md]
|
||||
updated: 2026-08-18
|
||||
---
|
||||
|
||||
# nvm-junction isMain-gate gotcha
|
||||
|
||||
`import.meta.url === pathToFileURL(process.argv[1]).href` ломается, когда
|
||||
`node` вызывается через junction/симлинк-префикс (nvm-windows, nvm/mise/volta
|
||||
на *nix — те же грабли). Симптом: CLI-бинарь **молча no-op** — `--help`,
|
||||
флаги, даже strict-parse ошибки: exit 0, пустой stdout для ЛЮБОГО вызова.
|
||||
|
||||
## Root cause
|
||||
|
||||
ESM резолвит `import.meta.url` в **realpath** файла, а `process.argv[1]`
|
||||
держит **литеральный** путь из командной строки (через junction). Строки
|
||||
разные → `main()` не вызывается, скрипт просто завершается.
|
||||
|
||||
Конкретика (найдено в CLI-F&F sched 2026-08-18):
|
||||
|
||||
```
|
||||
C:\nvm4w\nodejs\node_modules\@sched\daemon\dist\cli.js --help
|
||||
# junction C:\nvm4w\nodejs → realpath C:\Users\vitya\AppData\Local\nvm\v22.22.0
|
||||
# import.meta.url = file:///C:/Users/vitya/AppData/Local/nvm/v22.22.0/.../cli.js (realpath)
|
||||
# process.argv[1] = C:\nvm4w\nodejs\node_modules\@sched\daemon\dist\cli.js (literal)
|
||||
# → != → main() не выполняется
|
||||
```
|
||||
|
||||
Realpath-инвокация (`node <realpath>/cli.js`) работает идеально — поэтому
|
||||
баг «плавающий»: у разработчика (из исходников) работает, у оператора
|
||||
(global-установка под version-manager'ом) — нет.
|
||||
|
||||
## Фикс
|
||||
|
||||
Сравнивать realpath'ы обеих сторон:
|
||||
|
||||
```ts
|
||||
import { realpathSync } from 'node:fs'
|
||||
import { fileURLToPath } from 'node:url'
|
||||
|
||||
function isCliMain(argv1, metaUrl) {
|
||||
if (!argv1) return false
|
||||
return realpathSync(fileURLToPath(metaUrl)) === realpathSync(argv1)
|
||||
}
|
||||
```
|
||||
|
||||
TDD-покрытие: junction-регрессия через `fs.symlinkSync('junction')`,
|
||||
real-path true, другой файл false, `argv1` undefined false. (sched
|
||||
`apps/daemon/src/cli.ts`, коммит `bd38aab`, daemon 0.3.2.)
|
||||
|
||||
Альтернатива — не использовать isMain-гейт вовсе (как @sched/cli: бинарь
|
||||
всегда main).
|
||||
|
||||
## Кого бьёт
|
||||
|
||||
Любой `bin` в npm-пакете с isMain-гейтом, установленный **глобально** под
|
||||
version-manager'ом с junction/symlink-префиксом npm-рута:
|
||||
- nvm-windows (`C:\nvm4w\nodejs` → junction на активную версию)
|
||||
- nvm / volta / mise на *nix (симлинки в `~/.nvm/...`)
|
||||
|
||||
## Диагностика за 30 секунд
|
||||
|
||||
```
|
||||
# из-под глобальной установки:
|
||||
schedd --help # пусто, exit 0 → подозрение
|
||||
node $(which schedd) --help # realpath-инвокация → полный help → подтверждено
|
||||
```
|
||||
|
||||
## Проверено на Node 24
|
||||
|
||||
На Node 24.19.0 (nvm-windows, junction) тот же realpath-фикс работает:
|
||||
`--help` полный, exit 0, stderr чист. См. [nvm-windows-node-switch](nvm-windows-node-switch.md).
|
||||
54
.wiki/concepts/nvm-windows-node-switch.md
Normal file
54
.wiki/concepts/nvm-windows-node-switch.md
Normal file
@@ -0,0 +1,54 @@
|
||||
---
|
||||
title: "nvm-windows: смена версии Node — junction, per-version глобалы, PATH-кэш"
|
||||
type: concept
|
||||
tags: [windows, nvm, node, npm, migration, recipe]
|
||||
sources: []
|
||||
related: [concepts/nvm-junction-ismain-gate-gotcha.md]
|
||||
updated: 2026-08-18
|
||||
---
|
||||
|
||||
# nvm-windows: смена версии Node
|
||||
|
||||
Рецепт перехода Node 22 → 24.19.0 на рабочей машине (nvm-windows, 2026-08-18).
|
||||
Переиспользуемо для любой смены версии.
|
||||
|
||||
## Шаги
|
||||
|
||||
```powershell
|
||||
nvm list # текущая: * 22.22.0, 18.20.8
|
||||
nvm install 24.19.0 # или nvm install 24 (latest 24.x LTS)
|
||||
nvm use 24.19.0 # переключает junction
|
||||
node --version # v24.19.0 (в НОВОМ терминале)
|
||||
```
|
||||
|
||||
## Грабли (все три — проверены эмпирически)
|
||||
|
||||
1. **Junction, не копия.** `C:\nvm4w\nodejs` — junction на активную версию
|
||||
(`→ C:\Users\vitya\AppData\Local\nvm\v24.19.0`). `nvm use` меняет только
|
||||
target junction'а. Старые уже-запущенные процессы продолжают работать на
|
||||
старой версии (бинарь загружен в память) — перезапуск нужен только новым
|
||||
процессам.
|
||||
|
||||
2. **Глобальные пакеты per-version.** `npm i -g X` ставит в
|
||||
`…\nvm\<версия>\node_modules\` — после `nvm use` глобалы НЕ переносятся.
|
||||
Переустановить: `npm i -g @sched/cli@0.1.2 @sched/daemon@0.3.4 …`
|
||||
(старые остаются в каталоге старой версии, не мешают; откат = `nvm use 22`).
|
||||
|
||||
3. **Текущий shell кэширует PATH.** После `nvm use` bash-сессия может
|
||||
выдавать `node: command not found` (кэш резолва) или держать старый бинарь.
|
||||
Фиксы: `hash -r` в bash / новый терминал / `cmd /c "node --version"` —
|
||||
cmd-сессия резолвит свежий junction.
|
||||
|
||||
## npm 11: allow-scripts на global-установках
|
||||
|
||||
npm 11 предупреждает про install-скрипты, не покрытые `allowScripts`
|
||||
(напр. `ssh2@1.17.0`). В общем случае косметика — пакет грузится чистой
|
||||
JS-реализацией (`require('ssh2').Client` — function). Если нативный модуль
|
||||
действительно нужен — `npm i -g --allow-scripts=<pkg>`.
|
||||
|
||||
## Evidence (переход 2026-08-18, sched F&F)
|
||||
|
||||
- `schedd --help` через junction на Node 24.19.0 → полный help, exit 0,
|
||||
**stderr пуст** (ExperimentalWarning node:sqlite ушёл — Node 24 его не имеет)
|
||||
- демон под 24: health `{ok:true, version:"0.3.2"}`
|
||||
- junction realpath-фикс isMain (см. related-концепт) на 24 работает
|
||||
@@ -21,6 +21,8 @@ Catalog of all wiki pages. One line per page, organized by type. Updated on ever
|
||||
- [windows-recovery-host](entities/windows-recovery-host.md) — Windows Recovery Host (рабочий PC пользователя)
|
||||
|
||||
## Concepts
|
||||
- [nvm-junction-ismain-gate-gotcha](concepts/nvm-junction-ismain-gate-gotcha.md) — ESM isMain-гейт молча не выполняется под junction'нутым npm-рутом (nvm/mise/volta); realpath-фикс; диагностика за 30 сек
|
||||
- [nvm-windows-node-switch](concepts/nvm-windows-node-switch.md) — смена версии Node на nvm-windows: junction, per-version глобалы, PATH-кэш, npm 11 allow-scripts; Node 22→24 evidence
|
||||
- [sched-fnf-r8-verification-stand](concepts/sched-fnf-r8-verification-stand.md) — стенд верификации F&F r8 (schedule-as-entity): путь, версии core 0.40.2/ui 0.2.0, карта репро-скриптов (миграции/движок/политики/API 52/UI 13), подтверждённый контракт (ceiling, retryCount, snapshot, pause AND, tz-hoist, PATCH-merge), находки №5 (U1 форма-tz, U2 вёрстка), как закрыть раунд
|
||||
- [windows-docker-test-harness-gotchas](concepts/windows-docker-test-harness-gotchas.md) — грабли Windows-верификации против docker: rmSync до DatabaseSync (EBUSY), vitest 10s vs ~11s docker-DDL, монотонность фейк-часов, изоляция DB на сценарий, висельники node-процессов
|
||||
- [snolla-smtp-mail-delivery-2026-08](concepts/snolla-smtp-mail-delivery-2026-08.md) — SMTP-инцидент 12–14.08: 525 (Яндекс отключил протоколы) → 554 (холодный ящик, мульти-получатели) → 550 (from not owned); фиксы + монитор на VDS + рецепт деплоя
|
||||
|
||||
@@ -134,3 +134,4 @@ Append-only log of wiki operations (ingests, promotions, lints, migrations).
|
||||
## [2026-08-18] ingest | NEW concepts/sched-fnf-r8-verification-stand.md — стенд верификации F&F r8 (schedule-as-entity): путь, версии core 0.40.1/storage-* 0.3.1, карта 15 репро-скриптов (миграции/движок/политики), подтверждённый контракт, как продолжить №4/№5. NEW concepts/windows-docker-test-harness-gotchas.md — переиспользуемые грабли Windows-верификации (rmSync-EBUSY, vitest-DDL-таймаут, монотонность фейк-часов, изоляция DB, висельники node). index.md updated (+2).
|
||||
|
||||
## [2026-08-18] ingest | UPDATE concepts/sched-fnf-r8-verification-stand.md — сессия №4/№5: admin-api-test.mjs (52/52, F1 tz-hoist + F3 PATCH-merge подтверждены на core 0.40.2), UI-стенд ui-backend.mjs + sched-ui serve :8081 + браузерный CDP (13/13), находки U1 (форма-tz interval/once → 400) и U2 (таблица шире контейнера ~58px). index.md hook обновлён.
|
||||
## [2026-08-18] ingest | NEW concepts/nvm-junction-ismain-gate-gotcha.md — ESM isMain-гейт молча no-op под junction-префиксом npm-рута (C:\nvm4w\nodejs → realpath …\nvm\v22.22.0): import.meta.url резолвится в realpath, argv[1] держит литеральный → main() не выполняется, exit 0. Бьёт global-install под любым version-manager'ом (nvm/mise/volta). Фикс realpath-сравнения (sched bd38aab, daemon 0.3.2). NEW concepts/nvm-windows-node-switch.md — Node 22→24.19.0 рецепт: junction-свап, per-version глобалы, PATH-кэш shell'а, npm 11 allow-scripts. Оба из сессии CLI-F&F sched 2026-08-18. index.md updated (+2).
|
||||
|
||||
Reference in New Issue
Block a user