ARTICLE DETAIL

资讯详情

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

Dagger TypeScript SDK 中的 EngineCacheEntrySetID:引擎缓存条目集标识符的类型体系与底层实现解析

Dagger TypeScript SDK 中的 EngineCacheEntrySetID:引擎缓存条目集标识符的类型体系与底层实现解析 Dagger TypeScript SDK 中的 EngineCacheEntrySetID引擎缓存条目集标识符的类型体系与底层实现解析【免费下载链接】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 TypeScript SDKdagger.io/daggerversion-0.20 API 参考中的EngineCacheEntrySetID类型别名说明它如何以 branded string 的形式为EngineCacheEntrySet对象提供类型安全的唯一标识并结合仓库源码sdk/typescript/src/api/client.gen.ts、core/engine.go、core/schema/engine.go剖析其定义方式、获取链路与实际应用场景。读完本文你将理解 Dagger 的 ID 标量在 TypeScript 客户端中的生成规则掌握如何通过engine().localCache().entrySet()获取缓存条目集及其标识符并能在自己的模块中正确使用这一类型。1. 类型别名定义什么是 EngineCacheEntrySetID在 Dagger 的 GraphQL API 中EngineCacheEntrySet是一个对象类型代表“由一次对缓存的查询所返回的一组缓存条目”A set of cache entries returned by a query to a cache。为了在 Dagger 的查询语言DAGQL中唯一引用这一对象API 为它定义了一个 ID 标量类型EngineCacheEntrySetID。在 TypeScript SDK 生成的类型文件中该标量被表达为一个类型别名Type Aliastype EngineCacheEntrySetID string object该声明位于 docs/versioned_docs/version-0.20/reference/typescript/api/client.gen/type-aliases/EngineCacheEntrySetID.md 对应的生成源 sdk/typescript/src/api/client.gen.ts 中配套的类型说明为TheEngineCacheEntrySetIDscalar type represents an identifier for an object of type EngineCacheEntrySet.即EngineCacheEntrySetID是EngineCacheEntrySet对象的标识符。1.1 branded string 的语义为什么是string objectEngineCacheEntrySetID string object是 TypeScript 中的一种“品牌类型”branded type写法。它的作用有两个层面运行时它仍然是一个普通的字符串可以被 JSON 序列化、被 GraphQL 传输、被缓存复用编译期通过 object这个交叉类型使得任意裸string无法直接赋值给EngineCacheEntrySetID从而阻止开发者把普通字符串误当作缓存条目集 ID 使用强制类型必须来自 Dagger API 的返回结果。这与 Dagger TypeScript SDK 中全局 ID 类型的定义一脉相承。在 sdk/typescript/src/api/client.gen.ts#L2128 中可以看到export type ID string { __ID: never }EngineCacheEntrySetID采用了同样“字符串交叉类型”的品牌化策略。可以推断在生成代码中它同样带有不可达的标记成员防止类型被随意伪造。1.2 Type Declaration__EngineCacheEntrySetID类型声明部分还给出了一个仅供内部使用的属性__EngineCacheEntrySetID: never这个never类型的标记属性意味着任何尝试手工构造一个EngineCacheEntrySetID对象的代码都会因为该属性不可赋值而报错。它是一种“结构上不可伪造”的保障——只有真正从 Dagger 查询返回的 ID 值才满足该类型约束。2. 谁产生这个 IDEngineCacheEntrySet 对象与获取链路EngineCacheEntrySetID本身只是一个标识符类型要理解它的实际用途需要回到它所标识的对象EngineCacheEntrySet。2.1 底层对象模型Go 核心实现在 core/engine.go#L52-L76 中EngineCacheEntrySet的 Go 定义如下type EngineCacheEntrySet struct { EntryCount int field:true doc:The number of cache entries in this set. DiskSpaceBytes int field:true doc:The total disk space used by the cache entries in this set. EntriesList []*EngineCacheEntry }其类型描述为A set of cache entries returned by a query to a cache也就是说EngineCacheEntrySet是对引擎本地缓存的一次快照视图包含三个核心信息字段类型含义EntryCountint该集合中缓存条目的数量DiskSpaceBytesint该集合中缓存条目占用的总磁盘空间字节EntriesList[]*EngineCacheEntry集合内的单个缓存条目列表每个EngineCacheEntrycore/engine.go#L78-L87则携带更细粒度的元数据条目描述Description、占用磁盘空间DiskSpaceBytes、创建时间CreatedTimeUnixNano、最近使用时间MostRecentUseTimeUnixNano、是否正被活跃使用ActivelyUsed、缓存记录类型RecordType如regular、internal、frontend、source.local、source.git.checkout、exec.cachemount等、存储记录类型列表RecordTypes以及产生该缓存条目的 DAGQL 调用DagqlCall。2.2 GraphQL Schema 注册schema 层引擎相关的这些查询通过 core/schema/engine.go#L16-L66 的engineSchema.Install注册到 DAGQL 服务器上形成如下的查询路径engine→ 引擎容器配置与状态engine.localCache→ 引擎本地缓存状态由 dagql 跟踪engine.localCache.entrySet(key)→ 当前缓存中的条目集合engine.localCache.prune(...)→ 按策略清理可释放的缓存条目EngineCacheEntrySet.entries→ 集合中的单个缓存条目列表。对应地core/query.go中通过接口EngineLocalCacheEntries暴露了获取条目集的入口core/query.go#L160。2.3 TypeScript 客户端中的使用方式在 TypeScript SDK 生成代码中EngineCacheEntrySet是一个继承BaseClient的客户端类sdk/typescript/src/api/client.gen.ts#L7726-L7809其公开方法包括export class EngineCacheEntrySet extends BaseClient { // A unique identifier for this EngineCacheEntrySet id async (): PromiseID { ... } // The total disk space used by the cache entries in this set diskSpaceBytes async (): Promisenumber { ... } // The list of individual cache entries in the set entries async (): PromiseEngineCacheEntry[] { ... } // The number of cache entries in this set entryCount async (): Promisenumber { ... } }而EngineCacheEntrySetID正是id()返回值的类型化表达。典型调用链如下import { connect } from dagger.io/dagger connect(async (client) { // 获取引擎本地缓存条目集 const entrySet client.engine().localCache().entrySet() // 获取该条目集的唯一标识符EngineCacheEntrySetID const setId: EngineCacheEntrySetID await entrySet.id() // 同时可读取缓存占用信息 const count await entrySet.entryCount() const bytes await entrySet.diskSpaceBytes() })注意entrySet()方法声明为entrySet (opts?: EngineCacheEntrySetOpts): EngineCacheEntrySetsdk/typescript/src/api/client.gen.ts#L7466生成的构造函数带有注释 “Constructor is used for internal usage only, do not create object from it”即客户端对象只能通过 SDK 的查询链获得不应手工new。2.4 底层调用链key 参数与随机 ID 生成在 schema 层的实现 core/schema/engine.go#L106-L142 中cacheEntrySet解析器接收一个可选的key参数默认空字符串func (s *engineSchema) cacheEntrySet(ctx context.Context, parent dagql.ObjectResult[*core.EngineCache], args struct { Key string default: }) (inst dagql.Result[*core.EngineCacheEntrySet], _ error) { ... if args.Key { // 未指定 key 时生成一个全新的随机 ID 作为 key 再次查询 err : srv.Select(ctx, parent, inst, dagql.Selector{ Field: entrySet, Args: []dagql.NamedInput{ {Name: key, Value: dagql.NewString(identity.NewID())}, }, }) ... } entrySet, err : query.EngineLocalCacheEntries(ctx) ... }从这里可以看出两点实现细节每次调用都会生成新集合视图当key为空时解析器会通过identity.NewID()生成一个随机 ID 作为 key 发起子查询这意味着每次entrySet()调用都会得到一个独立的、代表当前缓存快照的EngineCacheEntrySet其EngineCacheEntrySetID也因此具有“每次查询唯一”的特征EngineCacheEntrySetID与缓存本身解耦ID 是查询结果对象的引用标识并不会因为缓存内容后续变化而失效它标识的是“这一次查询到的条目集合”这个对象。EngineCacheEntrySet.entries字段的解析同样直接core/schema/engine.go#L186-L188func (s *engineSchema) cacheEntrySetEntries(ctx context.Context, parent *core.EngineCacheEntrySet, args struct{}) (dagql.Array[*core.EngineCacheEntry], error) { return parent.EntriesList, nil }3. 实践场景缓存观测与清理EngineCacheEntrySet及其 ID 的典型应用场景是引擎本地缓存的观测与治理。通过entrySet()可以统计缓存规模读取entryCount()与diskSpaceBytes()评估缓存对磁盘的占用分析缓存构成遍历entries()根据RecordType如exec.cachemount、source.git.checkout判断缓存来自哪些阶段配合 prune 治理缓存在 core/schema/engine.go#L37-L57 中EngineCache.prune支持通过useDefaultPolicy、maxUsedSpace如200GB或80%、reservedSpace如500GB或10%、minFreeSpace如20GB或20%、targetSpace如200GB或50%、maxEstimatedBytes与targetEstimatedBytes等参数控制清理策略。prune 被标记为DoNotCache(Mutates mutable state)因为它会修改引擎的可变状态因此不会参与 DAGQL 的缓存复用。一个结合 ID 与清理的完整示例import { connect } from dagger.io/dagger connect(async (client) { const cache client.engine().localCache() // 1. 观测获取当前缓存条目集与标识符 const entrySet cache.entrySet() const setId await entrySet.id() // EngineCacheEntrySetID const count await entrySet.entryCount() const bytes await entrySet.diskSpaceBytes() console.log(cache set ${setId}: ${count} entries, ${bytes} bytes) // 2. 治理按引擎默认策略清理可释放的缓存 await cache.prune({ useDefaultPolicy: true }) })4. 类型安全设计的意义从EngineCacheEntrySetID这一类型别名可以窥见 Dagger TypeScript SDK 整体 ID 体系的设计哲学全部对象 ID 均为 branded string无论是ID、ContainerID、DirectoryID还是EngineCacheEntrySetID都以string {...}的形式生成运行时是普通字符串、编译期彼此不可混用标记属性never阻止伪造__EngineCacheEntrySetID: never这类声明确保 ID 只能由 SDK 查询产生杜绝了手工拼接 ID 引发的类型错误文档即类型本页面正是由 sdk/typescript/src/api/client.gen.ts 经 codegen 自动生成的 API 参考完整清单见 docs/versioned_docs/version-0.20/reference/typescript/api/client.gen/modules.md其英文描述与 Go 端doc注解一一对应开发者可以在 IDE 中同时获得类型约束与语义说明。5. 小结EngineCacheEntrySetID是 Dagger 引擎缓存条目集在 TypeScript 侧的标识符类型它以string object的品牌类型形式存在配合__EngineCacheEntrySetID: never标记实现编译期的防伪造约束。它通过engine().localCache().entrySet().id()获取背后对应 core/engine.go 中的EngineCacheEntrySet对象模型、core/schema/engine.go 中的 DAGQL 解析器以及每次查询生成独立快照的实现逻辑。理解这一类型有助于开发者安全地在模块中传递缓存条目集引用并正确使用 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),仅供参考
返回列表