【发布时间】:2020-12-17 09:43:12
【问题描述】:
我正在编写和 vscode 扩展,我需要工作区中的测试文件列表。
要查找测试文件,我使用来自 jest.config.js 的默认 testMatch,即:
[
'**/__tests__/**/*.[jt]s?(x)',
'**/?(*.)+(spec|test).[jt]s?(x)'
]
我的问题是vscode.workspace.findFiles 返回空数组,我无法设置它以获得正确的结果,但使用Glob 包输出是正确的。
protected async findTestFiles(
matchTestsGlobPatterns: string[]
): Promise<vscode.Uri[]> {
const testFilesUris: vscode.Uri[] = [];
const glob_testFilesUris: vscode.Uri[] = [];
const { name: workspaceName, workspaceFolders } = vscode.workspace;
if (workspaceName === undefined || workspaceFolders === undefined) {
throw new Error(`No active workspace${!workspaceFolders ? ' folders' : ''}.`);
}
for (let folderIdx = 0; folderIdx < workspaceFolders.length; folderIdx++) {
const folder = workspaceFolders[folderIdx];
// - by vscode.workspace.findFiles
for (let patternIdx = 0; patternIdx < matchTestsGlobPatterns.length; patternIdx++) {
const currentPattern = matchTestsGlobPatterns[patternIdx];
const pattern = new vscode.RelativePattern(
folder.uri.fsPath,
currentPattern
);
const files = await vscode.workspace.findFiles(
pattern,
'**/node_modules/**'
);
testFilesUris.push(...files);
}
console.log('by [vscode.workspace.findFiles]', testFilesUris.length);
// - by npm Glob
var glob = require('glob');
for (let patternIdx = 0; patternIdx < matchTestsGlobPatterns.length; patternIdx++) {
const currentPattern = matchTestsGlobPatterns[patternIdx];
const files: any[] = await new Promise((resolve, reject) => {
glob(
currentPattern,
{
absolute: true,
cwd: folder.uri.fsPath,
ignore: ['**/node_modules/**']
},
function (err: Error, files: any[]) {
if (err) {
return reject(err);
}
resolve(files);
}
);
});
glob_testFilesUris.push(...files);
}
console.log('by [npm Glob]', glob_testFilesUris.length);
}
// @todo: remove duplicates.
return testFilesUris;
}
此函数在某些项目中的示例控制台输出为:
by [vscode.workspace.findFiles] 0
by [npm Glob] 45
项目结构:
rootFolder
src
__tests__
files.test.ts
...
utils
array.test.ts
...
所以我的问题是如何调用vscode.workspace.findFiles 以获得正确的结果,或者这个函数是否存在已知问题?
我已经找到了这个问题的某种答案。
问题是模式中的?(x)。 vscode.workspace.findFiles 不像其他包那样使用这种模式。如果从提到的 glob 模式中删除它,它们会起作用,除了 .jsx | .tsx 文件被省略。
【问题讨论】:
标签: file visual-studio-code jestjs glob vscode-extensions