npx tsc --version сообщает о другой версии TypeScript внутри виртуальной машины

Я хочу иметь возможность запускать npx tsc в моем проекте как на хосте, так и на гостевой операционной системе. Но гость использует другую (более старую) версию tsc, и я не уверен, откуда она взялась.

Моя установка:

  • Хост ОС: Windows 10
  • Гостевая ОС: Debian 9
  • Я использую VirtualBox, и гость монтирует файлы хоста с помощью функции «общих папок» VirtualBox, поэтому у него нет отдельной копии файлов проекта — доступ к моему проекту осуществляется через общие папки в любое время.
  • У меня НЕ установлен Typescript глобально (npm -g) ни на хосте, ни на гостевой ОС (чтобы подтвердить это, запуск npm -g ls typescript на обоих хостах и ​​гостях показывает «пусто», а запуск только «tsc» не работает, как и ожидалось).

У меня есть проект с TypeScript 3.3.3333, установленный в проект с NPM.

В операционной системе Windows, когда я cd захожу в папку проекта и запускаю:

  • npm ls typescript Я вижу вывод: [email protected] (как и ожидалось)
  • npx tsc --version Я вижу вывод: Version 3.3.3333 (как и ожидалось)

В гостевой ОС Linux, когда я cd захожу в папку проекта и запускаю:

  • npm ls typescript Я вижу вывод: [email protected] (как и ожидалось)
  • npx tsc --version Я вижу вывод: message TS6029: Version 1.5.3 (неожиданно!)

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

Откуда может взяться эта версия tsc 1.5.3 и как от нее избавиться?

Или есть какая-то альтернативная команда NPM, которую я могу запустить на хосте, которая установит пригодный для использования tsc в проект, который работает как для Windows, так и для Linux?

Кроме того, ни в одной из родительских папок выше в корне моего проекта нет папки node_modules (но, конечно, в корне моего проекта есть подпапка node_modules).


person LaVache    schedule 13.03.2019    source источник


Ответы (1)


Двоичный файл TypeScript называется tsc для краткости. Если он не установлен глобально, npx не может знать, что tsc ссылается на tsc двоичный файл для typescript пакета. npx tsc относится к устаревшему tsc пакету.

Это можно исправить, указав имя пакета явно:

npx -p typescript tsc

И настоящая проблема здесь в том, что проект полагается на глобальную установку TypeScript. Обычно typescript проект был написан с зависимостями проекта и ссылается на локальную установку в сценариях NPM package.json:

...
"scripts": {
  "build": "tsc"
},
"devDependencies": {
  "typescript": "~3.3.0"
"
...
person Estus Flask    schedule 13.03.2019
comment
Спасибо, похоже, что npx -p typescript tsc делает то, что мне нужно, и правильно сообщает версию 3.3.3333. Мне любопытно, как запускался старый пакет tsc? Потому что я не установил его в проекте или глобально, а строка tsc даже не существует нигде в моих файлах package.json или package-lock.json. Также нет папки tsc в node_modules. Также npx tsc --version сообщил о message TS6029: Version 1.5.3, который не является номером версии пакета tsc? (который использует другой формат для номеров версий). - person LaVache; 14.03.2019
comment
Я не могу найти ни одного пакета tsc в файловых системах хоста или гостевой системы. npx временно загружает копию и удаляет ее после запуска или что-то в этом роде? (Я вижу сообщение npx: installed 1 in 1.998s, когда запускаю его) Или, иначе, откуда могут браться файлы пакета tsc? - person LaVache; 14.03.2019
comment
Да, это то, что делает npx. Он устанавливает временную копию. То, что tsc имеет последнюю версию 1.20150623.0, а не 1.5.3, означает, что пакет использует другую версию для внутреннего отображения с помощью -v и не получает ее из package.json. - person Estus Flask; 14.03.2019
comment
Извините, но я не понимаю, почему npx не получает новую версию TSC? - person Murad Sofiyev; 19.10.2020
comment
@MuradSofiyev Он использует глобально установленный TS, если он есть. Используйте npx --ignore-existing -p typescript tsc, если вы хотите, чтобы он вел себя по-другому. - person Estus Flask; 19.10.2020
comment
Да, но у меня нет глобально установленного TS, это означает, что npx должен загрузить последнюю версию tsc и выполнить. Я ошибаюсь? Но npx загружает старую версию TypeScript:/ - person Murad Sofiyev; 20.10.2020
comment
@MuradSofiyev Какая версия? Вы проверили, что он не установлен? То, что у вас есть эта проблема, говорит об обратном. - person Estus Flask; 20.10.2020