是否可以覆盖从mocha调用时tsconfig.json
个ts节点使用的哪个?
我的主要tsconfig.json
包含"module": "es2015"
,但我想仅将"module": "commonjs"
用于ts节点。
我试过这个
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
答案 0 :(得分:31)
您需要通过TS_NODE_COMPILER_OPTIONS
环境变量
unix机器上的示例代码:
TS_NODE_COMPILER_OPTIONS='{"module":"commonjs"}' \
mocha --require ts-node/register 'test/**/*.spec.{ts,tsx}'
中提取的说明
CLI和程序化选项
括号中表示的环境变量。
--typeCheck
启用TypeScript(TS_NODE_TYPE_CHECK
)--cacheDirectory
配置输出文件缓存目录(TS_NODE_CACHE_DIRECTORY
)-I, --ignore [pattern]
覆盖路径模式以跳过编译(TS_NODE_IGNORE
)-P, --project [path]
TypeScript JSON项目文件(TS_NODE_PROJECT
)-C, --compiler [name]
指定自定义TypeScript编译器(TS_NODE_COMPILER
)-D, --ignoreDiagnostics [code]
按诊断代码(TS_NODE_IGNORE_DIAGNOSTICS
)-O, --compilerOptions [opts]
要与编译器选项(TS_NODE_COMPILER_OPTIONS
)--no-cache
禁用本地TypeScript节点缓存(TS_NODE_CACHE
)--skip-project
跳过项目配置解析和加载(TS_NODE_SKIP_PROJECT
)--skip-ignore
跳过忽略检查(TS_NODE_SKIP_IGNORE
)答案 1 :(得分:13)
--compilerOptions
不会&#39;工作。
您需要做的是自定义注册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",
},
});
答案 2 :(得分:4)
在package.json - scripts部分:
"test": "TS_NODE_PROJECT=src mocha"
在项目的src目录中选取我的tsconfig.json,覆盖默认的tsconfig.json。
OP可以通过使用test而不是src来实现相同的功能
答案 3 :(得分:3)
虽然似乎没有统一的linux / windows命令行措辞有效,但是您可以从命令行设置compiler-options
。就我而言,就像OP,我有一个tsconfig.json
和一个module: esnext
。我能够在命令行中进行覆盖:
在Windows上运行,{/ {1}}已全局安装,但使用不同的外壳类型:
bash / mingw64:
ts-node
cmd:
ts-node --compiler-options={"module":"commonJS"} xxx.ts
答案 4 :(得分:2)
这在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';
答案 5 :(得分:1)
Typescript
允许您覆盖配置文件。而不是像其他解决方案中提到的那样在环境变量中对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
,指定该路径。
ts-node -P tsconfig.commonjs.json -r myFile.ts
答案 6 :(得分:0)
在Mac上
"test": "TS_NODE_COMPILER_OPTIONS='{\"module\":\"commonjs\"}' mocha --require ts-node/register test/**/*.ts",
答案 7 :(得分:0)
您还可以使用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"
}
}