我正在为 VS Code 开发一个扩展,并针对该扩展使用的对象编写一些测试。这些测试在 VS Code 中成功运行。但是,我也希望它们作为我的 CI 构建的一部分运行,我通过 gulp 来实现。我有一个使用“gulp mocha”来运行测试的 gulp 任务。这些测试将通过 gulp 成功运行,直到我引入一个类,该类在模块引用的传递闭包的任何地方都引入了“vscode”。
我的 gulp 输出如下:
[13:29:03] Starting 'test'...
[13:29:03] { [Error: Cannot find module 'vscode']
code: 'MODULE_NOT_FOUND',
name: 'Error',
message: 'Cannot find module \'vscode\'',
stack: 'Error: Cannot find module \'vscode\'\n at
Function.Module._resolveFilename (module.js:325:15)\n at
Function.Module._load (module.js:276:25)\n at Module.require
(module.js:353:17)\n at require (internal/module.js:12:17)\n at
Object.<anonymous> (C:\\vsts-vscode\\out\\src\\helpers\\settings.js:6:18)\n
at Module._compile (module.js:397:26)\n at
Object.Module._extensions..js
(module.js:404:10)\n at Module.load (module.js:343:32)\n at
Function.Module._load (module.js:300:12)\n at Module.require (module.js:353:17)',
showStack: true,
showProperties: true,
plugin: 'gulp-mocha' }
[13:29:03] 'test' errored after 212 ms
[13:29:03] Error in plugin 'gulp-mocha'
Message:
Cannot find module 'vscode'
Details:
code: MODULE_NOT_FOUND
Stack:
Error: Cannot find module 'vscode'
at Function.Module._resolveFilename (module.js:325:15)
at Function.Module._load (module.js:276:25)
at Module.require (module.js:353:17)
at require (internal/module.js:12:17)
at Object.<anonymous> (**C:\vsts-vscode\out\src\helpers\settings.js:6:18**)
at Module._compile (module.js:397:26)
at Object.Module._extensions..js (module.js:404:10)
at Module.load (module.js:343:32)
at Function.Module._load (module.js:300:12)
at Module.require (module.js:353:17)
在调用堆栈中,有对src\helpers\settings.js:6:18的引用。在那个位置是这样的声明:
const vscode_1 = require("vscode");
在我的打字稿源中,即:
import { workspace } from "vscode";
如果我只是删除引入我在 settings.js 中使用的命名空间的 import 语句,测试就会成功运行。
在阅读了有关 node.js 模块解析的文档(https://nodejs.org/api/modules.html#modules_all_together)之后,我可以理解为什么我会得到 MODULE_NOT_FOUND。由于“vscode”不是核心模块,也不是相对引用(“.”、“/”、“../”),节点将查找 package.json 文件。假设它找到它(procmon 告诉我它找到了),它会寻找一个“主”字段。我猜,在这一点上,它没有找到“主要”字段并且无法解决。
据推测,在 VS Code 中运行测试时(工作正常),解决方案还包括定位类型文件(http://www.typescriptlang.org/docs/handbook/module-resolution.html),因此是成功的。
我想不通的是,当我通过 gulp 运行测试时,我可以做些什么来解决对“vscode”的引用。
有什么想法吗?