我有一个用 TypeScript 编写的命令行应用程序,其中有一些在 package.json
中定义的 npm 脚本。
"scripts": {
"start": "ts-node src/index.ts",
"start-args": "ts-node src/index.ts -- some args"
},
我想链接 TypeScript 文件并为其设置别名,以便可以轻松调用该程序,因此我正在 package.json< 中寻找类似于
文件。"bin"
键的内容
"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
。当我将包链接或安装为全局时,我可以全局运行“foobar”,就像在存储库中运行“npm run start”一样;或者全局运行“bazqux”,因为它是“npm run start-args”。
如何实现这一目标?
最佳答案
更新:下述问题已在 ts-node@8.9.0
中修复感谢我的报告。 --script-mode
现在在查找 tsconfig.json
之前解析符号链接(symbolic link)文件。正确使用的 shebang 是 #!/usr/bin/env ts-node-script
,现在也是 documented 。确保您已全局安装最新版本 npm -g install ts-node
。 (我不确定您是否还/仍然需要为此全局安装 TypeScript。如果是: npm -g install typescript
。)
过时:对于那些仍然偶然发现这个问题的人,我在 this issue 中详细记录了我当前的方法。 。简而言之,许多模块(包括 Node.js 本身的模块)要求您使用 --esModuleInterop
TypeScript 编译器的选项。 (您可以在 tsconfig.json
文件中指定它。)为了能够从任何地方而不仅仅是在包目录中使用您的命令,您必须使用未记录的 --script-mode
ts-node
的选项或无证的 ts-node-script
命令,它执行 the same .
换句话说,您的shebang应该是 #!/usr/bin/env -S ts-node --script-mode
或#!/usr/bin/env ts-node-script
。 (前者使用 -S
将参数传递给指定的解释器。如果这在您的平台上不起作用,您可以尝试hack around此限制。)
如果您想使用 bin
npm
的功能(例如,通过从包目录运行 npm link
),上述内容不起作用,因为 --script-mode
不(还?)遵循符号链接(symbolic link)。要解决此问题,您可以使用 #!/usr/bin/env -S ts-node --project /usr/local/lib/node_modules/<your-project>/tsconfig.json
在脚本的第一行。但这并不理想,因为它破坏了平台独立性。目前我看到的唯一其他选择是使用 bash 脚本并从那里调用您的脚本。
关于node.js - 使用 npm 脚本作为 "bin",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55820752/