@ 受影响/ 行走者
径向作为效果原始. Walker.ascend 从起始路径到文件系统根的目录链; Walker.findUpward 返回每个目录候选人中最近的现有文件; Walker.findRoot 返回标记上游接受的最近目录。 每个探测器都吸收自己的故障 所以一个无法读取的祖先 无法隐藏一个有效的 .git 或者说 pnpm-workspace.yaml {\fn华文仿宋\fs16\1cHD1D1D1}在它上面 向另一边走, descend 扩展编译 @effected/glob 模式在目录下输入匹配的文件路径 —— 排序, symlink- safe, 并键入不可读子树而非默默吞入. FileSystem 财务报告和审定财务报表 Path 从 effect 核心,所以没有任何平台包被拉入——即使在测试中也是如此.
预
1.0.0。 。 。 . 此软件包是@effected/*在稳定基础上建造的工具包 效应v4(effect~4.1.0) 并仍在0.x发展。 稳定效果 制作一个工具箱1.0.0可能,不是自动的。 为了保持你的effect财务报告和审定财务报表@effect/*该工具包在线上构建和测试、安装@effected/pnpm-plugin-effected。 。 。 .稳定:不稳定. 此软件包的 API 表面尚未考虑 完成并可能改变
0.x释放 定一个确切的版本——甚至 标记软件包 稳定 在此之前1.0.0可以引入突破性更改 和精确的针 变成一个类型检查错误 而不是一个 跑步时间惊喜。 完全政策: 释放策略。 。 。 .
为什么
向上走走的目录树看起来像四行代码,直到遇到边缘,边缘是手卷版悄悄地弄错了的地方. 如果对一个祖先的探测器失败了.. EACCES 在一个目录上,你根本没有商业读取——天真循环传播了这个错误,整个搜索失败了,所以一个无法读取的目录隐藏了坐在它上面一个关卡上的工作空间根. 沃克单独吸收了每个探测器:一个失败的探测器意味着"这个候选者不匹配",从不"破坏扫描". 每个向上错误通道都是 never 因此,贸易被放在前面,而不是在后面发现——没有发现和无法看是故意无法区分的,因为发现是最佳的。 向下行走会故意打出相反的呼声:在 glob 扩展过程中一个无法读取的子树默认会键入,因为"没有匹配的地方"会是一个穿成空的错答案.
其他边缘得到同样的治疗. 吸收用途 Effect.catch,它捕捉失败而不是缺陷, 所以一个前提 掷出 仍然是程序员错误, 并且仍然是表面. findUpward 扫描目录 - major —— 最近的目录中每个候选人在升起前都用尽了—— 如此遥远的祖先 .apprc 永远打不赢近一点 config/.apprc。 。 。 . maxDepth 必须是正整数 : NaN, (中文(简体) ), 2.5 财务报告和审定财务报表 0 是一种缺陷,而不是一个沉默的空链, 这是一种完全像“什么都没有发现”的失败模式。 还有 start 需要——行走者从不读 process.cwd() 代表你们.
安装
npm install @effected/walker effect
pnpm add @effected/walker effect
需要节点.js~~24.11.0. effect 页:1 @effected/glob 是同行的依赖关系——行走者没有自己的运行时间依赖关系,而glob对等者作为类型加消耗 matches() 只有电话.
全体 @effected/* 软件包仅为无害环境管理:只公布出口地图 import 条件,所以 require() 包括解析 CJS 模式的工具 —— 与节点失败 ERR_PACKAGE_PATH_NOT_EXPORTED 而不是装入不存在的 CJS 建筑。 从ES模块导入.
Path 财务报告和审定财务报表 FileSystem 来自 effect 核心,而不是从一个平台包,所以消费者在边缘提供它们一次(@effect/platform-node 在节点上, @effect/platform-bun 测试提供了核心 Path.layer 外加来自 @effected/memfs ——未安装平台软件包.
快开始
从目录中调出, 然后在链条的每一行中查找一个文件 :
import { Walker } from "@effected/walker";
import * as NodeFileSystem from "@effect/platform-node/NodeFileSystem";
import * as NodePath from "@effect/platform-node/NodePath";
import { Effect, Layer, Option, Path } from "effect";
const findConfig = Effect.gen(function* () {
const path = yield* Path.Path;
const dirs = yield* Walker.ascend(process.cwd());
return yield* Walker.findUpward(dirs, (dir) => [path.join(dir, ".apprc")]);
});
const PlatformLive = Layer.mergeAll(NodeFileSystem.layer, NodePath.layer);
Effect.runPromise(findConfig.pipe(Effect.provide(PlatformLive))).then((found) => console.log(Option.getOrNull(found)));
// the path of the nearest ".apprc" at or above the cwd, e.g. "/home/you/project/.apprc"
// null when no ancestor had one — or when the one that did could not be read
findRoot 在目录本身上是同一个回路,有一个标记上方而不是一个文件名:
import { Walker } from "@effected/walker";
import { Effect, FileSystem, Path } from "effect";
const findGitRoot = Effect.gen(function* () {
const fs = yield* FileSystem.FileSystem;
const path = yield* Path.Path;
const dirs = yield* Walker.ascend(process.cwd());
return yield* Walker.findRoot(dirs, (dir) => fs.exists(path.join(dir, ".git")));
});
// Effect<Option<string>, never, FileSystem | Path> — the predicate's failures are absorbed per directory
上游可能很昂贵 package.json 来决定一个目录是否是工作空间根,比如——因为扫描在第一次匹配时的短路,而从未探测到其他的.
特征
向上走着 Walker 分类为静态;向下行走是两个独立的函数. 并肩进口——没有 Walker.descend数字 :
import { Walker, compileAndExpand, descend } from "@effected/walker";
Walker.ascend(start, options?)——目录链从start向文件系统根,最接近的第一.stopAt全面停止上升——它必须是绝对的,并以正常化的形式进行配对,因此是后向分离器或.编号 :..片段仍然停留在它命名的地方;相对的上限是一个缺陷,而不是根据工作目录来解决,完全是一个无效的maxDepth没错.maxDepth(默认 256) 封住链条。 外观,而非物理:Path.dirname不解析相链接,所以从相链接目录中升出遵循您给定的路径.Walker.ascendWithin(start, ceiling, options?)—— 说ascend以物理天花板为界,作为Option<string>故无所限制之行,只被明确要求Option.none()行为就像ascend(start),任何寄存器外的答案 : 它停留在最接近的目录中,其真实路径是天花板的真实路径. 当天花板解决了连锁问题时Git.repoRoot这样做——因为ascend词典stopAt永远不要匹配这样的天花板, 从开始通过同义链接到达( 每个 macOS tmpdir, 任何同义连接的检查) , 并且升空运行到文件系统根 。 链条保持了通俗性;一个天花板 链条已经花费了I/O, 和一个祖先realPath失败被吸收为"不是天花板".Walker.firstMatch(candidates, predicate)——第一位被上游人接受的候选人. 在第一次比赛中,每个上游故障都单独吸附和短路.Walker.findUpward(dirs, candidatesFor)——第一个已存在的路径,目录-major:在升起之前,对最近的目录中的每一个候选者进行尝试.Walker.findRoot(dirs, isRoot)——标记上方接受的最近的目录.firstMatch其中,候选人扩展是身份.descend(pattern, options)——编译的文件路径@effected/glob样式选择cwd,POSIX分离器,排序.onUnreadable决定不可读目录的中行道含义:"fail"升起一个已键入DescendError, (中文(简体) ),"skip"继续过去,忘记它"record"继续通过并返回 aDescendResult—— 说{ matches, unreadable }中,每个UnreadableDirectory带有目录的cwd-关系path编辑PlatformError它失败了, 因此一个报告从不需要重新读取目录来了解原因 。 步行基地的记录是path: ""和一个消失的目录NotFound)是一种良性种族,从未被记录.followSymlinks(默认)false决定对称目录:默认情况下,它们从未输入(周期安全)true他们降入@actions/glob是因为traversalChain循环守护(cycle guard)——一个目录只有在其真实路径已经是当前分支的祖先时才是一个循环,所以链接循环终止,同时两个兄弟姐妹的链接同时解决同一个目标;一个无法解决的真实路径的链接永远不会被输入,失败随之而来onUnreadable完全如不可读目录所做的——匹配@actions/glob默认followSymbolicLinks: true(节点的回转)readdir也跟随链接,但不会使回路链和回路不绑定.descend只读匹配的目录。 没有巨星,它永远读不深 比图案的片段可以到达,所以packages/*/README.md读取packages和每个packages/<name>下层无物dot: false除非图案名称中的一段,否则它不会输入隐藏目录。 约束都没有改变什么匹配,和maxDepth仅适用于实际读取的目录.Walker.findUpwardSyncWith(dirs, accept, options?)—— 最近的目录dirs那个accept取( 取)accept回答一个Option),用它所回答的价值,或Option.none()它向上搜索并验证它发现的东西,同步:accept读取和解析package.json和答案Option.none()对于缺失或畸形的,找到最近的 无效 显出. 拿着dirs从ascendSync, (中文(简体) ),ascendWithinSync或者说ascendToMarkerSync因此,它停止他们停止的地方.options.cache联合国Map<string, Option<A>>,或任何与它的get财务报告和审定财务报表set)回忆每个目录的答案,包括拒绝,所以一个热道会询问每个祖先一次;它无效是呼叫者的工作.Walker.findUpwardWith(dirs, accept, options?)—— 说findUpwardSyncWith和有效果的accept(单位:千美元)dir => Effect<Option<A>, E, R>在铁链上ascend, (中文(简体) ),ascendWithin财务报告和审定财务报表ascendToMarker给。 同样的扫描,同样的options.cache失败accept失败搜索并缓存目录中的任何内容; 在内部恢复accept将失败的读取为“无效”.WalkerSyncFileSystem.readFile(path)——同步端口也读取文件,作为UTF-8文本(readFileSync(path, "utf8")内nodeWalkerFileSystem,和什么样的@effected/memfs手柄sync端口答案),所以代码行走然后读取它发现的东西需要一个端口.PosixPath—— POSIX 路径算术作为从未读取工作目录的平面同步函数:join, (中文(简体) ),normalize, (中文(简体) ),relative, (中文(简体) ),dirname, (中文(简体) ),basename, (中文(简体) ),extname, (中文(简体) ),isAbsolute财务报告和审定财务报表sep从POSIX执行中移植到核心Path.layer并给出答案。 没有resolve。 。 。 .relative如核心一样回答两条绝对路径,当答案不依赖于工作目录的名称时回答两条相对路径;否则会丢出. 以无法设置的纯码获取Path内R; 保留Path内R只要平台选择 POSIX 或 win32 .compileAndExpand(pattern, options)—— 说descend从光彩中 字符串: 将其编译为@effected/glob(单位:千美元)options.glob)并扩展它,失败时键入GlobExpansionError当模式不编译时.confineRelativeResult(base, candidate)——保留不可信相对路径(存档条目,表资产路径)下base,同步,作为一个Result<string, PathEscapeError>两者/财务报告和审定财务报表\是分隔符; NUL 字符,绝对形式( POSIX)/x页:1\\server\share,赢32C:\x或者说C:x页:1..攀登到顶端base常态化后( e)og/../x没事,og/../../x不是)一条路径命名base本身("", (中文(简体) ),., (中文(简体) ),og/..部分赢32的储备(a):例如替代数据流、 点和空格、 设备名称等CON或者说nul.txt)被拒绝,有错误的原因。 语言学和 IO 无分数解码;成功值是base与正态路径合并。 共通语已超出范围:检查语法.confineRelative(base, candidate)这是Effect双胞胎.