node.js - 如何使用 findFiles 进行 globby
问题描述
findFiles 到底是什么?
它位于您未阅读的有关文件系统支持的 vscode API 文档中。
武器的选择
VS Code 是一个节点应用程序,扩展也是。每个人都知道这一点。因此,我们第一次需要操作文件时,我们 import fs
,这有效,我们尝试一些文件操作,这有效。在这一点上,我们祝贺自己和 VS Code 团队的技能转移,我们停止思考它,因为我们确切地知道如何做到这一点。
为什么会有人怀疑这个选择?从表面上看,Nodefs
是一个出色的解决方案。它有据可查、被广泛理解和跨平台。什么都不会出错。
一切都出错了
临时突变体,nos et mutamur。像 Docker 和 WSL 这样的东西意味着即使是单个主机上的 Windows 用户也很可能使用远程文件系统。但是 Node fs
,以及你的扩展,只知道它启动的文件系统。
您需要文件系统重定向。这意味着在另一端有一个代理,以及某种间接性,因此您可以使用哪种身份验证指定哪个主机上的哪个文件系统。一旦你开始思考这个问题,你就会想知道为什么 VS Code 团队不为他们自己使用的任何魔法发布 API。
vscode.Uri
还记得那些你必须拆开才能得到的烦人的东西fsPath
吗?所有文件系统 UI 交互事件返回的那些?他们有所有的元数据。
切入正题
如果您查看vscode.workspace.fs
("fs"?! 这是一条线索!) 您会发现它导出了读取和写入文件和目录所需的所有方法。所有这些方法都需要一个vscode.Uri
. 在这一点上,我希望你自己已经把这些点联系起来了。是的,大众的远程文件系统访问(如果您可以调用扩展编写者大众)。
你还没有回答这个问题,Pete:什么是 findFiles?
哦。出色地。好的。对,我希望你们都知道 globby 是什么以及它的用途。显然你不能在远程文件系统上使用它。你的扩展取决于它。猜猜这是干什么用的:
findFiles(
include: GlobPattern,
exclude?: GlobPattern | null,
maxResults?: number,
token?: CancellationToken
): Thenable<Uri[]>
那是远程文件系统的全局,你有什么问题?
我的问题是它需要一个模式,而不是像 globby 这样的模式数组。
虽然我可以通过逗号分隔模式并用花括号括起来来解决这个问题,这样{**/*.dll,**/*.exe}
当模式已经使用这种语法时就会分崩离析。你不能嵌套它。我的用户很可能想要使用类似的模式**/*.{exe,dll,pdb,hex,bin,pdf,png,jpg,jpeg,gif,pfx}
那你想要什么,皮特?
到目前为止,这只是你在炫耀。你希望得到什么答案?
好吧,显而易见的解决方案是将包含表达式的模式扩展为多个文字表达式,然后再将它们组合成一个非嵌套表达式。但这很无聊也很难。我讨厌写正则表达式。
或者也许没有必要,并且有一个我没有注意到的解决方案。我不知道。帮助!
解决方案
Node.js 的大括号扩展库已经存在。它的名字很神秘braces
,可以从 npm或其在 GitHub 上的存储库中获得。
它对一个字符串进行操作并返回一个字符串数组。它可以扩展递归大括号表达式,因此我的应用程序不需要循环。
const toxicExcludes = `{${excludes.join(",")}}`; // may contain nested braces
const safeExcludes = `{${braces.expand(toxicExcludes).join(",")}}`;
推荐阅读
- javascript - 将 js 对象转换为分层 JSON 结构
- regex - 从出现在特定单词之后的字符串中提取值
- c# - c sharp 类型模式导致编译器错误
- python - Python中的极坐标绘图(没有原点的圆弧)
- python - python - 惩罚游戏如何加速元素
- mysql - Prem MySQL 和 Azure 数据存储之间的数据同步
- android - 将最大视图的左侧与约束布局对齐
- python - Jupyter Notebook 将目录/文件路径添加到 Windows 环境变量
- scilab - 更改 SCILAB 中的输出格式
- asp.net - 如何从 ASP.NET 中的静态文件返回响应?