使用 ts-node 执行打字稿文件时出错(将项目安装为全局模块后)

2024-04-04

使用 Windows 8.1 64 位 & 纱线

我正在尝试创建一个全局模块,其中包含打字稿文件并使用ts-node(并且不将文件转换为js)

示例项目位于github https://github.com/gmastergreatee/test-ts-global

我想在命令行上执行“gmt”时运行它,因此我在“package.json”中添加了“bin”并提供了适当的值

并将 shebang "#!/usr/bin/env ts-node" 添加到主文件中

但是当我通过“yarn global add [directory-path]”全局安装包后执行“gmt”时,我收到错误:-

C:\Users\gmaster>gmt
C:\Users\gmaster\AppData\Local\Yarn\Data\global\node_modules\gmt\bin\index.ts:6
let term: string = 'guys';
        ^

SyntaxError: Unexpected token :
    at Module._compile (internal/modules/cjs/loader.js:720:23)
    at Module._extensions..js (internal/modules/cjs/loader.js:787:10)
    at Object.require.extensions.<computed> [as .ts] (C:\Users\gmaster\AppData\L
ocal\Yarn\Data\global\node_modules\ts-node\src\index.ts:485:14)
    at Module.load (internal/modules/cjs/loader.js:643:32)
    at Function.Module._load (internal/modules/cjs/loader.js:556:12)
    at Function.Module.runMain (internal/modules/cjs/loader.js:839:10)
    at Object.<anonymous> (C:\Users\gmaster\AppData\Local\Yarn\Data\global\node_
modules\ts-node\src\bin.ts:158:12)
    at Module._compile (internal/modules/cjs/loader.js:776:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:787:10)
    at Module.load (internal/modules/cjs/loader.js:643:32)

难道我做错了什么?已经在网上搜索了几个小时。

我的目标是稍后将 ts 文件路径传递给“gmt”,以便“gmt”将动态导入我的打字稿文件并使用共享接口文件从中执行某些内容。但我什至无法让全球 ts 系统工作,:(

请帮忙。 还要提及是否有更好的方法来实现我的目标。

非常感谢

node version 12.6.0
npm version 6.9.0
yarn version 1.16.0
ts-node version 8.4.1
tsc version 3.6.3

全部安装在全球范围内


Update:下面描述的问题已在[email protected] https://github.com/TypeStrong/ts-node/releases/tag/v8.9.0感谢我的报告。--script-mode现在在查找之前解析符号链接tsconfig.json文件。正确使用的 shebang 是#!/usr/bin/env ts-node-script,现在也是记录在案 https://github.com/TypeStrong/ts-node#shebang。确保您已在全球范围内安装了最新版本npm -g install ts-node。 (我不确定您是否还/仍然需要为此全局安装 TypeScript。如果是:npm -g install typescript.)

Outdated:我不确定这是否能解决您的问题,但我详细记录了我当前的方法这个问题 https://github.com/TypeStrong/ts-node/issues/995。简而言之,许多模块(包括 Node.js 本身的模块)要求您使用--esModuleInterop https://www.typescriptlang.org/v2/tsconfig#esModuleInteropTypeScript 编译器的选项。 (您可以在您的tsconfig.json文件。)为了能够从任何地方使用你的命令,而不仅仅是在你的包目录中,你必须使用未记录的--script-mode https://github.com/TypeStrong/ts-node/blob/92cf9613828c2ba2fe37b7a0aa7895e122c16185/src/bin.ts#L240-L258选项ts-node https://github.com/TypeStrong/ts-node或无证的ts-node-script https://github.com/TypeStrong/ts-node/blob/92cf9613828c2ba2fe37b7a0aa7895e122c16185/package.json#L10命令,它的作用是the same https://github.com/TypeStrong/ts-node/blob/master/src/bin-script.ts.

换句话说,你的shebang https://en.wikipedia.org/wiki/Shebang_(Unix)应该是#!/usr/bin/env -S ts-node --script-mode or #!/usr/bin/env ts-node-script。 (前者使用-S https://www.gnu.org/software/coreutils/manual/html_node/env-invocation.html#g_t_002dS_002f_002d_002dsplit_002dstring-usage-in-scripts将参数传递给指定的解释器。如果这在您的平台上不起作用,您可以尝试乱搞 http://sambal.org/2014/02/passing-options-node-shebang-line/这个限制。)

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 ts-node 执行打字稿文件时出错(将项目安装为全局模块后) 的相关文章

随机推荐