使用 npm 脚本作为“bin”

jex*_*rer 6 node.js npm typescript

我有一个用 TypeScript 编写的命令行应用程序,其中定义了一些 npm 脚本package.json

  "scripts": {
    "start": "ts-node src/index.ts",
    "start-args": "ts-node src/index.ts -- some args"
  },
Run Code Online (Sandbox Code Playgroud)

我想链接 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"
  }
Run Code Online (Sandbox Code Playgroud)

ts-node是本地安装的。

然而,由于 Node 本身并不支持 TypeScript,因此仅仅放置一个 shebang./src/index.ts是行不通的。

我还希望能够使用默认参数创建一个别名命令,如上所述bazqux。当我将包链接或安装为全局时,我可以全局运行“foobar”,就像在存储库中运行“npm run start”一样;或者全局运行“bazqux”,因为它是“npm run start-args”。

如何实现这一目标?

Kas*_*ter 6

更新:由于我的报告,下面描述的问题已得到解决ts-node@8.9.0--script-mode现在在查找tsconfig.json文件之前解析符号链接。正确使用的 shebang 是#!/usr/bin/env ts-node-script,现在也已记录。确保您已全局安装最新版本的npm -g install ts-node. (我不确定您是否还/仍然需要为此全局安装 TypeScript。如果是:npm -g install typescript。)

过时的:对于那些仍然偶然发现这个问题的人,我在本期中详细记录了我当前的方法。简而言之,许多模块(包括 Node.js 本身的模块)要求您使用--esModuleInteropTypeScript 编译器的选项。(您可以在文件中指定这一点tsconfig.json。)为了能够从任何地方使用您的命令,而不仅仅是在包目录中,您必须使用未记录的选项--script-mode或未ts-node记录的ts-node-script命令,它的作用相同

换句话说,你的shebang应该是#!/usr/bin/env -S ts-node --script-mode#!/usr/bin/env ts-node-script。(前者用于-S将参数传递给指定的解释器。如果这在您的平台上不起作用,您可以尝试绕过此限制。)

如果您想使用(例如,通过从包目录运行)bin的功能,则上述内容不起作用,因为(还?)不遵循符号链接。要解决此问题,您可以在脚本的第一行使用。但这并不理想,因为它破坏了平台独立性。我目前看到的唯一其他选择是使用 bash 脚本并从那里调用您的脚本。npmnpm link--script-mode#!/usr/bin/env -S ts-node --project /usr/local/lib/node_modules/<your-project>/tsconfig.json