Как сделать исполняемый файл оболочки node с помощью TypeScript

Обычно в файлах node я просто кладу

#!/usr/bin/env node 

вверху и сделать его исполняемым для создания файла, который может быть запущен с терминала bash. Однако, если я делаю это в файле Typescript, компилятор говорит "ошибка TS1001: Неожиданный символ" # "" и отказывается его компилировать. Итак, как я могу сделать исполняемый файл оболочки node с Typescript?

Ответ 1

Вы были правы сообщать об ошибке Microsoft, и они ошибались, чтобы закрыть ее как wontfix.

Пока это не будет исправлено, обходной путь. Вставьте следующее в текстовый файл и сохраните его как shebangify:

#!/usr/bin/env node
var fs = require('fs');
var path = process.argv[2];
var data = "#!/usr/bin/env node\n\n";
data += fs.readFileSync(path);
fs.writeFileSync(path, data);

(NB. Чтобы этот ответ был кратким, код выше не имеет проверки ошибок или других уточнений, поэтому используйте его на свой страх и риск или используйте this вместо этого Также см. этот вопрос SO для получения дополнительной информации о добавлении файлов.)

Сделайте исполняемый файл с помощью терминала, чтобы перейти к файловому каталогу и выполнив:

$ chmod +x shebangify

Как только вы создали программу Typescript (например, называемую myscript.ts), которую вы хотите скомпилировать, и превратите ее в оболочку script (например, называемую myscript), сделайте это, выполнив последовательность вдоль этих строк в ваш терминал:

$ tsc --out myscript myscript.ts ; ./shebangify myscript ; chmod +x myscript

Ответ 2

См. https://github.com/Microsoft/TypeScript/blob/master/bin/tsc для примера. В основном есть фиктивный файл без расширения .js и требуется только фактический .js файл.

например. В файле с именем tsc:

#!/usr/bin/env node
require('./tsc.js')

Ответ 3

У меня недостаточно очков репутации, чтобы опубликовать комментарий, но я просто подумал, что всем будет хорошо знать, что я открыл новую проблему на GitHub, так как те, что используют Typescript разработчики выполните следующие действия: https://github.com/Microsoft/TypeScript/issues/2749.

Ответ 4

Если у вас есть TypeScript и ts-node, установленные глобально:

npm install typescript ts-node -g

Теперь вы можете легко сделать это с:

#!/usr/bin/env ts-node

console.log('Hello world')

Ответ 5

Мне никогда не удавалось заставить ts-node работать, поэтому я наконец-то нашел свой собственный способ написания сценариев оболочки на TypeScript. Если бы был менеджер пакетов для Bash, я бы сделал пакет, но его нет, поэтому я просто поместил этот сценарий в моем пути как ts-exec:

#!/usr/bin/env bash

file_to_run="$1"
basename='basename "$1"'
tmp_prefix='basename "$BASH_SOURCE"'

TMPDIR='mktemp -d -t "$tmp_prefix-XXXXXXXXXX"'
pushd "$TMPDIR" > /dev/null

cp "$1" "$basename.ts"
tsc "$basename"
node "$basename.js"

popd > /dev/null
rm -rf "$TMPDIR"

И теперь я могу делать такие вещи:

#!/usr/bin/env ts-exec

let greeting: string = "Hello World!";

console.log( greeting );

И это работает.

Конечно, у него есть некоторые ограничения

  • Подходит только для сценариев, которые ограничены одним файлом
  • Он не выполняет проверку ошибок
  • Имеет неявные зависимости
  • У него нет установщика

... так что в основном это для любителей Bash, которые хотят использовать TypeScript для небольших сценариев, которые было бы проблематично писать как сценарии Bash. Я по-прежнему озадачен тем, что ts-node не охватывает этот случай, и я бы предпочел не тратить время на временные файлы, которые могут остаться позади, и тратить место в случае ошибки, но пока это касается моего варианта использования. (Кроме того, у меня есть этот cronjob, который удаляет все в ~/tmp, возраст которого превышает 31622400 секунд каждую ночь, поэтому случайные временные файлы не могут съесть всю мою систему.)