vscode findFiles什么也不返回,但npm glob返回正确的结果



我正在编写一个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文件被提交外,其他包都可以使用。

在深入研究vscode github的问题后,我(在这里(了解到vscode.workspace.findFiles不支持像?(patterLike)这样的扩展模式