node.js - 使用 npm 脚本作为 "bin"

标签 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 文件并为其设置别名,以便可以轻松调用该程序,因此我正在 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/

相关文章:

javascript - return q.all() 不等待解析,除非包装在 deferred.resolve 中

node.js - NPM 在 OSX 10.9.5 上安装 zmq 失败

node.js - 有没有一种快速的方法可以找出我的 node.js/npm 项目中所有依赖项的来源?

javascript - 是否有将非结构化数据转换为 csv 的 npm 包?

node.js - Mongoose - 链接到同一类型的嵌套子文档

javascript - 将 typescript 字符串文字类型转换为字符串数组

angularjs - angular2 中 angular.equals 的等价物

node.js - 如何修复intellij找不到Node interpreter,但node文件在文件夹中

android - React Native SDK 运行时权限错误

javascript - 丢失 HTTP 请求正文