【问题标题】:vscode findFiles returns nothing but npm glob returns correct resultsvscode findFiles 什么都不返回,但 npm glob 返回正确的结果
【发布时间】: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


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-11-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-03
      • 2020-07-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多