如何让 TypeScript 编译器不发出目录结构

jsf*_*jsf 5 unit-testing build node.js typescript tsc

在我当前的 TypeScript 项目中,我有以下文件结构:

\n\n
project\n\xe2\x94\x9c\xe2\x94\x80app\n\xe2\x94\x82 \xe2\x94\x94\xe2\x94\x80index.html\n\xe2\x94\x9c\xe2\x94\x80test\n\xe2\x94\x94\xe2\x94\x80src\n  \xe2\x94\x9c\xe2\x94\x80app\n  \xe2\x94\x82 \xe2\x94\x9c\xe2\x94\x80tsconfig.json\n  \xe2\x94\x82 \xe2\x94\x94\xe2\x94\x80app.ts\n  \xe2\x94\x9c\xe2\x94\x80lib\n  \xe2\x94\x82 \xe2\x94\x94\xe2\x94\x80lib.ts\n  \xe2\x94\x94\xe2\x94\x80test\n    \xe2\x94\x9c\xe2\x94\x80tsconfig.json\n    \xe2\x94\x94\xe2\x94\x80test.ts\n
Run Code Online (Sandbox Code Playgroud)\n\n

我想要实现的是,在编译该项目时,app生成test的文件结构如下所示:

\n\n
project\n\xe2\x94\x9c\xe2\x94\x80app\n\xe2\x94\x82 \xe2\x94\x9c\xe2\x94\x80index.html\n\xe2\x94\x82 \xe2\x94\x94\xe2\x94\x80app.js\n\xe2\x94\x9c\xe2\x94\x80test\n\xe2\x94\x82 \xe2\x94\x9c\xe2\x94\x80lib\n\xe2\x94\x82 \xe2\x94\x82 \xe2\x94\x94\xe2\x94\x80lib.js\n\xe2\x94\x82 \xe2\x94\x94\xe2\x94\x80test.js\n\xe2\x94\x94\xe2\x94\x80src\n  \xe2\x94\x94\xe2\x94\x80...\n
Run Code Online (Sandbox Code Playgroud)\n\n

或这个:

\n\n
project\n\xe2\x94\x9c\xe2\x94\x80app\n\xe2\x94\x82 \xe2\x94\x9c\xe2\x94\x80index.html\n\xe2\x94\x82 \xe2\x94\x94\xe2\x94\x80app.js\n\xe2\x94\x9c\xe2\x94\x80test\n\xe2\x94\x82 \xe2\x94\x9c\xe2\x94\x80lib.js\n\xe2\x94\x82 \xe2\x94\x94\xe2\x94\x80test.js\n\xe2\x94\x94\xe2\x94\x80src\n  \xe2\x94\x94\xe2\x94\x80...\n
Run Code Online (Sandbox Code Playgroud)\n\n

我有一个位于 lib 目录中的库。它由 app.ts 使用,然后在网页上使用。测试位于测试目录中。我实际得到的是:

\n\n
project\n\xe2\x94\x9c\xe2\x94\x80app\n\xe2\x94\x82 \xe2\x94\x9c\xe2\x94\x80index.html\n\xe2\x94\x82 \xe2\x94\x94\xe2\x94\x80app.js\n\xe2\x94\x9c\xe2\x94\x80test\n\xe2\x94\x82 \xe2\x94\x9c\xe2\x94\x80lib\n\xe2\x94\x82 \xe2\x94\x82 \xe2\x94\x94\xe2\x94\x80lib.js\n\xe2\x94\x82 \xe2\x94\x94\xe2\x94\x80test\n\xe2\x94\x82   \xe2\x94\x94\xe2\x94\x80test.js\n\xe2\x94\x94\xe2\x94\x80src\n  \xe2\x94\x94\xe2\x94\x80...\n
Run Code Online (Sandbox Code Playgroud)\n\n

注意额外的test- 目录。

\n\n

-文件src/test/tsconfig.json如下所示:

\n\n
{\n    "compileOnSave": true,\n    "compilerOptions": {\n        "target": "es2016",\n        "lib": [\n            "dom",\n            "es2016"\n        ],\n        "outDir": "../../test",\n        "noImplicitAny": true,\n        "noImplicitThis": true,\n        "noImplicitReturns": true,\n        "module": "commonjs"\n    },\n    "files": [\n        "test.ts"\n    ]\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

因为我想使用 node.js 在我的机器上执行这些测试,所以我必须选择commonjs作为模块系统。这不会像amd-module 系统那样合并所有 TypeScript 模块。据我了解,它tsc搜索所有涉及模块的第一个公共父目录,并将其作为输出的基目录。该公共目录就是src为什么输出目录中存在额外级别的目录的原因。

\n\n

所以我的问题是:\n如何告诉 TypeScript 编译器用作src/test输出的根目录,以便将其test.js放入test/test.js而不是放入test/test/test.js

\n\n

设置"rootDir": "./"不起作用,因为编译器会输出错误:

\n\n
error TS6059: File \'[...]/lib/lib.ts\' is not under \'rootDir\' \'[...]/src/test/\'. \'rootDir\' is expected to contain all source files.\n
Run Code Online (Sandbox Code Playgroud)\n