Dagger 洞见

数据聚合方法:DAGGER 罗斯等人[2011]提出了一种名为DAGGER的元算法,该算法试图在学习策略诱导的状态分布下收集专家演示。模仿学习的策略方法[萨顿和巴托,1998]:专家提供正确的行动,但例子的输入分布来自学习者自己的行为。 图显示了DAGGER模仿学习方法的概述。 最简单的DAGGER形式如下。 在第一次迭代时,策略通过专家演示的行为克隆初始化,导致策略π1Lπ_1^Lπ1L​。 随后,该策略被用来收集轨迹数据集,这些新获得的轨迹和演示的轨迹被聚合成数据集DDD,用于训练策略π2Lπ_2^Lπ2L​。 在迭代nnn,使用 阅读详情

English version: 《Dagger In-Depth: Everything You Need to Know》
Author: @Tiexin Guo(郭铁心)
翻译:Runrunniu

1 什么是 Dagger ?

TL;DR:Dagger 是在 Docker 容器中本地运行 CI/CD 流水线的工具

说实话, Dagger 很难有具体的定义。媒体称之为“DevOps 平台”;风投机构称其为“DevOps 操作系统”。

但 Dagger 并不能这样定义。在我们讲 Dagger 是什么之前,先来了解以下内容:

2 Dagger 的特点

2.1 BuildKit

Dagger 的配置在 BuildKit 中执行,这是 Docker 的核心执行引擎(镜像构建神器)。

BuildKit 作为 Moby 项目一部分被开发,是一个开放框架,用于组装专门的容器系统,而无需 Docker 重新组装。本质上,它是一个工具包,能够高效、可重复地将源代码转换为构建工具。2017年,BuildKit 首次发布,并在2018年9月与 Docker Engine 一起发布了 2018 版本。

2.2 CUE

与大多数 CI 系统不同,你不需要用 Dagger 编写 YAML,只需要编写 CUE。

CUE 是一种开源的数据验证语言和推理引擎,本质上是逻辑编程,旨在简化涉及定义和使用数据的任务。实际上是 JSON 的超集,熟练使用 JSON 的用户可以快速上手,另外CUE还具有内置的自动格式化功能。

尽管它不是通用编程语言,但它有很多应用,例如数据验证、数据模板、配置、查询、代码生成,甚至脚本编写等等。

2.3 请等一下

既然为配置执行重用 Docker 的部分,为什么不重复使用另一部分的文件呢?

Dagger 的创始人 Solomon Hykes 在他们的官方 Discord 频道上明确地回答了这个问题:

· 我们需要一个正式规范的独立社区,具有类型系统、包装管理器、原生 Yaml 和 json 相互配合的声明性语言。

· Docker 文件也是专门构建的,但 Dagger 更通用。

· Docker 文件无法支持不同版本的需求。

3 Dagger 能做些什么?

3.1 这不是 Dagger

首先,我们引用关于 Dagger 的官方文献来避开歧义:

· Dagger 不会取代 CI,只是会通过在添加 Wrapper Layer 进行改进。

Dagger 没有 替换 现有的 CI ,而是通过添加 Wrapper Layer 来改进 CI。

我们可以把“ Wrapper ”换成比较官方高级的说法——“可移植开发层”。

3.2 所以 Dagger 只是一个 Wrapper ?

我们来看看 DevOps/cloud 的其他例子:

· Terraform。需要管理复杂的环境,即使有可以重复使用的模快和角色,仍然需要跨环境重复使用代码。Terragrunt 是一个能提供额外工具来保持配置简单、不重复的 Wrapper layer 。

· AWS CDK。它本质上是 CloudFormation 之上的一个 Wrapper layer ,允许使用熟悉的编程语言来定义和预置 AWS 云基础设施。这样就不必处理 CloudFormation 的不可读配置。当然,代码仍会转换为 CloudFormation 的可读格式,并且由 CloudFormation 管理基础架构; AWS CDK 与 AWS API 不会直接交互。

· 至于 CDKTF (CDK for Terraform),其实和 AWS CDK 没有什么不同,也许AWS CDK 给CDKTF带来了灵感,并且AWS 的jsii库可以实现多语言功能。它是 Terraform 之上的一个 Wrapper layer ,可将代码转换为 Terraform HCL,这样就不必学习 HCL 。但本质上, 基础设施由Terraform HCL 管理,而不是直接由代码管理。所以,它是另一个 Wrapper 。

那么 Dagger 到底是做什么的呢?Dagger 到底包装了什么?

3.3 Dagger 能做什么

