ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

Dagger TypeScript SDK 深入解析:HostFindUpOpts 类型与 Host.findUp 向上查找机制

Dagger TypeScript SDK 深入解析:HostFindUpOpts 类型与 Host.findUp 向上查找机制 Dagger TypeScript SDK 深入解析HostFindUpOpts 类型与 Host.findUp 向上查找机制【免费下载链接】daggerAutomation engine to build, test and ship any codebase. Runs locally, in CI, or directly in the cloud项目地址: https://gitcode.com/GitHub_Trending/da/dagger导读在 Dagger 自动化引擎中Host.findUp是面向宿主Host文件系统的重要能力从当前工作目录出发逐级向上层父目录搜索指定名称的文件或目录并返回其相对路径。本文以 TypeScript SDK 参考文档中的HostFindUpOpts类型为切入点完整梳理该选项对象的字段语义、findUp方法的行为约定并深入仓库源码剖析noCache参数的底层传递路径与目录向上查找算法的真实实现帮助开发者正确、高效地在模块中定位项目根目录、配置文件或标志文件。认识 HostFindUpOpts一个极简的选项对象在 Dagger 的 TypeScript SDK 中HostFindUpOpts被定义为一个object类型的 Type Alias其完整定义位于版本化 SDK 参考文档中结构与 sdk/typescript/src/api/client.gen.ts 中生成的类型声明完全一致export type HostFindUpOpts { noCache?: boolean }该类型是Host.findUp方法的可选参数opts?: HostFindUpOpts目前仅包含一个可选属性其含义如下属性类型必填说明noCacheboolean否为true时绕过缓存强制从宿主文件系统重新读取信息值得说明的是noCache是 Dagger Host 相关 API 中通用的缓存控制约定。在 SDK 源码中Host.file的选项类型 HostFileOpts 也声明了同名字段注释明确写道If true, the file will always be reloaded from the host.为true时该文件将始终从宿主重新加载。HostFindUpOpts沿用了同一语义因此可将其理解为跳过任何缓存结果直接向宿主文件系统发起一次真实的查找操作。findUp 方法用途、签名与返回约定HostFindUpOpts的唯一使用场景是Host.findUp方法。其 SDK 声明位于 sdk/typescript/src/api/client.gen.ts/** * Search for a file or directory by walking up the tree from system workdir. Return its relative path. If no match, return null * param name name of the file or directory to search for */ findUp async (name: string, opts?: HostFindUpOpts): Promisestring { if (this._findUp) { return this._findUp } const ctx this._ctx.select(findUp, { name, ...opts }) const response: Awaitedstring await ctx.execute() return response }从方法注释可以提炼出三条核心行为约定搜索方向从系统工作目录system workdir出发沿目录树向上walking up the tree逐级搜索入参name为要查找的文件或目录名称opts为可选的HostFindUpOpts配置返回值成功时返回找到项相对于工作目录的路径找不到时返回null。在 GraphQL 层findUp字段通过this._ctx.select(findUp, { name, ...opts })将name与全部选项含noCache作为参数下发最终执行查询并返回字符串结果。这一调用链在生成的 GraphQL 客户端中同样存在对应实现见 client.gen.ts 附近的同名方法。noCache 的底层传递路径从 TypeScript 到 GraphQL 参数noCache之所以能出现在HostFindUpOpts中根源于 Dagger 核心 schema 层的参数结构设计。在 core/schema/host.go 中定义了一个被多个 Host 操作复用的缓存配置结构体type HostDirCacheConfig struct { NoCache bool default:false }而findUp的 GraphQL 参数类型 hostFindUpArgs 正是通过内嵌embedding该结构体来声明参数的type hostFindUpArgs struct { Name string HostDirCacheConfig }这意味着findUp的 GraphQL 字段天然拥有两个入参namestring与noCacheboolean默认值为false。TypeScript 端的HostFindUpOpts正是对 GraphQL 层noCache入参的类型化封装——SDK 生成器把内嵌结构体展开为选项对象并标记为可选属性。HostDirCacheConfig还被 hostFileArgsfile操作以及hostDirectoryArgs等复用这解释了为何HostFileOpts与HostFindUpOpts拥有语义一致的noCache字段它们是同一套宿主管路缓存策略在不同 API 上的统一暴露。因此从实现角度看noCache控制的是整个宿主文件访问链路的缓存旁路行为而非findUp独有的逻辑。向上查找算法原理FindUp 与 FindUpAllfindUp的真正落地实现在核心层Host对象上。Dagger 将从当前目录向父目录逐级查找抽象为两个方法core/host.go 中的FindUp与 core/host.go 中的FindUpAll// find-up a given soughtName in curDirPath and its parent directories, // return the absolute path to the dir it was found in, if any func (Host) FindUp( ctx context.Context, statFS StatFS, curDirPath string, soughtName string, ) (string, bool, error) { found, err : Host{}.FindUpAll(ctx, statFS, curDirPath, map[string]struct{}{soughtName: {}}) if err ! nil { return , false, err } p, ok : found[soughtName] return p, ok, nil }其算法要点可以从注释与FindUpAll的实现归纳FindUp是单目标查找的便捷封装将单个soughtName包装成集合后委托给FindUpAllFindUpAll支持同时查找多个名称soughtNames map[string]struct{}返回名称 → 包含该名称项的目录绝对路径的映射查找过程从curDirPath开始每轮遍历所有待查名称通过StatFSExists检查filepath.Join(curDirPath, soughtName)是否存在命中即记录随后沿..向父目录推进直到抵达文件系统根目录该方法接受StatFS接口而非直接的文件系统句柄说明它可运行于抽象的文件系统之上在 schema 层实际传入的是core.NewCallerStatFS(bk)见 core/schema/host.go。在 GraphQL 层schema 的findUp处理器 core/schema/host.go 完成以下收尾工作取得当前查询上下文与引擎客户端获取当前工作目录的绝对路径cwd调用host.Self().FindUp(...)向上查找args.Name未命中时返回 GraphQLnull对应 TypeScript 侧的null返回值命中时将找到的目录绝对路径与name拼接再通过filepath.Rel(cwd, foundPath)转换为相对于工作目录的路径返回。这解释了 TypeScript API 注释中Return its relative path的由来——SDK 层拿到的是 schema 层已经完成相对化处理的路径字符串。实战示例定位项目根目录与配置文件结合上述行为约定HostFindUpOpts与findUp最常见的应用场景是在不预先知道仓库根目录绝对路径的情况下向上搜索标志文件来锚定项目边界。例如查找项目根目录下的go.mod或.git目录import { connect } from dagger.io/dagger connect(async (client) { // 从当前工作目录向上搜索 go.mod返回相对路径如 go.mod 或 ../go.mod const modPath await client.host().findUp(go.mod) console.log(go.mod 相对路径:, modPath) // 向上搜索 .git 目录 const gitDir await client.host().findUp(.git) console.log(.git 相对路径:, gitDir) // 若确保目录内容已被外部修改可显式关闭缓存 const fresh await client.host().findUp(dagger.json, { noCache: true }) console.log(dagger.json 相对路径:, fresh) })需要留意的边界行为若向上遍历到文件系统根目录仍未命中findUp返回nullTypeScript 签名中体现为Promisestring调用方需自行判空返回值是相对路径而非绝对路径且可能包含../前缀拼接使用时建议通过path.join或path.resolve规范化noCache默认值为false见HostDirCacheConfig的default:false标签仅在需要保证结果实时性时开启。测试佐证与扩展阅读仓库测试对findUp的行为约束提供了印证core/integration/contextual_workspace_test.go 验证了工作区注入边界下findUp的根目录定位行为core/integration/directory_test.go 注明复用与Host.findUp()相同的工具函数进行测试。如需继续深入可参阅以下仓库文件TypeScript SDK 类型与方法声明sdk/typescript/src/api/client.gen.tsHostFindUpOpts定义、sdk/typescript/src/api/client.gen.tsfindUp方法GraphQL schema 参数与处理器core/schema/host.gohostFindUpArgs与findUp实现、core/schema/host.goHostDirCacheConfig核心向上查找算法core/host.goFindUp/FindUpAll相关集成测试core/integration/contextual_workspace_test.go、core/integration/directory_test.go总结HostFindUpOpts虽然只有一个noCache字段却是理解 Dagger Host 文件访问缓存体系的一把钥匙它由核心层HostDirCacheConfig内嵌生成贯穿 TypeScript SDK、GraphQL schema 与 Go 核心实现三层与Host.file等操作的缓存语义保持一致。配合findUp的目录向上遍历算法开发者可以在不依赖绝对路径的前提下稳健地锚定项目根目录与配置文件这是构建可移植 Dagger 模块的基础能力之一。【免费下载链接】daggerAutomation engine to build, test and ship any codebase. Runs locally, in CI, or directly in the cloud项目地址: https://gitcode.com/GitHub_Trending/da/dagger创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表