
Dagger TypeScript SDK 中的 EngineCacheID 类型别名引擎缓存标识符的生成机制与实战应用【免费下载链接】daggerAutomation engine to build, test and ship any codebase. Runs locally, in CI, or directly in the cloud项目地址: https://gitcode.com/GitHub_Trending/da/daggerEngineCacheID是 Dagger 面向 TypeScript 的 GraphQL 客户端 APIapi/client.gen中为EngineCache对象定义的类型别名Type Alias。它本质上是一个「品牌字符串」string object用于安全地表示引擎本地缓存的唯一标识符。本文以该类型别名为入口梳理它在 GraphQL 核心 Schema 中的定义、在 TypeScript/Elixir SDK 中的生成形态、以及配合engine.localCache、prune等 API 的实战用法帮助你理解 Dagger SDK 中「ID 标量 → 语言类型」的完整生成链路。1. 类型别名一个文件看懂EngineCacheID在 SDK 的 API 参考文档中EngineCacheID被定义为type EngineCacheID string object它的完整描述为TheEngineCacheIDscalar type represents an identifier for an object of typeEngineCache.Type Declaration 部分还声明了一个不可赋值的成员interface EngineCacheID { __EngineCacheID: never }这个__EngineCacheID: never成员正是 TypeScript「品牌类型」branded type的经典写法它让EngineCacheID在结构上与普通string区分开任何字面量字符串都不能直接赋值给EngineCacheID从而在编译期防止「用错 ID」这类错误。也就是说这个类型既是一个字符串又不只是一个字符串——string object的交集写法配合never品牌字段为引擎缓存标识符提供了类型层面的语义保护。该类型别名对应的运行时实体是 GraphQL 标量scalar EngineCacheID其描述为「A unique identifier for an object」定义在仓库的 core/schema/testdata/base_schema.graphqls 中A unique identifier for an object. scalar EngineCacheID与它并列的还有EngineCacheEntryID、EngineCacheEntrySetID等同类标量见 base_schema.graphqls它们共同构成了引擎缓存相关的 ID 体系。2. 追溯源头EngineCache对象从 Schema 到 TypeScriptEngineCacheID是EngineCache对象的标识符。在 GraphQL Schema 中EngineCache被描述为「A cache storage for the Dagger engine」并且实现了Node接口所有实现Node的对象都会暴露id: ID!字段A cache storage for the Dagger engine type EngineCache implements Node { The current set of entries in the cache entrySet(key: String ): EngineCacheEntrySet! A unique identifier for this EngineCache. id: ID! The maximum bytes to keep in the cache without pruning. maxUsedSpace: Int! The target amount of free disk space the garbage collector will attempt to leave. minFreeSpace: Int! Prune the cache of releaseable entries prune(...): Void The minimum amount of disk space this policy is guaranteed to retain. reservedSpace: Int! The target number of bytes to keep when pruning. targetSpace: Int! }完整定义见 base_schema.graphqls。在 TypeScript SDK 的生成文件中EngineCache类与EngineCacheID一一对应。id()方法返回的正是PromiseIDID即为EngineCacheID的实际载体见 sdk/typescript/src/api/client.gen.ts/** * A unique identifier for this EngineCache. */ id async (): PromiseID { if (this._id) { return this._id } const ctx this._ctx.select(id) const response: AwaitedID await ctx.execute() return response }从中可以看到 SDK 的标准模式先检查实例上是否已缓存_id否则通过this._ctx.select(id)构造 GraphQL 子查询并执行最后把结果返回为ID类型。3. 在 TypeScript SDK 中如何获取EngineCacheIDEngineCache本身不会被用户直接构造构造函数明确标注「Constructor is used for internal usage only, do not create object from it」见 client.gen.ts而是通过Engine对象的localCache()方法获得/** * The local engine cache state tracked by dagql */ localCache (): EngineCache { const ctx this._ctx.select(localCache) return new EngineCache(ctx) }见 client.gen.ts。因此在 TypeScript 中获取某个引擎缓存的标识符、并读取缓存策略字段的典型写法是import { connect } from dagger.io/dagger connect(async (client) { // 通过 engine.localCache 拿到当前引擎的本地缓存对象 const cache client.engine().localCache() // 获取 EngineCache 的唯一标识符EngineCacheID const cacheId await cache.id() console.log(EngineCache ID:, cacheId) // 读取磁盘空间策略 console.log(maxUsedSpace:, await cache.maxUsedSpace()) console.log(reservedSpace:, await cache.reservedSpace()) console.log(targetSpace:, await cache.targetSpace()) console.log(minFreeSpace:, await cache.minFreeSpace()) })localCache()方法背后对应 GraphQL 查询链engine { localCache { ... } }其入口定义在 core/schema/engine.godagql.Func(localCache, s.localCache)Schema 中声明为localCache: EngineCache!见 base_schema.graphqls。4. 底层实现Go 核心中的EngineCache与 ID 字段EngineCacheID的语义在 Go 核心层由core.EngineCache结构体承载定义于 core/engine.gotype EngineCache struct { MaxUsedSpace int field:true doc:The maximum bytes to keep in the cache without pruning. TargetSpace int field:true doc:The target number of bytes to keep when pruning. ReservedSpace int field:true doc:The minimum amount of disk space this policy is guaranteed to retain. MinFreeSpace int field:true doc:The target amount of free disk space the garbage collector will attempt to leave. }结构体的类型描述core/engine.go与 GraphQL Schema 中的描述完全一致——「A cache storage for the Dagger engine」可见 Schema、SDK 类型与核心实现三者的描述是同一来源。localCache解析器从引擎的本地缓存策略EngineLocalCachePolicy中取出各项字节数并填充结构体见 core/schema/engine.gofunc (s *engineSchema) localCache(ctx context.Context, parent *core.Engine, args struct{}) (*core.EngineCache, error) { query, err : core.CurrentQuery(ctx) if err ! nil { return nil, err } if err : query.RequireMainClient(ctx); err ! nil { return nil, err } policy : query.EngineLocalCachePolicy() if policy nil { return core.EngineCache{}, nil } return core.EngineCache{ ReservedSpace: int(policy.ReservedSpace), TargetSpace: int(policy.TargetSpace), MaxUsedSpace: int(policy.MaxUsedSpace), MinFreeSpace: int(policy.MinFreeSpace), }, nil }值得注意的两点主客户端限制localCache解析器调用了query.RequireMainClient(ctx)意味着只有主客户端main client才能查询引擎缓存状态策略可为空当EngineLocalCachePolicy为nil时返回空的EngineCache{}各字段为 0调用方需要自行处理。4.1EngineCache的 GraphQL 解析器安装EngineCache的字段解析器通过dagql.Fields[*core.EngineCache]批量安装见 core/schema/engine.go。其中entrySet解析器接收Key string默认参数返回EngineCacheEntrySet用于按 key 查询缓存条目集合engine.goEngineCacheEntrySet.entries返回该集合内所有EngineCacheEntry的列表缓存条目的字段如activelyUsed、createdTimeUnixNano、dagqlCall、diskSpaceBytes、mostRecentUseTimeUnixNano、recordType、recordTypes等定义在 core/engine.go并在 Schema 中完整暴露base_schema.graphqls。5. 跨语言一致性Elixir SDK 中的Dagger.EngineCacheIDDagger 的多语言 SDK 由同一份 GraphQL Schema 驱动代码生成因此EngineCacheID在 Elixir SDK 中以模块Dagger.EngineCacheID的形式存在。仓库中的 sdk/elixir/lib/dagger/gen/engine_cache_id.ex 完整展示了一个生成标量模块的样板# This file generated by dagger_codegen. Please DO NOT EDIT. defmodule Dagger.EngineCacheID do moduledoc A unique identifier for an object. use Dagger.Core.Base, kind: :scalar, name: EngineCacheID type t() :: String.t() end从中可以读出两个关键信息文件由dagger_codegen自动生成禁止手动编辑——这解释了为什么EngineCacheID在 TS 与 Elixir 两个 SDK 中的描述与形态高度一致标量在语言层的最终落地形态是字符串——Elixir 中type t() :: String.t()TypeScript 中string object两者本质一致。6. 实战用engine.localCache做缓存容量观测与清理理解了EngineCacheID的来龙去脉后它在实战中的价值主要体现为拿到缓存对象的标识符后可以进一步观测缓存容量并触发清理。EngineCache除了只读字段外还提供了prune()方法其参数定义在 client.gen.tsexport type EngineCachePruneOpts { maxUsedSpace?: string minFreeSpace?: string reservedSpace?: string targetSpace?: string useDefaultPolicy?: boolean maxEstimatedBytes?: number targetEstimatedBytes?: number }在 TypeScript 中清理缓存并观测效果的完整示例import { connect } from dagger.io/dagger connect(async (client) { const cache client.engine().localCache() const cacheId await cache.id() console.log(pruning EngineCache:, cacheId) // 使用引擎默认策略清理可释放的缓存 await cache.prune({ useDefaultPolicy: true }) // 或显式指定磁盘策略进行清理 await cache.prune({ maxUsedSpace: 200GB, targetSpace: 50%, reservedSpace: 10%, minFreeSpace: 20GB, }) // 清理后重新读取策略字段 console.log(maxUsedSpace:, await cache.maxUsedSpace()) console.log(targetSpace:, await cache.targetSpace()) })prune的各覆盖参数maxUsedSpace、reservedSpace、minFreeSpace、targetSpace在 SDK 注释中给出了取值示例如200GB、80%、500GB、10%、20GB、20%、50%等见 client.gen.ts即同时支持绝对字节人类可读单位与百分比两种写法。GraphQL Schema 中prune的完整签名与注释见 base_schema.graphqls其中useDefaultPolicy默认值为false四个磁盘参数默认值为空字符串。而 Go 侧的参数结构体EngineCachePruneOptions定义在 core/engine.go并额外包含MaxEstimatedBytes、TargetEstimatedBytes两个结构元数据估算覆盖项。6.1 集成测试佐证缓存字段的端到端行为仓库的集成测试为这些字段的语义提供了直接证据core/integration/provision_test.go 通过dagger query验证了 GraphQL 查询{engine{localCache{reservedSpace,maxUsedSpace,minFreeSpace}}}会按引擎配置返回{engine: {localCache: {reservedSpace: 1000, maxUsedSpace: 2000, minFreeSpace: 3000}}}证明localCache的四个容量字段确实来源于引擎的磁盘策略配置core/integration/engine_persistence_test.go 通过本地缓存磁盘字节数localCacheDiskBytes来断言引擎会话间的缓存持久化行为。这些测试表明EngineCache及其EngineCacheID并不是孤立的类型定义而是引擎缓存生命周期管理能力观测、持久化、清理在 API 层的统一入口。7. 小结EngineCacheID 在设计中的角色从EngineCacheID这一个类型别名出发我们可以还原 Dagger 引擎缓存 API 的完整设计脉络层次形态仓库位置GraphQL 标量scalar EngineCacheIDbase_schema.graphqls核心对象type EngineCache实现Node暴露idbase_schema.graphqlsGo 实现core.EngineCache结构体 dagql 解析器core/engine.go、core/schema/engine.goTypeScript 类型type EngineCacheID string object品牌字符串本关联文档EngineCacheID.mdTypeScript 运行时EngineCache.id(): PromiseIDclient.gen.tsElixir 生成模块Dagger.EngineCacheIDtype t() :: String.t()engine_cache_id.ex作为开发者理解EngineCacheID的核心收获有三点类型即文档string object__EngineCacheID: never的品牌类型写法是 Dagger SDK 对「标量 ID」的统一建模方式既能保持字符串的可用性又能在编译期避免 ID 混用ID 背后是完整对象拿到EngineCacheID意味着拿到EngineCache对象的入口可以继续查询maxUsedSpace、reservedSpace、targetSpace、minFreeSpace等容量策略或通过prune()触发清理一处 Schema多语言生成EngineCacheID从 GraphQL Schema 到 TypeScript / Elixir SDK 的形态高度一致背后是dagger_codegen的统一代码生成链路任何 SDK 侧的类型改动都应回到 Schema 层进行。如果你需要继续深入可以进一步阅读关联文档所在的 api/client.gen 类型别名目录 下的其他 ID 类型如EngineCacheEntryID、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创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考