在 mocha 中为 ts-node 覆盖`tsconfig.json`
Overriding `tsconfig.json` for ts-node in mocha
是否可以覆盖从 mocha 调用时 tsconfig.json
ts-node 使用的哪个?
我的主要 tsconfig.json
包含 "module": "es2015"
,但我只想将 "module": "commonjs"
用于 ts-node。
我试过了
mocha --compilers ts:ts-node/register,tsx:ts-node/register \
--compilerOptions '{"module":"commonjs"}' \
--require ts-node/register test/**/*.spec.ts*
但是没有用:
SyntaxError: Unexpected token import
at exports.runInThisContext (vm.js:53:16)
at Module._compile (module.js:387:25)
at Module.m._compile (/usr/lib/node_modules/ts-node/src/index.ts:406:23)
at Module._extensions..js (module.js:422:10)
at Object.require.extensions.(anonymous function) [as .tsx] (/usr/lib/node_modules/ts-node/src/index.ts:409:12)
at Module.load (module.js:357:32)
at Function.Module._load (module.js:314:12)
at Module.require (module.js:367:17)
at require (internal/module.js:16:19)
at /usr/lib/node_modules/mocha/lib/mocha.js:222:27
at Array.forEach (native)
at Mocha.loadFiles (/usr/lib/node_modules/mocha/lib/mocha.js:219:14)
at Mocha.run (/usr/lib/node_modules/mocha/lib/mocha.js:487:10)
at Object.<anonymous> (/usr/lib/node_modules/mocha/bin/_mocha:458:18)
at Module._compile (module.js:413:34)
at Object.Module._extensions..js (module.js:422:10)
at Module.load (module.js:357:32)
at Function.Module._load (module.js:314:12)
at Function.Module.runMain (module.js:447:10)
at startup (node.js:146:18)
at node.js:404:3
--compilerOptions
不会工作。
您需要做的是自定义您的注册方式ts-node
。我的情况与您的情况有点不同,我希望它使用 test/tsconfig.json
,其中包含我的测试代码所需的设置。如果我只是使用 --require ts-node/register
,它使用的默认配置不包含 运行 我的测试所需的设置。
我所做的是:
创建文件test/tshook.js
。它包含:
require("ts-node").register({
project: "test/tsconfig.json",
});
我将 test/mocha.opts
编辑为:
--require test/tshook.js
test/**/*.ts
这应该会将所需的设置传递给 ts-node
:
require("ts-node").register({
compilerOptions: {
module: "commonjs",
},
});
需要通过TS_NODE_COMPILER_OPTIONS
环境变量进行配置
Unix 机器上的示例代码:
TS_NODE_COMPILER_OPTIONS='{"module":"commonjs"}' \
mocha --require ts-node/register 'test/**/*.spec.{ts,tsx}'
中提取的解释
CLI 和编程选项
括号中表示的环境变量。
-T, --transpile-only
使用 TypeScript 更快的 transpileModule(TS_NODE_TRANSPILE_ONLY
,默认值:false)
-I, --ignore [pattern]
覆盖路径模式以跳过编译(TS_NODE_IGNORE
,默认值:/node_modules/)
-P, --project [path]
TypeScript 的路径 JSON 项目文件 (TS_NODE_PROJECT
)
-C, --compiler [name]
指定自定义 TypeScript 编译器(TS_NODE_COMPILER
,默认值:typescript)
-D, --ignore-diagnostics [code]
忽略诊断代码的 TypeScript 警告 (TS_NODE_IGNORE_DIAGNOSTICS
)
-O, --compiler-options [opts]
JSON 要与编译器选项合并的对象 (TS_NODE_COMPILER_OPTIONS
)
--files
启动时从 tsconfig.json 加载文件(TS_NODE_FILES
,默认值:false)
--pretty
使用漂亮的诊断格式化程序(TS_NODE_PRETTY
,默认值:false)
--skip-project
跳过项目配置解析和加载(TS_NODE_SKIP_PROJECT
,默认值:false)
--skip-ignore
跳过忽略检查(TS_NODE_SKIP_IGNORE
,默认值:false)
--log-error
记录类型错误而不是退出进程(TS_NODE_LOG_ERROR
,默认值:false)
--prefer-ts-exts
重新排序文件扩展名,以便首选 TypeScript 导入(TS_NODE_PREFER_TS_EXTS
,默认值:false)
在 package.json - 脚本部分:
"test": "TS_NODE_PROJECT=src mocha"
在我的项目的 src 目录中获取我的 tsconfig.json,覆盖默认的 tsconfig.json。
OP 可以通过使用 test 而不是 src 来实现同样的效果
这对我有用 windows
set TS_NODE_COMPILER_OPTIONS={\"module\":\"commonjs\"} && mocha -r ts-node/register test/unit/*.test.ts
这是促使我使用该解决方案的错误
(function (exports, require, module, __filename, __dirname) { import 'mocha';
TypeScript 允许您覆盖配置文件。而不是像其他解决方案中提到的那样在环境变量中 hard-code JSON ,而是在环境中指定覆盖的配置路径。 TS_NODE_PROJECT
环境变量可用于此。
TS_NODE_PROJECT='./tsconfig.commonjs.json'
因此,如果您的主要配置是:
tsconfig.json
{
"compilerOptions": {
"target": "esnext",
"module": "esnext",
}
}
您可以创建另一个覆盖 module
设置的配置。
tsconfig.commonjs.json
{
"extends": "./tsconfig.json",
"compilerOptions": {
"module": "commonjs"
}
}
当你 运行 mocha 时,指定要使用的覆盖配置:
"test": "TS_NODE_PROJECT='./tsconfig.commonjs.json' mocha -r ts-node/register test/**/*.spec.ts*"
这使得进一步自定义您的 tsconfig
变得非常容易,仅用于 mocha 测试。您甚至可以 运行 ts-node
(mocha 之外)直接指定该路径:
ts-node -P tsconfig.commonjs.json -r myFile.ts
在 mac
"test": "TS_NODE_COMPILER_OPTIONS='{\"module\":\"commonjs\"}' mocha --require ts-node/register test/**/*.ts",
你也可以使用 ts-mocha (https://www.npmjs.com/package/ts-mocha)
例子
package.json
"test": "ts-mocha -p test/tsconfig.cjs.json test/**/*.test.ts"
test/tsconfig.cjs.json
{
"extends": "../tsconfig.json",
"compilerOptions": {
"module": "commonjs"
}
}
虽然似乎没有统一的 linux/windows 命令行措辞有效,但您可以从命令行设置 compiler-options
。就我而言,就像 OP 一样,我有一个 tsconfig.json
和一个 module: esnext
。我能够在命令行上覆盖:
运行 在 Windows 上,w/ts-node
全局安装,但在不同的 shell 类型中:
bash/mingw64:
ts-node --compiler-options={"module":"commonJS"} xxx.ts
cmd:
ts-node --compiler-options={\"module\":\"commonJS\"} xxx.ts
是否可以覆盖从 mocha 调用时 tsconfig.json
ts-node 使用的哪个?
我的主要 tsconfig.json
包含 "module": "es2015"
,但我只想将 "module": "commonjs"
用于 ts-node。
我试过了
mocha --compilers ts:ts-node/register,tsx:ts-node/register \
--compilerOptions '{"module":"commonjs"}' \
--require ts-node/register test/**/*.spec.ts*
但是没有用:
SyntaxError: Unexpected token import
at exports.runInThisContext (vm.js:53:16)
at Module._compile (module.js:387:25)
at Module.m._compile (/usr/lib/node_modules/ts-node/src/index.ts:406:23)
at Module._extensions..js (module.js:422:10)
at Object.require.extensions.(anonymous function) [as .tsx] (/usr/lib/node_modules/ts-node/src/index.ts:409:12)
at Module.load (module.js:357:32)
at Function.Module._load (module.js:314:12)
at Module.require (module.js:367:17)
at require (internal/module.js:16:19)
at /usr/lib/node_modules/mocha/lib/mocha.js:222:27
at Array.forEach (native)
at Mocha.loadFiles (/usr/lib/node_modules/mocha/lib/mocha.js:219:14)
at Mocha.run (/usr/lib/node_modules/mocha/lib/mocha.js:487:10)
at Object.<anonymous> (/usr/lib/node_modules/mocha/bin/_mocha:458:18)
at Module._compile (module.js:413:34)
at Object.Module._extensions..js (module.js:422:10)
at Module.load (module.js:357:32)
at Function.Module._load (module.js:314:12)
at Function.Module.runMain (module.js:447:10)
at startup (node.js:146:18)
at node.js:404:3
--compilerOptions
不会工作。
您需要做的是自定义您的注册方式ts-node
。我的情况与您的情况有点不同,我希望它使用 test/tsconfig.json
,其中包含我的测试代码所需的设置。如果我只是使用 --require ts-node/register
,它使用的默认配置不包含 运行 我的测试所需的设置。
我所做的是:
创建文件
test/tshook.js
。它包含:require("ts-node").register({ project: "test/tsconfig.json", });
我将
test/mocha.opts
编辑为:--require test/tshook.js test/**/*.ts
这应该会将所需的设置传递给 ts-node
:
require("ts-node").register({
compilerOptions: {
module: "commonjs",
},
});
需要通过TS_NODE_COMPILER_OPTIONS
环境变量进行配置
Unix 机器上的示例代码:
TS_NODE_COMPILER_OPTIONS='{"module":"commonjs"}' \
mocha --require ts-node/register 'test/**/*.spec.{ts,tsx}'
中提取的解释
CLI 和编程选项
括号中表示的环境变量。
-T, --transpile-only
使用 TypeScript 更快的 transpileModule(TS_NODE_TRANSPILE_ONLY
,默认值:false)-I, --ignore [pattern]
覆盖路径模式以跳过编译(TS_NODE_IGNORE
,默认值:/node_modules/)-P, --project [path]
TypeScript 的路径 JSON 项目文件 (TS_NODE_PROJECT
)-C, --compiler [name]
指定自定义 TypeScript 编译器(TS_NODE_COMPILER
,默认值:typescript)-D, --ignore-diagnostics [code]
忽略诊断代码的 TypeScript 警告 (TS_NODE_IGNORE_DIAGNOSTICS
)-O, --compiler-options [opts]
JSON 要与编译器选项合并的对象 (TS_NODE_COMPILER_OPTIONS
)--files
启动时从 tsconfig.json 加载文件(TS_NODE_FILES
,默认值:false)--pretty
使用漂亮的诊断格式化程序(TS_NODE_PRETTY
,默认值:false)--skip-project
跳过项目配置解析和加载(TS_NODE_SKIP_PROJECT
,默认值:false)--skip-ignore
跳过忽略检查(TS_NODE_SKIP_IGNORE
,默认值:false)--log-error
记录类型错误而不是退出进程(TS_NODE_LOG_ERROR
,默认值:false)--prefer-ts-exts
重新排序文件扩展名,以便首选 TypeScript 导入(TS_NODE_PREFER_TS_EXTS
,默认值:false)
在 package.json - 脚本部分:
"test": "TS_NODE_PROJECT=src mocha"
在我的项目的 src 目录中获取我的 tsconfig.json,覆盖默认的 tsconfig.json。
OP 可以通过使用 test 而不是 src 来实现同样的效果
这对我有用 windows
set TS_NODE_COMPILER_OPTIONS={\"module\":\"commonjs\"} && mocha -r ts-node/register test/unit/*.test.ts
这是促使我使用该解决方案的错误
(function (exports, require, module, __filename, __dirname) { import 'mocha';
TypeScript 允许您覆盖配置文件。而不是像其他解决方案中提到的那样在环境变量中 hard-code JSON ,而是在环境中指定覆盖的配置路径。 TS_NODE_PROJECT
环境变量可用于此。
TS_NODE_PROJECT='./tsconfig.commonjs.json'
因此,如果您的主要配置是:
tsconfig.json
{
"compilerOptions": {
"target": "esnext",
"module": "esnext",
}
}
您可以创建另一个覆盖 module
设置的配置。
tsconfig.commonjs.json
{
"extends": "./tsconfig.json",
"compilerOptions": {
"module": "commonjs"
}
}
当你 运行 mocha 时,指定要使用的覆盖配置:
"test": "TS_NODE_PROJECT='./tsconfig.commonjs.json' mocha -r ts-node/register test/**/*.spec.ts*"
这使得进一步自定义您的 tsconfig
变得非常容易,仅用于 mocha 测试。您甚至可以 运行 ts-node
(mocha 之外)直接指定该路径:
ts-node -P tsconfig.commonjs.json -r myFile.ts
在 mac
"test": "TS_NODE_COMPILER_OPTIONS='{\"module\":\"commonjs\"}' mocha --require ts-node/register test/**/*.ts",
你也可以使用 ts-mocha (https://www.npmjs.com/package/ts-mocha)
例子
package.json
"test": "ts-mocha -p test/tsconfig.cjs.json test/**/*.test.ts"
test/tsconfig.cjs.json
{
"extends": "../tsconfig.json",
"compilerOptions": {
"module": "commonjs"
}
}
虽然似乎没有统一的 linux/windows 命令行措辞有效,但您可以从命令行设置 compiler-options
。就我而言,就像 OP 一样,我有一个 tsconfig.json
和一个 module: esnext
。我能够在命令行上覆盖:
运行 在 Windows 上,w/ts-node
全局安装,但在不同的 shell 类型中:
bash/mingw64:
ts-node --compiler-options={"module":"commonJS"} xxx.ts
cmd:
ts-node --compiler-options={\"module\":\"commonJS\"} xxx.ts