在 CI 系统中,你可以以某种格式(最有可能是 YAML)定义一些步骤和操作,。例如,在 Jenkins 中,也许你会编写一些 groovy 文件。在 GitHub Actions 中,你会编写一些包含多个步骤的 YAML。

Dagger 在 Docker 中运行这些“步骤和操作”。那么 Dagger docker 本身在哪里运行呢?这是个好问题:可以在本地运行或在 CI 系统中。 Dagger 不会包装 CI 流水线和系统,它把所有琐碎的步骤和操作放在一个 Docker 容器中,在 CI 系统中运行,就像在编写一个大的Docker文件,它会运行 git 克隆、源代码静态扫描、测试、构建、工件上传等等所有内容。

4 Dagger 到底是什么

说 Dagger 是 Wrapper ,这没错。

但它不包含 CI 系统,而是将流水线步骤和操作包装到一个容器中(必须用 Dagger 的语法编写这些步骤和操作),并且包装的结果可以在另一个 CI 中运行。

从这个意义上说,Dagger 是 另一个 CI 系统,只是 CI 在容器中运行,而大多数 CI 系统恰好能够运行容器。

5 Dagger 的优势

Dagger 有三大优势

5.1 本地开发

首先,不需要安装 任何 该应用程序的特定依赖项,Dagger 管理 Docker 内的所有中间步骤和临时依赖项。

如果我们讨论 CI ,这可能不是一个优势,但如果我们谈论本地开发,这就是 Dagger 的一个优势。

Go 和 Nodejs,要么需要安装模块,要么甚至可能需要切换 Node 版本才能安装。而现在你可以在一个容器内完成所有这些操作,并且只将最终结果发送到本地。

5.2 自建 CI

现在可以在本地运行流水线,因为你可以轻松地在本地启动和运行 Docker 桌面。

不过,我们现在都有功能齐全的电脑;你可以在本地运行 CI 系统,那为什么还要在这些系统上浪费钱呢?只要 Docker 可用,就可以在任何地方运行,如果不想购买 CI 作为服务,你可以在自己的基础架构中运行 Dagger。

5.3 迁移到另一个 CI

既然“步骤和操作”需要一个容器,可以在 CI 系统中运行。

如果你需要迁移到另一个 CI 系统,则无需再重复 CI 步骤。例如,你不想再使用公司的旧 Jenkins 实例,但已经在使用 Dagger 和 Jenkins,现在想尝试一下 GitHub Actions。

在这种场景下,有两点要做:

· 如果现在正在使用 Jenkins,并且想要将这些 Jenkins 流水线迁移到 Dagger 中,则需要手动完成。成本与用 GitHub Actions 的语法重写整个流水线相同(如果工作量不大的话)。

· 你仍需要了解新的 CI 系统如何触发作业、如何使用语法等。Dagger 确实提供了一个避免 CI 锁定的解决方案,但这并不是一个从根本上解决灵活性以及运行规则问题的方案。

对于 DevOps 工程师来说,能够满足不同团队、不同需求、不同优先级的 DevOps 工具链更具吸引力。每个组件都是可模块化和可插拔的,可以少做很多繁琐的工作。

理想状态下,你可以在可读的 YAML 配置文件中定义所需的 DevOps 工具,并且通过命令可以设置或更改整个 DevOps 工具链和 SDLC 工作流程。
如果你对 “ DevOps toolchain as code ”感兴趣,欢迎了解 DevStream!

6 现在应该使用 Dagger 吗?

Dagger 有前途吗?大概有的。现在就用 Dagger 吗?倒也不必,原因有三:

· Dagger 项目本身仍然使用 GitHub Actions。因为它有局限性,不能通过 GitHub Actions 完成所有事情。

· 我们通常不会每 6 个月更改一次 CI 系统。如果 4 年更新一次,那何必用这个 Wrapper?

· Dagger 是最近新发布的,还没有支持很多 CI 系统,暂时不能保证在不同的 CI 系统中正常使用。

欢迎大家讨论,下期文章见!

Dagger2实际应用篇 这里主要针对@MapKey、@Scope、@Qualifier注解还有@IntoSet,@IntoMap和@ElementsIntoSet的理解,因为这几个注解是贯穿始终的,和其他注解或多或少存在关联,如果不提前讲解,后面关联上无法更好的理解。 @MapKey、@Scope、@Qualifier三个注解仅仅可用于修饰注解。MapKey是Dagger2自定义的,Scope和Qualifier是javax.inject下的注解。 这里包括后面的章节中注解的先后顺序都是经过我精挑细选的,务必保证后面说到的注 阅读详情

相关推荐

dagger2之android源码解析(dagger-compiler你在哪)

