使用npm脚本作为“ bin”

时间:2019-04-23 23:35:34

标签: node.js typescript npm

我有一个用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”。

如何实现?

2 个答案:

答案 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