@effected/walker

中文文档
0.29.0发布于 2026/11/13MITTypeScriptES Module零依赖构建来源已验证近 30 天下载 1.3万

路径为 Effect 原始: 将目录链提升到第一个匹配对象, 或降下树向文件系统扩展 glob .

中文使用文档
文档目录5 节
  1. 为什么
  2. 安装
  3. 快开始
  4. 特征
  5. 许可证

@ 受影响/ 行走者

npm License: MIT Node.js %3E%3D24.11.0 TypeScript 7.0

径向作为效果原始. 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" 继续通过并返回 a DescendResult —— 说 { 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,赢32 C:\x 或者说 C:x页:1 .. 攀登到顶端 base 常态化后( e)og/../x 没事, og/../../x 不是)一条路径命名 base 本身("", (中文(简体) ), ., (中文(简体) ), og/..部分赢32的储备(a) : 例如替代数据流、 点和空格、 设备名称等 CON 或者说 nul.txt)被拒绝,有错误的原因。 语言学和 IO 无分数解码;成功值是 base 与正态路径合并。 共通语已超出范围:检查语法. confineRelative(base, candidate) 这是 Effect 双胞胎.

许可证

麻省理工学院

版本与发布记录

@effected/walker 共发布 40 个版本,首次发布于 2026/07/17;过去 12 个月发布了 40 个版本。最新版本附带 npm provenance 构建来源证明,可追溯到公开的 CI 构建记录。

版本发布日期距今
0.29.0latest2026/11/13今天
0.28.02026/11/112 天前
0.27.02026/11/102 天前
0.26.02026/11/094 天前
0.25.12026/11/067 天前
0.25.02026/11/0310 天前

关于 @effected/walker 的常见问题

@effected/walker 是什么?

路径为 Effect 原始: 将目录链提升到第一个匹配对象, 或降下树向文件系统扩展 glob .

如何安装 @effected/walker?

在项目目录运行 npm install @effected/walker,或使用 pnpm add / yarn add / bun add。它还需要宿主项目提供 peer 依赖:effect(~4.1.0)、@effected/glob(^0.22.0)。npm 7 及以上与 pnpm 8 及以上默认会自动安装必需的 peer 依赖,Yarn 需要手动安装。

@effected/walker 支持 TypeScript 吗?

支持。包内自带 TypeScript 类型声明(package.json 声明了 types 入口),安装后即可获得类型提示,无需再安装 @types 包。

@effected/walker 支持 ESM 还是 CommonJS?

以 ES Module 形式发布,推荐使用 import 引入。在 CommonJS 项目中,Node.js 20.19+ / 22.12+ 可以直接 require() 不含顶层 await 的 ES Module,更早的版本需要改用动态 import()。

@effected/walker 需要什么版本的 Node.js?

package.json 的 engines 字段要求 Node.js >=24.11.0。版本不符时 npm 默认只给出警告,开启 engine-strict 后会拒绝安装。

@effected/walker 可以商用吗?

@effected/walker 使用 MIT 许可。宽松许可:允许商业使用、修改和再分发,通常只需在分发时保留原版权与许可声明。以上为概括,不构成法律意见,请以许可原文为准。

@effected/walker 的下载量有多少?

根据 npm 官方下载统计,@effected/walker 在 2026/10/13 – 2026/11/11 这 30 天内被下载 13,206 次,日均约 440 次。下载量会把 CI 构建、镜像同步和作为其他包依赖的安装一并计入,适合横向比较热度,不能直接等同于使用人数。

@effected/walker 还在维护吗?

最新版本 0.29.0 发布于 2026/11/13(今天);至今共发布 40 个版本,其中过去 12 个月发布了 40 个;首次发布于 2026/07/17。发布频率只是参考信号:功能稳定的工具可能很少需要更新,建议结合源码仓库的 issue 和提交记录判断。