通常在我刚放的节点文件中
#!/usr/bin/env node
在顶部并使其可执行以创建一个可以从 bash 终端运行的文件。但是,如果我在 Typescript 文件中这样做,编译器会显示“错误 TS1001:意外字符“#””并拒绝编译它。那么如何使用 Typescript 制作一个 shell 可执行节点文件呢?
更新: 这已得到修复 https://github.com/Microsoft/TypeScript/issues/2749 shebangs 现在直通
有关示例,请参见https://github.com/Microsoft/TypeScript/blob/master/bin/tsc。基本上有一个没有
.js
扩展名的虚拟文件,只需要实际的 .js
文件。
例如在名为
tsc
的文件中:
#!/usr/bin/env node
require('./tsc.js')
你向微软报告错误是对的,他们将其关闭为 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。另外,请参阅this SO question有关前置的更多信息到文件。)
通过使用终端导航到文件目录并执行,使文件可执行:
$ chmod +x shebangify
一旦您创建了一个 Typescript 程序(例如称为
myscript.ts
),您希望将其编译并转换为 shell 脚本(例如称为 myscript
),通过在终端中按照以下行执行序列来执行此操作:
$ tsc --out myscript myscript.ts ; ./shebangify myscript ; chmod +x myscript
如果你全局安装了 TypeScript 和 ts-node:
npm install typescript ts-node -g
您现在可以轻松地做到这一点:
#!/usr/bin/env ts-node
console.log('Hello world')
我没有足够的声誉点数来发表评论,但我只是认为让每个人都知道我在 GitHub 上开了一个新问题是件好事,因为 Typescript 开发人员正在使用它来跟踪此类事情:https://github.com/Microsoft/TypeScript/issues/2749.
如果有人仍在努力让它工作,ts 文件应该以
#! node
而不是 #!/usr/bin/env node
开头,而 tsc 将处理其余的事情。
我一直无法让
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 秒的所有内容,因此杂散的临时文件不能吃掉我的整个系统。)
从 ts-node v8.9.0 开始,recommended 方法如下:
#!/usr/bin/env ts-node-script
如果您不想全局安装 TS 和 ts-node,并希望直接通过文件路径使脚本可运行,请在本地 node_modules 旁边创建一个文件,例如
cli.ts
,并将其放在第一行
#!/usr/bin/env ./node_modules/.bin/ts-node
console.log('Wow');
然后通过调用执行
./cli.ts