NodeJS 如何使用TypeScript创建shell可执行节点文件

jgzswidk  于 2023-02-15  发布在  Node.js
关注(0)|答案(8)|浏览(148)

通常在节点文件中,我只放入

#!/usr/bin/env node

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

ckx4rj1h

ckx4rj1h1#

基本上有一个没有.js扩展名的虚拟文件,只需要实际的.js文件。
例如,在名为tsc的文件中:

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

k10s72fa2#

你向微软报告这个bug是正确的,他们把它作为 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);

(N.B.为了保持答案简洁,上面的代码没有任何错误检查或其他改进,所以使用风险自担,或者使用this代替。另外,请参阅this SO question以获得更多关于在文件前面添加前缀的信息。)
通过使用终端导航到文件目录并执行以下命令,使文件可执行:

$ chmod +x shebangify

一旦你创建了一个Typescript程序(例如,名为myscript.ts),你希望编译并转换成shell脚本(例如,名为myscript),通过沿着你的终端中执行一个序列来完成:

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

nwwlzxa73#

如果全局安装了TypeScript和ts节点:

npm install typescript ts-node -g

现在,您可以使用以下工具轻松完成此操作:

#!/usr/bin/env ts-node

console.log('Hello world')
iezvtpos

iezvtpos4#

我没有足够的信誉点数来发表评论,但我只是想让大家知道我在GitHub上开了一个新的问题,因为这是Typescript开发人员用来跟踪类似以下内容的东西:https://github.com/Microsoft/TypeScript/issues/2749.

hfsqlsce

hfsqlsce5#

如果有人还在为让它工作而挣扎,ts文件应该以#! node而不是#!/usr/bin/env node开头,tsc将负责其余的工作。

tktrz96b

tktrz96b6#

我从来没有能够让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 );

而且很管用。
当然,它也有一些局限性

  • 它只适用于限制在单个文件中的脚本
  • 它不执行任何错误检查
  • 它具有隐式依赖关系
  • 它没有安装程序

...所以基本上它是为bash书呆子谁想要使用TypeScript的小脚本,这将是一个痛苦的写为bash脚本。我仍然感到困惑的是,ts-node没有涵盖这种情况,我宁愿没有futz与临时文件,可能会留下浪费空间,如果有一个错误,但到目前为止,这涵盖了我的用例。(此外,我有一个cronjob,它每天晚上都会删除~/tmp中超过31622400秒的所有内容,所以临时文件不会吃掉我的整个系统。)

lvmkulzt

lvmkulzt7#

ts-node v8.9.0开始,建议使用以下方法来执行此操作:

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

8zzbczxx8#

如果您不想全局安装TS和ts-node,而想直接通过文件路径运行脚本,请在local node_modules旁边创建一个文件(例如cli.ts),并将其作为第一行

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

console.log('Wow');

然后通过调用./cli.ts执行

相关问题