通常在我刚刚放置的节点文件中
#!/usr/bin/env node
在顶部并使其可执行以创建可以从bash终端运行的文件。但是,如果我在Typescript文件中这样做,编译器会说“错误TS1001:意外字符”#“”并拒绝编译它。那么如何使用Typescript创建一个shell可执行节点文件?
答案 0 :(得分:12)
您向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);
(注意:为了使这个答案简明扼要,上面的代码没有任何错误检查或其他改进,因此请自担风险或使用this代替。另请参阅{{3}有关前置文件的更多信息。)
使用终端导航到文件的目录并执行以下命令使文件可执行:
$ chmod +x shebangify
一旦你创建了一个你想编译并编译成shell脚本(例如名为myscript.ts
)的Typescript程序(例如名为myscript
),就可以通过沿着这些行执行一个序列来实现。你的终端:
$ tsc --out myscript myscript.ts ; ./shebangify myscript ; chmod +x myscript
答案 1 :(得分:8)
有关示例,请参阅https://github.com/Microsoft/TypeScript/blob/master/bin/tsc。基本上有一个没有.js
扩展名的虚拟文件,只需要实际的.js
文件。
E.g。在名为tsc
的文件中:
#!/usr/bin/env node
require('./tsc.js')
答案 2 :(得分:3)
我没有足够的声望点来发表评论,但我只是觉得每个人都知道我在GitHub上开了一个新问题是好的,因为那是Typescript开发人员用来跟踪事物的东西像这样:https://github.com/Microsoft/TypeScript/issues/2749。
答案 3 :(得分:1)
万一有人仍在努力使其工作,则ts文件应以#! node
而不是#!/usr/bin/env node
开头,而tsc将负责其余的工作。
答案 4 :(得分:0)
如果您已全局安装TypeScript和ts-node:
npm install typescript ts-node -g
您现在可以轻松地执行以下操作:
#!/usr/bin/env ts-node
console.log('Hello world')
答案 5 :(得分:0)
我一直无法使ts-node
正常工作,所以我终于以自己的方式在TypeScript中编写Shell脚本。如果有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 );
它有效。
当然,它确实有一些局限性
...因此,基本上是希望将TypeScript用于小型脚本的bash书呆子,很难将其编写为Bash脚本。我仍然感到困惑,ts-node
没有涵盖这种情况,我宁愿不必去处理那些可能会遗留下来的临时文件,如果有错误的话会浪费空间,但是到目前为止,这已经涵盖了我的用法-案件。 (此外,我的cronjob每天晚上删除~/tmp
中所有超过31622400秒的内容,因此临时文件无法吞噬整个系统。)
答案 6 :(得分:0)
从 ts-node v8.9.0 开始,recommended 的方法似乎是:
#!/usr/bin/env ts-node-script