首先照常理来一份参考地址:Android - Dagger2使用详解,这里说的还行,但是并没有涉及到源码部分,如果没有像我这种纠结症的完全可以参考去使用。dagger这个我用的并不多(咱实话实话了,之前用了下,但是感觉好麻烦,我认为项目中没必要用到它),因为我现在在细品AAC里面的demo,GithubBrowserSample中有使用到,第一为了学习,第二别人家碗里的肉肯定都是香的,所以就有了这么一篇根据demo中案例捋一遍源码。 ...

foshengtang的博客 1128

Wing SDK util 模块 base64 编解码实战:从 preflight/inflight 测试到 tf-aws 编译快照解析

本文以 Wing 语言(winglang)标准库 `util` 模块的 base64 编解码能力为核心,围绕仓库中的 [base64.test.w 测试用例](https://link.gitcode.com/i/2156bb9a7d6da1197bdc301fa67880e0)、[tf-aws 编译快照](https://link.gitcode.com/i/35eb814c41ec670042

gitblog_00704的博客 913

Dagger2实现原理分析

Dagger是一个依赖注入框架,这个框架往往给人一种“高端,但是却很难用“的感觉。我们在使用或者阅读别人的项目时,往往会陷入dagger搭建的”迷宫里”绕不出来。导致Dagger被认为是android史上”最受冷落的优质库”。本文先通过理清依赖注入的概念,然后详细介绍Dagger一些常见的使用场景和注意事项,最后介绍一下Dagger主要功能实现的原理。帮助大家进行理解。

ZH的博客 1652

android dagger2 原理,android – Dagger2没有生成Dagger *类

正如标题所说,Dagger2没有为我的Android项目生成Dagger *前缀类.我查看了我能找到的所有其他类似帖子,但没有任何帮助.我正在尝试将它添加到现有项目中,并且我遇到了一些初始问题,使其能够很好地处理数据绑定,但我似乎已经对其进行了排序,即数据绑定没有编译错误,并且它为它生成代码.我还下载了几个工作正常的示例项目.我的顶级graddle文件有classpath 'com.neenbed...

weixin_29200741的博客 286

抖音自定义卡片链接(图文链接)

抖音自定义可以自定义标题,打开链接,和展示图片 效果 主要代码 public void sendMessage(String conversationId, Object aBaseContent) throws Exception { // C233282u5.LIZIZ.LIZ().LIZIZ(LIZ).LIZ(obtain).LIZ(hLn).LIZ((AbstractC59811HHc) new H9Q()); Object HOa = ReflectionUtil

傅恒的博客 4140

Superpowers:可编程AI协作协议与Skill工程化实践

AI编程正从提示词驱动迈向工程化协作新范式。Superpowers并非传统代码补全工具,而是一套定义清晰、可版本控制、可调试复用的AI协作协议——它将AI能力抽象为带输入校验、执行管道、输出契约和元数据声明的Skill(类DSL构件),再通过状态驱动的Workflow编排实现跨平台、可熔断、含人工Checkpoint的自动化流水线。其核心价值在于解决AI生成代码长期存在的不可复现、不可审计、不可交接三大痛点,支撑OpenAPI转TS、Figma转Vue等高复用场景落地。本文深入解析Skill设计四重契约与P

weixin_31124163的博客 377

uv-ui 多端 Switch 开关选择器组件详解:v-model 绑定、异步控制与源码实现

> **组件名:uv-switch**,位于 [uni_modules/uv-switch](https://link.gitcode.com/i/02dba911c43d0fd2fd95333ab30bfc3f)(源码见 [uv-switch.vue](https://link.gitcode.com/i/b8538c14b7c1c046423b6e59bda61deb)、[props.js](

gitblog_00864的博客 269

Bladed风电仿真软件新手必看:从界面操作到功率曲线计算的完整指南

本文为风电工程师提供Bladed仿真软件的完整入门指南,涵盖界面操作、功率曲线计算及动态仿真等核心功能。通过实战技巧和常见问题解决方案,帮助新手快速掌握这款全球领先的风电机组仿真工具,提升风电项目开发效率。

weixin_30839881的博客 102

dagger2之dagger-android简单使用

dagger2的使用便利我就不用说了,google为方便android开发者进而推出了dagger-android,这里附录官方文档:[https://google.github.io/dagger/android.html] 需要增加依赖: compile 'com.google.dagger:dagger:' + dagger_version compile "com.google

罗春娥的技术园 2117

Fedproto:原型聚合的联邦学习框架

文中说明,联邦学习通过计算传递梯度聚合模型时,客户端之间的异构性通常会阻碍模型优化收敛和泛化性能。故本文提出新的FedProto框架,将梯度替换成为原型,通过计算、聚合从不同客户端收集到的本地原型,然后将全局原型发送回所有客户端,以规范本地模型的训练。对每个客户机进行局部训练的目的是最小化对本地数据的分类损失,同时保持生成的本地原型足够接近相应的全局原型(损失函数最小+正则)。什么是原型?文中提到:“

weixin_47754029的博客 2650

数字图像处理基础实验(二):直方图均衡化

一、实验内容及原理 1、计算灰度图像的归一化直方图 具体内容:利用 OpenCV 对图像像素进行操作,计算归一化直方图.并在 窗口中以图形的方式显示出来 步骤: (1)初始化一个256大小的数组,存放图像中每级灰度值的像素点的个数 (2)遍历整张图像 (3)归一化数组 2、灰度图像直方图均衡处理 具体内容:通过计算归一化直方图,设计算法实现直方图均衡化处理。 步骤: (1)读取该像素点的灰度值 (...

lyd1995的博客 4527

【Android】Dagger2 + MVVM

背景 一个标准的Android的MVVM架构是分层规划实现的,各层之间有清晰的依赖关系。借助Dagger2完成MVVM各层所需的依赖注入,可以让项目结构变得更清爽和更可维护。 虽然Dagger2有一定使用门槛,但是MVVM的项目结构大都相同,实现一个Dagger2+Retrofit2(+OkHttp3)+ViewModel 的最小构成实践,对其他类似项目具有一定参考意义。 构成 1. g...

移动端开发干货分享 2295

YOLOv11火焰识别:从环境搭建到GUI部署的完整工程实践

目标检测是计算机视觉的核心任务之一,它通过定位和分类图像中的物体,为机器赋予“看懂”世界的能力。其原理通常基于深度学习模型,如YOLO系列,通过卷积神经网络提取特征并预测边界框与类别。这项技术的价值在于将算法能力转化为实际生产力,广泛应用于安防监控、工业质检、自动驾驶等场景。在工程实践中,环境配置的稳定性与数据质量往往决定项目成败,而模型部署的易用性直接影响最终用户体验。本文以火焰识别这一具体应用为切入点,详细解析了如何利用YOLOv11完成从零到产品化的全链路流程,其中涉及Conda虚拟环境管理、PyTo

weixin_29483277的博客 236

你还停留在使用Dagger2吗? 带你一步一步走进Dagger2的世界

Dagger2是一个依赖注入框架 1.什么是依赖注入? 就是目标类中所依赖的其他的类的初始化过程,不是通过手动编码的方式创建 将其他的类初始化好的实例自动注入到我们的目标类当中。它也是面向对象的一种设计模式, 主要作用就是降低我们程序的耦合。 讲述两个场景来描述一下Dagger2: 1.在一个对象里创建另一个对象的实例。这种行为就会产生耦合现象。导致代码难以维护。 2.Picasso...

wk_先森的博客 2万+

Qt:一个强大而灵活的跨平台应用程序开发框架

代码示例中的源代码是简单的示例,用于演示Qt框架的一些基本特性。实际应用中,开发人员可以根据自己的需求和项目要求,使用Qt框架提供的丰富功能和组件进行开发。在Qt的官方文档和示例代码中,您可以找到更多详细的教程和示例,以帮助您更好地理解和使用Qt框架。它提供了丰富的工具和功能,支持跨多个平台进行开发,并具有高度的可定制性和灵活性。它提供了丰富的工具和功能,使得开发人员能够创建高性能、可扩展和易于维护的应用程序。下面将详细介绍Qt框架的优点,并提供一些相关的源代码示例。

CodeVorter的博客 866

黏菌优化算法(SMA)详解:从生物智能到优化引擎

黏菌优化算法(SMA)是一种新型生物启发式优化算法,模拟多头绒泡菌的智能觅食行为。该算法包含接近食物、包围食物和抓取食物三个阶段,通过数学模型将生物行为转化为优化过程。SMA采用权重自适应机制和参数振荡模型实现探索与开发的平衡,具有参数简单、收敛性好等优势。算法可通过MATLAB/Python实现,并应用于函数优化、工程设计和神经网络训练等领域。研究表明SMA在求解复杂优化问题时表现优异,未来可通过混沌增强、混合策略等方式进一步提升性能。

qq_42212808的博客 661

Andriod-Dagger2

参考资料: https://www.jianshu.com/p/1d84ba23f4d2 https://mp.weixin.qq.com/s/lh3dgJK95cgbG-bUZfvbFA 听说好多开发者采用Dagger2+RxJava+Retrofit+mvp结构来进行开发,虽然Dagger2已经出来好久了,但一直没有进行总结,今天所以有必要总结一下Da...

薛之涛 4002

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Dagger2进阶学习

通过上述的步骤,就可以完成对Activity的注入,但是整体略显繁琐,当我们想要注入某个Activity中,就必须要创建该Activity的Component,而且这些代码都是模板代码,不需要动脑子,另外每次增加一个Component,就要在ActivityModule的Subcomponent集合中添加它。另外还提供注入到Application类中的注入方法inject,值得注意的是,inject方法中的参数为我们自定义的App类型,而非Application类。// 获取Application对象。

2401_89873089的博客 699

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Dagger 项目教程

Dagger 项目教程 【免费下载链接】dagger 一个开源的运行时,用于可组合的工作流程。非常适合 AI 代理和 CI/CD。 项目地址: https://gitcode.com/GitHub_Trending/da/dagg...

gitblog_00582的博客 1045

Dagger使用详解

Dagger 使用 电脑与CPU 开门见山,来看一段常用业务代码。 以电脑为例。每一台电脑都需要CPU。所以在定电脑的时候,需要将CPU作为参数传入。 public class Computer { CPU cpu; public Computer(CPU cpu) { this.cpu = cpu; } public CPU getCpu() { return this.cpu; } } public class CPU {

Yul丶Wu的博客 2709

Dagger2 + 最新dagger.android

Dagger2这枚大名鼎鼎的匕首,相对于Rxjava、Retrofit、Okhttp等可能是最难上手的的框架了;许多人都学习它不下数遍,网上的教程也都是从入门到放弃、再从入门到放弃,如此反复才最终恍然大悟;这其中也有许多人看了一两遍之后对他望而却步。 Dagger是安卓界最棒的依赖注入框架,第一代由大名鼎鼎的Square公司共享出来,第二代则是由谷歌接手后推出的。 很多小白对于Dagger2...

博艺的技术专栏 1520

从Dagger2基础到Google官方架构MVP+Dagger2架构详解

博客原地址:http://www.jianshu.com/p/01d3c014b0b1 1 前言前段时间分享了一篇文章:google官方架构MVP解析与实战 ,针对这是对google官方示例架构的一个分支todo-mvp/ 的项目解析与实际运用,google官方示例架构项目googlesamples/android-architecture 目前还有两个分支在开发中 在我的前一篇文章分享的时候

安东尼的博客 1万+

将基于Dagger-1开发的项目迁移到Dagger-2中

原文链接 : Dagger 1 to 2 migration process 原文作者 : Miroslaw Stanek 译文出自 : 开发技术前线 www.devtf.cn 译者 : chaossss 校对者: tiiime 状态 : 完成 我相信每一个 Android 开发者都听说过依赖注入框架,事实上几乎所有 Android 官方会议都讨论过软件设计模式。虽然

追风筝的吃货,汪~ 1502

Dagger实战案例:从入门到精通

Dagger实战案例:从入门到精通 【免费下载链接】dagger 一个开源的运行时,用于可组合的工作流程。非常适合 AI 代理和 CI/CD。 项目地址: https://gitcode.com/GitHub_Trending/d...

gitblog_00860的博客 437

Dagger2使用详解

目的 本文主要探讨Dagger2的技术实现原理及使用方法,可以让读者快速上手Dagger2。 Dagger2介绍 2.1 Dagger2是什么? Dagger2在Github主页上的自我介绍是:“A fast dependency injector for Android and Java“(一个提供给Android和Java使用的快速依赖注射器。) Dagger2是由谷歌接手开发,最早的版本Dagger1 是由Square公司开发的。 2.2 Dagger2相较于Dagger1的优势是什么? 更好的性.

知识空间 2487

Dagger2和它在SystemUI上的应用

和人类需要群居一样,程序界的进程、线程也需要通信往来。它们的交流则依赖模块之间、文件之间产生的关系。如何快速地搞清和构建这种关系,同时还能减轻彼此的依赖,需要开发者们认真思考。 我们将这种需求称之为依赖注入(DI,Dependency Injection),这个编程技术由来已久,在讲述之前想来简单回顾下依赖和关联的基本概念。 依赖和关联 像下图示意的那样,模块或类之间的关系大体可以分为依赖(Dependency)和关联(Association)两种。依赖一般表现为局部参数,关联则表现为属性的持有。 ..

allisonchen的专栏 5119
上一篇: DevStream 概览——开源 DevOps 工具链管理工具
下一篇: 从零开始快速搭建本地 Kubernetes 测试环境
DevStream
博客等级 码龄5年 1粉丝 15原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值