如何使用 TypeScript 制作 shell 可执行节点文件

问题描述 投票:0回答:8

通常在我刚放的节点文件中

#!/usr/bin/env node 

在顶部并使其可执行以创建一个可以从 bash 终端运行的文件。但是,如果我在 Typescript 文件中这样做,编译器会显示“错误 TS1001:意外字符“#””并拒绝编译它。那么如何使用 Typescript 制作一个 shell 可执行节点文件呢?

更新: 这已得到修复 https://github.com/Microsoft/TypeScript/issues/2749 shebangs 现在直通

node.js bash typescript command-line-interface
8个回答
25
投票

有关示例,请参见https://github.com/Microsoft/TypeScript/blob/master/bin/tsc。基本上有一个没有

.js
扩展名的虚拟文件,只需要实际的
.js
文件。

例如在名为

tsc
的文件中:

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

17
投票

你向微软报告错误是对的,他们将其关闭为 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

9
投票

如果你全局安装了 TypeScript 和 ts-node:

npm install typescript ts-node -g

您现在可以轻松地做到这一点:

#!/usr/bin/env ts-node

console.log('Hello world')

7
投票

我没有足够的声誉点数来发表评论,但我只是认为让每个人都知道我在 GitHub 上开了一个新问题是件好事,因为 Typescript 开发人员正在使用它来跟踪此类事情:https://github.com/Microsoft/TypeScript/issues/2749.


4
投票

如果有人仍在努力让它工作,ts 文件应该以

#! node
而不是
#!/usr/bin/env node
开头,而 tsc 将处理其余的事情。


1
投票

我一直无法让

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 秒的所有内容,因此杂散的临时文件不能吃掉我的整个系统。)


1
投票

ts-node v8.9.0 开始,recommended 方法如下:

#!/usr/bin/env ts-node-script

0
投票

如果您不想全局安装 TS 和 ts-node,并希望直接通过文件路径使脚本可运行,请在本地 node_modules 旁边创建一个文件,例如

cli.ts
,并将其放在第一行

#!/usr/bin/env ./node_modules/.bin/ts-node

console.log('Wow');

然后通过调用执行

./cli.ts

© www.soinside.com 2019 - 2024. All rights reserved.