我有一个用TypeScript编写的命令行应用程序,其中有一些package.json
中定义的npm脚本。
"scripts": {
"start": "ts-node src/index.ts",
"start-args": "ts-node src/index.ts -- some args"
},
我想链接TypeScript文件并为其加上别名,以便可以轻松调用该程序,因此我正在寻找"bin"
文件中的package.json
键之类的东西。
"scripts": {
"start": "ts-node ./src/index.ts",
"start-args": "ts-node src/index.ts -- some args"
},
"bin": {
"foobar": "./src/index.ts",
"bazqux": "./src/index.ts some args"
}
ts-node
已本地安装。
但是,由于Node本身不支持TypeScript,因此仅在./src/index.ts
上放一个shebang是不起作用的。
我还希望能够使用默认参数创建一个别名命令,例如上面的bazqux
。当我以全局方式链接或安装该软件包时,可以像在存储库中运行“ npm run start”一样全局运行“ foobar”。或全局运行“ bazqux”,因为它是“ npm run start-args”。
如何实现?
答案 0 :(得分:1)
更新:感谢我的报告,以下问题已在ts-node@8.9.0
中修复。 --script-mode
现在可以在查找tsconfig.json
文件之前解析符号链接。正确使用的Shebang是#!/usr/bin/env ts-node-script
,现在它也是documented。确保已使用npm -g install ts-node
在全球范围内安装了最新版本。 (我不确定是否为此还需要在全球范围内安装TypeScript。如果是,则为npm -g install typescript
。)
已过时:对于仍然偶然发现此问题的人,我在this issue中详细记录了我当前的方法。简而言之,许多模块(包括Node.js本身的模块)都要求对TypeScript编译器使用--esModuleInterop
选项。 (您可以在tsconfig.json
文件中指定此名称。)为了能够从任何地方而不是仅在包目录中使用命令,您必须为{{ 3}}或未记录的--script-mode
命令,它执行ts-node
。
换句话说,您的ts-node-script
应该是#!/usr/bin/env -S ts-node --script-mode
或#!/usr/bin/env ts-node-script
。 (前者使用the same将参数传递给指定的解释器。如果这在您的平台上不起作用,则可以尝试shebang进行此限制。)
如果您想使用npm
的{{3}}功能(例如,通过从软件包目录运行-S
),则以上操作不起作用,因为--script-mode
无效(还?)遵循符号链接。要解决此问题,您可以在脚本的第一行使用#!/usr/bin/env -S ts-node --project /usr/local/lib/node_modules/<your-project>/tsconfig.json
。但是,这并不理想,因为它破坏了平台的独立性。我目前看到的唯一其他选择是改用bash脚本,然后从那里调用您的脚本。
答案 1 :(得分:0)
如果ts-node
在路径变量中,则可以使用
#!/usr/bin/env ts-node
console.log("Hello World");
结帐仓库: https://github.com/deepakshrma/ts-cli
尝试:
$ npm i -g https://git@github.com:deepakshrma/ts-cli.git
$ ts-test