ARTICLE DETAIL

资讯详情

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

Dagger TypeScript SDK 的 CallbackFct 类型别名:connect() 回调签名解析与实战指南

Dagger TypeScript SDK 的 CallbackFct 类型别名:connect() 回调签名解析与实战指南 Dagger TypeScript SDK 的 CallbackFct 类型别名connect() 回调签名解析与实战指南【免费下载链接】daggerAutomation engine to build, test and ship any codebase. Runs locally, in CI, or directly in the cloud项目地址: https://gitcode.com/GitHub_Trending/da/daggerCallbackFct是 Dagger TypeScript SDK 中定义connect()入口函数回调签名的核心类型别名它约定了一个接收类型化Client、返回Promisevoid的异步函数。本文基于 Dagger v0.20 版本文档CallbackFct.md展开结合 SDK 源码解析其定义、使用方式与底层实现帮助读者掌握如何以类型安全的方式编写、执行并测试 Dagger 构建流水线。认识 CallbackFct一行类型定义 SDK 的入口约定在 Dagger TypeScript SDK 中connect()是用户编写 Dagger 流水线的统一入口而CallbackFct就是该入口的回调类型约定。其完整定义为export type CallbackFct (client: Client) Promisevoid该定义位于 SDK 源码 sdk/typescript/src/connect.ts并从 sdk/typescript/src/index.ts 对外导出export type { CallbackFct } from ./connect.js因此使用者可以直接import { CallbackFct } from dagger.io/dagger来注解自己的回调函数。从类型签名可以拆解出三个关键语义参数client类型化 GraphQL 客户端回调唯一入参是Client类型的实例。该类型由 Dagger 的代码生成器根据 GraphQL API Schema 生成生成产物在sdk/typescript/src/api/client.gen.ts中测试用例 sdk/typescript/src/api/test/api.spec.ts 中可见import { Client } from ../../api/client.gen.js的用法为开发者提供了一整套类型安全、可自动补全的 API如client.container().from(alpine)、client.host().workdir()等。返回Promisevoid异步执行的完成契约回调必须返回一个解析为void的 Promise。这意味着回调内的 Dagger 操作如.sync()、.stdout()应当被await保证在回调 resolve 前相关流水线已执行完毕回调不需要也不应该返回值给框架——Dagger 引擎会在回调完成后统一关闭会话、释放资源。函数类型的本质把连接生命周期交给框架CallbackFct本身是一个函数类型而不是接口或类这决定了它的使用哲学开发者只关心在拿到Client之后做什么而连接建立、引擎拉起、会话清理等生命周期细节完全由connect()负责。connect()CallbackFct 的唯一消费方CallbackFct的典型消费场景就是connect()函数其官方签名见 connect.md为connect(cb: CallbackFct, config?: ConnectOpts): Promisevoid对应的最小可用示例import { connect } from dagger.io/dagger await connect( async (client) { // 在回调内使用 client 构建流水线 await client .container() .from(alpine) .withExec([apk, add, curl]) .withExec([curl, https://dagger.io/]) .sync() }, { LogOutput: process.stderr }, )源码实现回调之前做了什么从 sdk/typescript/src/connect.ts 可以看到connect()的完整实现逻辑export async function connect( cb: CallbackFct, config: ConnectOpts {}, ): Promisevoid { await withGQLClient(config, async (gqlClient: GraphQLClient) { const connection new Connection(gqlClient) const ctx new Context([], connection) const client new Client(ctx) // Warning shall be throw if versions are not compatible try { await client.version() } catch (e) { console.error(failed to check version compatibility:, e) } return await cb(client) }) }实现细节揭示了回调执行前的几个关键步骤建立 GraphQL 连接通过withGQLClient()获取一个与 Dagger 引擎通信的GraphQLClient构造类型化 Client将 GraphQL 客户端包装进Context进而构造出回调所需的Client实例版本兼容性检查调用client.version()校验 SDK 与引擎版本是否兼容若不兼容会打印告警日志failed to check version compatibility注意此处仅为警告不会阻断执行执行回调把构造好的client传给cb并返回其结果。这正是CallbackFct参数client的来源——它不是一个由用户手动构造的空对象而是经过连接建立、上下文注入、版本校验之后的活客户端。Promise 的深层含义惰性执行与触发时机理解了CallbackFct的返回类型还需要理解 Dagger 的执行模型Dagger 采用惰性求值lazy evaluation。在回调内书写client.container().from(alpine)只是构建了一棵查询树query tree并不会真正执行容器操作只有调用如.sync()、.stdout()、.id()这类触发方法并await时对应的 GraphQL 查询才会被提交执行。这也是Promisevoid契约背后的工程考量回调必须是一个完整可执行的异步函数框架通过等待其 resolve 来确保所有必要的操作都已完成。若回调内部存在未await的 Dagger 操作则存在连接提前关闭、操作未执行完毕的风险。SDK 测试用例 sdk/typescript/src/api/test/api.spec.ts 中有一段字段不可变性测试直观展示了这一模型await connect(async (client: Client) { const image client .container() .from(alpine:3.16.2) .withExec([echo, hello, world]) const a await image.withExec([echo, foobar]).stdout() assert.strictEqual(a, foobar\n) const b await image.stdout() assert.strictEqual(b, hello world\n) })同一个image对象在await前只是不可变查询树的一部分两次独立的await分别触发两条不同的查询路径验证了惰性执行与不可变链式调用的行为。CallbackFct 与 connection()两种连接形态的对比除了connect()connect 模块还导出了connection()函数见 connection.md 与 sdk/typescript/src/connect.ts。二者的核心差异在于回调签名对比项connect()connection()回调类型CallbackFct即(client: Client) Promisevoid() Promisevoid无参数客户端获取方式通过回调参数显式传入通过全局单例dag对象访问典型场景需要显式控制Client生命周期的脚本依赖全局dag的简单脚本connection()的实现通过globalConnection.setGQLClient(gqlClient)将客户端注入全局dag并在回调结束后globalConnection.resetClient()清理同时它额外封装了 OpenTelemetry 上下文传播opentelemetry.context.with与遥测初始化/关闭telemetry.initialize()/telemetry.close()。官方示例connection.mdawait connection( async () { await dag .container() .from(alpine) .withExec([apk, add, curl]) .withExec([curl, https://dagger.io/]) .sync() }, { LogOutput: process.stderr }, )选择建议如果你希望回调内使用类型注解明确的client参数这更利于单元测试与代码复用选择connect()CallbackFct如果偏好简洁的全局dag写法则选择connection()。ConnectOpts回调连接的配置面connect()的第二个可选参数类型为ConnectOpts默认值{}定义于 sdk/typescript/src/connectOpts.ts。它同样适用于connection()完整字段如下字段类型默认值说明Workdirstringprocess.cwd()覆盖 Dagger 工作目录LoadWorkspaceModulesbooleanfalse默认仅暴露核心 API选择加载工作区模块LogOutputWritable来自node:stream无开启日志输出例如{ LogOutput: process.stdout }典型配置示例import { connect } from dagger.io/dagger await connect( async (client: Client) { const source await client.host().workdir().id() // ... 使用 source 构建流水线 }, { Workdir: process.cwd(), LoadWorkspaceModules: true, LogOutput: process.stdout, }, )其中LogOutput的用法直接出现在 connectOpts.ts 的文档注释与测试用例 sdk/typescript/src/test/connect.spec.ts 中。底层原理回调在什么连接环境中执行CallbackFct回调被connect()包裹后实际运行在withGQLClient()提供的连接环境中。查看 sdk/typescript/src/common/graphql/connect.ts 可以发现两条连接路径会话模式Session当环境变量DAGGER_SESSION_PORT存在时直接使用该端口与DAGGER_SESSION_TOKEN建立连接令牌缺失会抛出DAGGER_SESSION_TOKEN must be set if DAGGER_SESSION_PORT is set错误。此模式通常用于在已运行的 Dagger 会话中执行例如被 Dagger 启动的 SDK 运行时环境。自动供给模式Automatic Provisioning否则动态导入../../provisioning/index.js通过withEngineSession()自动启动或复用Dagger 引擎再执行回调。若供给失败会抛出带failed to execute function with automatic provisioning前缀的错误。也就是说CallbackFct描述的回调既可以运行在一键自举引擎的脚本场景也可以运行在注入已有会话的托管场景框架根据环境自动选择路径而回调代码本身无需感知差异。最佳实践与注意事项始终await回调内的触发方法Dagger 采用惰性执行模型务必await.sync()、.stdout()等操作否则可能在连接关闭前操作未执行。用CallbackFct注解回调以获得类型检查直接import { CallbackFct } from dagger.io/dagger为你的回调函数显式声明类型可获得client参数的完整类型推导与编译期校验。善用第二个参数config在调试时设置LogOutput: process.stderr便于观察执行日志在加载自定义模块时设置LoadWorkspaceModules: true。理解版本校验告警connect()内部会调用client.version()做兼容性检查版本不匹配时仅打印警告建议留意输出避免生产环境踩坑。测试时可注入真实引擎SDK 测试如 sdk/typescript/src/api/test/api.spec.ts、sdk/typescript/src/test/connect.spec.ts展示了直接在connect(async (client) {...})回调内编写断言的标准测试模式可作为编写集成测试的参考模板。小结CallbackFct虽然只是一个单行类型别名(client: Client) Promisevoid但它浓缩了 Dagger TypeScript SDK 最核心的编程模型类型安全的Client注入、异步完成的生命周期契约以及由connect()负责的连接建立与清理。掌握它就掌握了编写 Dagger TypeScript 流水线的入口。结合 connect/README.md 中同模块的connect()、connection()文档以及 SDK 源码与测试可以进一步深入理解整个连接体系的实现细节。【免费下载链接】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),仅供参考
返回列表