柯南2.0 @ CPPCon 2022有什么新消息

2023年1月20日

2分钟阅读

在柯南1.0发布后的4年多时间里,我们一直在从c++生态系统中学习,见证它的成长;从数以万计的用户和客户(包括世界上许多最大的c++相关公司)的对话反馈中学习许多经验教训、挑战和行业趋势。这次演讲总结了其中的一些经验教训,以及它们是如何被用来创造新的主要版本的柯南。例如,虽然许多人提倡只使用头文件或始终使用静态链接,但使用共享库,特别是链接和嵌入其他静态库的共享库,在业界是一种非常常见的模式。柯南2实现了超越CMake私有/公共使用需求的“需求特征”,允许指定复杂的依赖关系图,包括引导、工具交叉构建、私有依赖关系等等。

许多团队生成的库、应用程序、sdk或其他工件需要由使用不同技术(如Java、Node等)的其他团队部署或使用,而不使用Conan。Conan 2新的“部署器”,可以由用户定义,允许轻松提取工件,以及自动创建Debian软件包,Windows安装程序或任何其他类型的派生工件。

有许多企业,非常大的C和c++项目需要管理二进制文件(物料清单),不仅是为了减少构建时间,也是为了可追溯性、安全性、行业政策等。大规模创建和管理二进制文件仍然是一个巨大的挑战。Conan 2提供了更简单的“lockfiles”,允许完全再现依赖关系图,一个新的自定义用户定义的全局二进制兼容性机制,以及更准确地计算当某些依赖关系发生变化时需要重建哪些包二进制文件。

最后,我们了解到包管理是更大的DevOps、持续集成、自动化和开发人员体验难题中的另一个部分,许多用户已经在Conan上构建了不同的自动化层。因此,柯南2发布了一个新的公共Python API(大约65%的用户已经在使用Python来自动化C和c++),以及新的自定义模块化命令来扩展柯南CLI。

演讲者

迭戈·罗德里格斯-洛萨达·冈萨雷斯

    迭戈·罗德里格斯-洛萨达·冈萨雷斯

    迭戈·罗德里格斯

    迭戈罗德里格斯-洛萨达冈萨雷斯的激情是机器人和软件工程和开发。他在工业、机器人和人工智能领域使用C和c++开发了多年。在2012年之前,Diego也是一名大学教授和机器人研究员,工作了8年。2012年,他退出学术界,试图建立一个C / c++依赖管理器,并与人联合创办了一家初创公司。从那时起,他主要使用Python进行开发。迭戈是柯南。io C / c++包管理器的共同创建者和维护者,现在在JFrog担任高级软件工程师和C / c++倡导者。

    视频记录

    大家好,下午好,我叫Daryl,我是柯南脱口秀的创始人之一,今天

    我说的是什么是新的连接到零剧透,一切都是新的连接

    大约有80个代码库是全新的,其中包括我们现有的20个

    反向移植到量子一,使一个可用的子集的语法,所以我们

    将会让我们从食谱栏目转到第一栏目从第一栏目转到第二栏目好吧,我们基本上已经五年了

    没有破坏,那个主要版本包含了所有这些主要的变化

    为什么我们要改变这么多因为在这五年中我们有很多

    反馈内容被广泛使用,它被广泛使用,例如在CPP语言滞后中,柯南频道被排名

    在最常用的渠道中这是上个月的数据这是第二个最常用的渠道

    使用柯南频道的不同用户的每个下载次数约为60万次

    月从python包索引我们也有其他其他版本,如安装程序或一些不内容在这里

    我们在python包索引中被指定为PI中的关键项目,这意味着我们在其中

    下载最多的包的百分比在整个索引中我们当然我们也有很多

    在去年用户的反馈中,我们收到了超过4000个pull请求

    我们维护的GitHub repos,当然我们得到拉请求

    去年我们也得到了这些我们回应了大约2000个GitHub资源

    它是我们的主要支持频道,但我们也做了一些视频通话

    用户和客户这是我们每周都要了解的我们也经常提供大量的直接支持

    与用户相比,我们通常是滞后的,因为我们是“我们”的一部分

    我们也不知道有多少人在使用柯南,因为我们有我们所知道的人工服务器的遥测技术

    去年至少有8000个团队公司在使用

    《柯南》的制作过程中,因为他们的服务器是在线的,柯南的电话也被使用过

    反馈非常多所以我们成立了一个工作小组

    聚集了来自不同公司的大约70人就像他们中的一些人一样这是一种反馈

    小组中,我们一直在迭代柯南到零的建议,我们从他们那里得到了教练的反馈

    我想说非常感谢大家因为我们称之为部落筒仓部落因为

    没有他们,就不可能有视频内容,所以今天我的演讲,我已经组织好了

    我们从这段时间的生态系统和《柯南2》中学到了5个重要的教训

    为了解决这些问题,让我们从第一个开始

    第一个学习飞行因为我们从一个相对简单的方法开始,我们一步一步慢慢地开始

    我们做的第一件事就是制作我们称之为柯南五人组的食谱

    将它们称为配方,它们包含了如何从源构建包的说明和方法

    Source方法,build方法,packets方法,然后是定义如何构建的下一步

    从源中定义依赖关系,因为我们正在构建依赖关系和包管理器

    然后我们引入需求属性食谱在这种情况下,我们有这个游戏

    应用程序是模拟一个小视频游戏

    构建游戏应用程序,我们依赖于一个引擎引擎包,我们表达

    即在游戏包的列文件中带有一个要求相等的引擎

    同样,引擎依赖于数学包上的数学库,它被表达为它对数学的要求

    在包中附上请求,这样当游戏开发者第一次需要制作游戏时就可以开始工作了

    它会做的是图标和安装它们会做account和安装它们会得到依赖项它们的依赖项引擎和它们的传递

    他们得到的第二件事是为他们生成的内容

    这样它们的构建系统就可以定位这些依赖项

    为cmake生成两个文件好吧,我在所有这些例子中都使用cmake,但是如果

    你不知道柯南集成了任何构建系统,包括Ms构建自动工具梅森,我们都有互动

    你也可以用自己的系统,但我用cmake,因为我觉得URL不太好

    这个case列将生成两个SEMA文件,这将帮助游戏定位这两个依赖项并进行链接

    但后来我们开始从生态系统中学习是的,我们认为

    静态连杆开始连杆在大多数情况下已经足够好了,但不是这样的

    有很多用户,我想大概有一半的公司用户使用的是共享的

    在一些地方或其他地方的图书馆,他们向我们提出了这样的案例

    一,我们有一款游戏,但是我们有两个版本,其中一个用于引擎附件库,另一个是

    在这两种情况下使用引擎作为静态库,我们可以假设数学将是一个静态库

    好吧,但在这两种情况下,柯南你都要给我你要给我的数学文件

    你总是给我一个数学目标,但我不需要和一个大目标联系起来,因为当我使用

    游戏引擎作为搜索库的数学库是一个实现细节的引擎,我没有直接

    可见性,所以我不想与mat库链接,所以请不要为我们生成这个

    所以在那个阶段,我们基本上是在要求我们学会飞行

    我们做不到,我们不知道怎么做因为我们没有模型来表示我们有

    很简单,需要相等的定义

    所以我们决定想出一些新的东西,这是尽可能连接到零的新建议

    看,它和量子方程是一样的但关键是我们

    启用UConn提供给require的其他可选参数

    在这种情况下,我们在这里表示引擎包需要

    头文件和日记从数学包中的数学库,好的

    翻译当引擎开发人员在引擎上工作时,翻译出数学配置

    文件将生成,它将包含来自头文件和库的信息

    但现在开发者可以开始表达他们想要的东西了

    由于一些原因,引擎根本不使用标头,它有一些我不知道的隐式定义

    接口,所以我知道引擎不会使用报头,所以他们可以把报头直接为false

    这意味着他们会有一个文件删除了输入目录的属性

    以类似的方式,他们可以说,嘿,我不依赖于一些库

    原因是我只使用了数学包中的头文件,请不要这样做

    把你的图书馆给我,因为我不会用它们,我不想和它们链接,所以他们可以把叶子直接放到

    False,这意味着生成的文件将删除目标的链接库属性

    这种方法的有趣之处在于它可以准备我们可以定义一些

    规则,在这种情况下,这些特征从上游消费者传播到下游消费者

    当我们制作游戏时游戏依赖于引擎,依赖于数学,这意味着

    游戏过于间接地依赖于数学,所以我们称之为传递性要求,即The Orange

    盒子就像游戏制帽人需要的数学包一样

    有趣的是,这些交易是如何从上游传播的

    对于下游来说,假设我们知道引擎始终是一个共享库

    因此,引擎包的开发人员现在可以明确地说,我不想传播库

    对消费者的要求意味着传递嘴唇等于虚假

    这将传播给游戏的下游消费者,然后游戏获得的交易将获得数学包

    头错误和库错误,这意味着游戏实际上不依赖

    当引擎是assert时,库知道这些特征,它可以为

    游戏开发者可以定义一个数学配置或对称,这基本上是空的柯南在实践中可以删除它

    好的,但这个想法是,游戏将不再需要连接到数学静态库,因为你有一个

    Assert库在中间这看起来有点麻烦,因为现在

    古兰经配方的开发者似乎应该一直在行业中被指定

    这可能有点太过了,但事实并非如此,大多数时候,大多数时候都是如此

    完全没有必要,因为这些特征可以从我们拥有的包装类型中推断出来,我们有这些信息

    在一些食谱中,因为我们有选项这些选项是搜索库的标准选项

    或者美学库被称为第三种选择如果我们有这个基于价值的选择我们可以推断如果我们

    是静态库还是集合库对于那些我们没有这些信息的情况,我们必须引入这些信息

    content to 0引入了新的包类型,它可以显式地说明某些内容是否为静态库断言

    库,例如头库或应用程序

    让我们看看在实践中,当我在做一个关于我们工具的演讲时,我总是喜欢做现场演示,我知道这是

    有点冒险,所以让我们交叉手指,我在这里建了一个完全一样的

    我在幻灯片中展示的例子,我有一个游戏包,它依赖于引擎,依赖于数学

    所以我现在是一名游戏开发者,我将致力于游戏

    所以我需要做的第一件事就是安装我的依赖项

    我要安装我的依赖项,我要在使用引擎作为搜索库的可执行文件上工作

    所以我指定它为这个引擎1.0

    第三个角等于true,这样转角就会安装我的依赖项

    对我来说,现在我有我的保护程序,我可以打开cmake创建我的项目和

    但我想给你们看两件事首先

    在这里我们可以看到康纳告诉我们的数学二进制的依赖关系

    跳过为什么,因为它已经有一个引擎包,它已经在

    因为它是一个共享库,而且它已经编译过了,所以你根本不需要数学二进制文件

    这个二进制文件可以转义,根本不需要从服务器下载

    第二个有趣的部分是如果我们查一下柯南

    生成了一些cmic文件,但我们没有

    我们根本就不需要数学配置文件,因为如果我们要检查数据,就不需要它们

    在引擎中,在引擎CMC文件中,我们看到依赖项是已知的,它是一个空集,因为对于

    游戏开发者Matt的观点并不存在,这已经是游戏搜索的执行细节了

    图书馆,但如果我们现在尝试

    用默认的语音默认是静态的帐号安装吗

    现在连接的库会告诉我,你需要引擎包在缓存和你

    还需要gas中的math包,因为您将链接到两个静态库

    如果我们检查柯南为我们生成的文件,我们就会看到

    它现在代表了依赖关系引擎和数学之间的传递依赖关系就在这里

    如果我们期望数学文件现在数学文件已经生成了因为现在我需要链接到

    转移性文库我们会看到这里定义了这个文库我们有到

    有趣的是,math包的包含目录是空的,因为

    如果你想在游戏中使用math的header,你就需要在游戏中添加一个明确的require

    这是一个传递头文件默认情况下传递头文件应该被隐藏当我们讨论

    作为软件架构的包是可伸缩性的

    好了,有了这个,我们就能更好地表示图形和Grand to的要求

    零,正确的链接要求与正确的标题可见性,我们也

    允许积极的一面,我们知道这不是很好,但有很多用户有不同版本的相同

    包隐藏的插入库和使用相同的产品在同一时间,是最期望的或您可以找到

    它们比你想要的更频繁,以及我今天谈到的许多其他事情,有三种交易

    实际上大概有八种交易,所以如果你想了解更多关于新交易的知识,我建议你去听我的演讲

    四月在阿库,因为它只献给这部分的

    很酷的一点是这和cmake或其他系统所做的非常相似我们在传播

    联系需求和健康需求但是我们在不同的构建系统中做这些我们可以有一个

    依赖关系图,我们可以有五个不同的构建系统,它们仍然是它们的需求

    正确传播旧的将有幕后工作在不同的构建系统,当然我们需要一个

    兼容的语法,因为我们需要能够从柯南1移动到柯南2

    第二个教训是,当我们谈论开发者时,我们可以假设猫是一种美丽的权利

    或者也许也许在我们的例子中不是我在说什么我在说什么

    二元模型和我们在讨论二元模型时犯的一个大错误这就是我们正在做的

    有一个配方,对于我们正在构建的每一个不同的配置,我们可以创建任意数量的二进制文件

    每个二进制文件都由一个唯一的目标ID标识,这个包ID是它的一半

    配置的散列是这样的意思是如果我们改变了一些东西

    在这种配置中,我们在静态或确定的情况下更改库,我们得到不同的配置,我们得到

    一个不同的包ID,因为二进制文件是不同的,或者如果我们改变架构相同的不同配置不同的包ID

    因为这是一个不同的二进制模型,这是一个简化的视图

    完整视图也会考虑到依赖关系,因为如果您要与依赖关系链接

    在这种情况下,依赖项也会影响具有完全相同的编译器设置体系结构选项的二进制文件

    如果你改变了依赖关系,使用了不同版本的依赖关系最终的二进制文件也会不一样

    我们试着用的问题和我们说好的问题有什么不同

    我们讨论的是版本对不对十二月可能是错误的这是行业的默认值对吧

    我们决定使用chamber,我们对十二月的解释就是这个意思,我们有这两个依赖关系图

    一种情况下,我们使用数学1.0,另一种情况下,我们使用数学1.3

    这是可能的因为两者都满足热机的范围

    范围在1到2之间所以两者都是对引擎的完全有效的要求吗

    但是对于包ID透视图,对于二进制透视图,我们可以理解

    12月规范中打破major是新二进制的意思

    所以我们说,这两个东西都是符号兼容的,因为变化

    小调是一种简单的兼容,它不会破裂,所以我们假设这是正确的方法,意思是

    这两种情况下,引擎二进制都是完全相同的,应该是完全相同的

    如果我们想要两个不同版本的引擎包的二进制文件

    我们需要对数学包做一个大的改动在这个例子中

    我们有数学1.0和数学2.0来告诉他们他们会做什么

    创建一个新的表达式一个我们将适合于配置的新表达式

    这将导致一个不同的包ID,但如果我们有矿工只有

    0和3的等价表达式是1·y·

    在这两种情况下都设置,从而产生相同的配置,从而产生相同的包ID

    事情是这样的,当一个项目出现时,我们的C + +是主要原因

    举个例子,我的意思是,在去年,boost从来没有出现过,这是主要的原因,在C

    加上加上生态系统我们对成员的理解有点不同所以对我们来说是第一个

    版本是一种非常具有挑战性的东西,当这个变化完全破坏了一切

    突破性的变化通常是在次要的,所以增强版本是

    打破每一个释放都是打破和和,他们只会撞到

    小版本,但这里最重要的是本地编译模型,当我们链接一个共享的

    带静态库的库这或多或少就是发生的事情我们这里有Ruby的本机代码

    我们在Windows和引擎时构建了dll搜索库

    它从数学静态库中获取一个拷贝然后嵌入

    数学静态库的本地代码,它将代码嵌入到引擎搜索库中

    优化可以发生,我认为这是一个调试构建,但主要思想是它实际上是嵌入的

    在引擎工件中复制它,这是在其他包管理器中不会发生的事情

    我们说的是python和Maven,它是二进制文件或者包

    他们的模式并不是本地的所以腔室对他们有用,而是我们的

    在这种情况下,它有点不同,这意味着我们必须使用一个新的包ID模型来处理两个主要用例

    第一个用例是非嵌入的,比如

    当应用程序在assert Library okay中使用时,在本例中搜索库是

    如果assert库使用另一个搜索库或静态库,则未嵌入可执行文件中

    在所有这些情况下,使用另一个静态库不会发生本机代码的嵌入

    对于这种情况,我们选择四角为零的次要模式的意义

    开发者现在必须控制如果你升级了小版本意味着你得到了一个不同的二进制文件

    但如果你只碰撞补丁版本,这是一个模式实现细节,这意味着二进制ID包ID

    不会改变,这意味着你不需要重建我们现在会在实践中看到这个吗

    另一方面,如果我们在管理嵌入情况,这发生在我们身上

    在静态库中链接应用程序可执行文件,或者当应用程序在头库中链接时,或者在

    搜索库链接在一个静态库或我们的标题库在所有这些情况下嵌入

    本机代码正在发生,内联正在发生,对于这些情况,这意味着无论如何

    在你的依赖中发生了变化,你需要重新构建你需要一个新的消费者二进制文件,所以我们所做的就是

    依赖的完整引用,包括完整版本的修订,这是一个隐式版本,我们

    管理和包ID本身,因为如果二进制文件发生了变化,你仍然需要重新编译

    重建对消费者的回应,当然所有这些你都可以

    现在配置它,但最重要的部分是这个双重模型让我们在实践中看看它

    当我们在开发这款游戏时,有时数学团队会

    发布一个新版本,让我们看看柯南创造了什么

    他们打算发布Apache版本在这种情况下他们做了一个

    一些CPP文件中的小错误和实现细节,因此他们修复了

    他们创建了一个1.0.1版本的补丁

    这里的关键问题是这对我的消失有什么影响换句话说,我需要重建什么

    好了,现在我可以试着创建游戏了

    但我将向你们展示一个新的内容命令,也就是当前的图形

    为游戏建立秩序

    告诉我丢失了哪些二进制文件,以便柯南分析依赖关系

    它知道数学现在它现在有了一个新的版本

    这是一个详细实现的引擎静态库

    不需要重新构建,您可以重用以前的二进制文件,因为我们假设您不需要这样做

    如果更改是在数学CPP文件中完成的,则不需要重新构建

    引擎和引擎库,但在这种情况下,我们需要重建游戏

    游戏是适合重建的,因为它需要重新连接发生在数学中的变化

    好的,同样的,现在我们要求账单

    如果我指定了

    引擎作为搜索库

    现在它会告诉我这里的方法它被创建了你需要创建引擎现在是引擎搜索

    库必须建立,因为上游有一个变化,影响到你,你得到一个新版本,你需要做一个

    但是一旦你重新构建了引擎插入库,游戏应用就不需要重新构建了

    因为它链接在搜索库中搜索库会嵌入数学的变化,但它不会

    真的需要游戏的每一个环节都是清晰的,你可以想象这是

    这个规模很简单,但是当我们讨论的时候我们了解到我们的用户他们有典型的依赖关系图

    比如有100个200个包,所以它开始变大,现在我们的用户接近1000个

    数据包标记,所以对他们来说,知道什么时候在图的中间有什么需要改变是非常重要的

    以最优的方式在下游重建依赖关系图当然可以

    在命令行上有点奇怪,但是

    当然,这是为了自动化,如果我们检查这个命令的Json输出,我们看到Json

    这个命令的输出将为我检索到一个需要重新构建的东西的列表,以便我可以接受这个输入和

    我可以并行化所有需要在这个尺度上显示的东西,因为

    柯南会告诉我什么需要重建,以什么顺序重建,以及如何将它们并行化

    好了,我们来清理一下

    好了,最后我们需要的模型不是猫也不是狗

    二进制表示在CNC加上本地建筑,如果你想是多一点

    复杂的是,它有点像混合的东西,有一个混合我们需要区分嵌入式模式

    如果你在依赖中改变了任何东西,你需要重建它的下游消费者

    依赖关系,在没有嵌入的情况下,我们有完全的控制权,我们已经决定了一个允许的策略

    开发人员明确地说,如果消费者需要重建或不取决于变化,当然

    用户也可以自定义这个行为,是的,这将是一个主要

    所以这些东西就像是与图表以及横幅是如何计算的相关

    我们学到的另一个重要的教训是,人比开发者多,我们有一个非常优秀的开发者

    中心视图,我们只关心包和让我的应用程序运行,但我们也开始了

    要了解这些公司中的许多公司也有完整的开发团队

    他们需要得到那些你构建的东西这些东西都在列包里他们想把它们放进去

    作为不正常的包分发到服务器,或者它们需要分发到服务器

    不知道为他们的用户为他们的客户创建一个船,因为他们不打算分发量子包

    我们也了解到他们的生态系统是非常固执己见的

    你可能比其他语言懂得更多这是典型的对话我们和用户

    希望他们的二进制文件不是在柯南现金柯南当你安装一些东西时,它把它放在一个地方

    一个结构,它可以很好地管理它,但开发人员问,嘿,我想要这些二进制文件在我的项目,我们

    嘿,这没有技术上的优势实际上只有缺点和

    谈话结束,我说,好吧,我想在我的项目的横幅,所以项目的问题基本上是

    同样的,有人想要二进制文件,在列包内的工件,他们想要它们出来

    希望它们在用户文件夹中,他们希望在量子包之外使用这些工件进行自动化操作

    所以我们在2000年开发了部署人员概念部署人员是

    外部脚本它是一个python脚本,它实现了这个逻辑

    从量子包中提取东西并对它们做一些事情实际上有几个不同的层次

    你能把这些部署器放在文件夹的某个地方吗

    可以自动安装到您所有的开发人员和CI机器上

    Cone和config install命令,最后我们还有一些内置部署器

    让我们来看看这个好吧,我先给你们看一下

    内置的完全部署是实现这种情况的一个固执的C +开发人员,他们

    想要依赖的项目,所以如果我正在开发的

    我现在是游戏的开发者,我可以指定我想要使用这个部署器

    好的,显然一切都是一样的,但是如果我们现在检查我们的项目

    我们会看到我们有一个引擎的二进制文件的副本

    我们将有引擎的头文件我们将在这里有库

    对于数学,我们也有头文件和库等等

    在我的项目的副本中,还有开发人员真正想要的东西

    如果我们检查生成的cmake文件,这些cmake文件现在指向no

    命令缓存但对我当前项目中的部署副本意味着

    我刚刚做了一个文件夹,里面包含了我可以删除柯南的所有东西

    为我的系统,只是相同的文件,我在我的文件夹和这些工件的本地副本,我

    我可以用这些依赖项来构建我的应用程序,我们来看看

    对于开发工程师来说,他们需要创造他们想要创造的东西

    例如,为他们的客户打包,他们所需要做的就是

    是押韵到鼠到对不起自己写部署和球员的样子

    像这样,这个部署器迭代所有依赖项

    对于每个依赖项,都要查看二进制文件夹

    如果它在二进制文件夹中找到DLL或其他可执行文件,它将复制该文件

    工件放到当前文件夹中,它会将其存储在一个列表中

    当它完成了所有访问和所有dll的复制

    它会提示他们在活动文件和删除复制文件的意思

    如果部署人员或开发人员想要为他们的客户获得最终产品,他们所要做的就是打电话

    我想部署这个

    版本的游戏,我将使用深对不起我

    希望显式地部署使用引擎作为单元库的那个

    我将使用我的自定义部署器来部署它

    好了,柯南,这是他的东西,我们可以检查一下,现在我们有了这个运行时间船

    在这里和运行时压缩包中,我们将看到我们有游戏可执行文件,我们有可以发送的DLL

    客户

    好的,对于其他玩家我们了解到除了开发者和公司之外还有其他人

    他们还希望自动化一些任务,因此我们创建了这些部署器,作为从缓存中提取工件的灵活方式

    为了自动化一些邮政编码创建了异常的包裹或其他类型

    安装程序是很重要的,因为在《柯南一号》中,这个功能被嵌入到食谱中

    一些等价的东西叫做Imports和deployed的方法和recipe但这不能扩展,因为

    通常,您希望拥有部署功能,并希望将其应用于许多不同的包

    我们将部署的功能提取到它自己的专用文件中,最后您可以管理这些部署器

    用一个简单的命令,你可以把它们放在一个repo中,然后执行connect config install这个repo,它就会安装

    你的公司或你的团队的球员进入你的当前安装,你将能够管理他们

    好了,我们学习了第四课,重复自己的重要性

    为什么因为我们了解到公司需要在今天和10年内复制完全相同的构建

    医疗部门绝对是疯了,他们还需要保留硬件的硬件副本,这样他们就可以

    业务完全一样,这也适用于依赖项,因为依赖项改变了它们改变了它们

    不仅要知道依赖项的新版本,有时还要知道某人修复了某个依赖项

    不改变版本,我们称之为修订,所以有时事情会改变,但仍然在那里

    这是否需要重复的东西这是我们想要解决的问题基本上是游戏的开发者

    有些点数据无法安装引擎1和数学1点0

    一切都在发展,一切都很快乐,一切都很完美,然后发生在数学团队

    他们决定在游戏开发者发布后第二天发布新的1.1版本

    进入他们的机器,他们做角落安装,因为数学包

    满足的范围,现在依赖关系将是不同的,如果有一个新的错误在数学或那里

    是改变行为的东西他们会很好这里发生了什么我没有改变任何我没有改变的东西

    我的要求,因为我仍然需要1.0引擎,但我仍然看到

    我如何才能摆脱这种不同的行为,这是日志文件解决的问题,在这种情况下的游戏

    开发人员可以说,嘿,我安装了我的依赖,但我捕获了一个日志文件

    它看起来像这样,日志文件基本上是

    它捕获了依赖项的版本,所以无论数学团队

    决定在游戏开发者到达办公室后发布新版本并安装他们提供的软件

    将日志文件作为输入,他们将设法获得完全相同的依赖关系图

    这是存在于其他包管理器中的概念例如在npm和Conan 1中

    实现的日志文件很好唯一的问题是它们如此具有挑战性,因为

    依赖性图,我想我稍后会讲到这个,我给你们看一个

    关于日志基金的重要性在过去的两年半里就像GitHub的10个问题

    是否与日志基金有关或者他们提到了日志文件,因为

    有时候,当你在管理依赖关系时你必须做出决定你要么明确地把所有的

    在你的需求的修订,这意味着当一个新的版本发布的一些依赖,你想

    要开始使用,您需要去到您需要修改的项目,并显式地更改您的需求点

    对于新的发布版本,这是你完全的控制,但这也可能是麻烦和缓慢的

    所以在这些情况下,有些人是开发者,他们想要更快,而更快的方法就是使用

    版本范围,例如,我接受这个范围内的任何版本,但是

    当你开始使用版本范围的时候,你开始移动得更快,你移动得更快,事情可能会中断,你要么需要

    Ready to move forward非常积极地前进,这意味着当有什么东西坏了,你会迅速地去修复它,继续前进

    一直以来,或者如果您需要某种平衡,您需要捕获日志文件,以便能够重现某些内容

    因为否则调试或维护是一场噩梦,我们估计大约是25%到40%

    目前有很多用户在使用日志文件,对日志文件的实际需求是

    是巨大的,我们在其他生态系统中看到过,比如NPM,最后在很多情况下维护日志文件是非常必要的

    所以我们学到的是这是简单的

    日志文件的情况下,日志文件在量子一号他们设法实现这一点,他们管理的主要问题是

    每个配置必须捕获一个日志文件,这是一个主要的挑战

    发生在柯南的依赖图上的决议并不是完全确定的,所以我们需要捕捉

    完整的依赖图在日志文件中然后那是那是依赖图可以改变为不同的

    配置,因为有条件要求,所以你需要一个日志文件

    二进制的,但这在量子1中也是可行的这就是我要在这里展示的

    几乎不可能,数学团队发布了数学1.1,但我们没有

    如果我们登录到数学1.0,我们不会使用数学团队的疯狂版本,他们不知道是什么

    他们已经做了很多次了,但我们需要发布一个新版本的游戏

    引擎,现在引擎团队是我的朋友他们发布了引擎1.1,我想测试一下

    使用引擎1.1再次发布游戏,但它应该在

    还是数学1.0版本,因为我不想拉新版本,所以我想要这个

    如果日志文件告诉我,嘿,你正在锁定数学,你正在寻找,我怎么能做到这一点

    引擎到1.0版本,但我想改变引擎,但我不想改变地图,但你怎么知道它非常

    很复杂,这是我们从生态系统中学到的问题

    企业总是有规模是一个挑战因为我告诉过你们

    典型的依赖关系图大约有200个包,但问题是

    他们也有200名开发人员,他们的开发人员正在做拉取请求

    同时处理不同的包,唯一保持理智的方法是每个pull请求都需要

    独立于其他团队正在发布的其他新版本的其他更改进行测试

    你可以构建一个拉取请求,在拉取请求的中间出现一个新版本,Linux的第一个账单是

    使用math 1.000, Windows中的第二个版本是pull method 1.1

    并不是要用数学1.0来理解隔离

    大规模的持续集成对企业来说是至关重要的,我喜欢这样想

    随着时间的推移,编程就是软件工程,碰巧柯南超越了

    包管理我们了解到最终用户需要这个,所以我们开发了这个功能

    它们让我们了解数据包和依赖关系管理随时间的变化

    当一个依赖项随着时间的推移或多或少地做了devops流行语所说的“ok and we are”时,就会发生这种情况

    从零开始是结合工具来服务于处理它们的devops社区

    开始使用开发C + +和柯南,正如我告诉你的专业

    角到0的对数事实的贡献是它们

    完整的依赖关系图捕获了一个日志文件,他们设法将日志依赖关系与回退放在一个

    简单的列表,这是一个改变游戏规则的东西,这简化了很多事情,这使权力做准确

    我们我们想要的我们我们试着解决它

    好,让我们再回到游戏,我是游戏开发者我告诉过你们的用例

    可以做帐户和安装,我要捕获我的日志文件

    命名为game。log这是for for demo

    目的,如果我们不把它命名为conan。log会被自动使用好的,我要把

    这里显式地显示命令,所以我们正在做的一切都是好的,所以这将在日志中被捕获

    文件,我们可以看一下我们可以看到这是一个简单的列表

    一些用户可以阅读和理解的东西所以如果发生了疯狂的数学

    团队决定发布

    角落创造数学和

    1.1版本还可以,我们不想用它

    这将是相对简单的,因为现在游戏开发者

    可以说,嘿,我想使用现在作为输入在前面的命令,它是输出,我现在正在创建日志文件

    作为输入,我可以提供游戏DOT日志,这将保证

    我还在用一个游戏,抱歉,数学1.0

    好了,现在我要给你们展示的我知道有点复杂,但是

    让我告诉你,这是我们在《柯南》中准备的一个训练,一个三个小时的训练,试图解决问题

    我现在要在一分钟内解决的问题就是我告诉你们我们现在要解决的问题

    引擎组,所以我要去

    抱歉,我要去引擎那边了

    好的,现在我要画一个角,然后创建,我做得很好

    新版本1.1对引擎进行了改进

    当然,我们不想让他们从数学1.1中得到疯狂的改变

    我将提供我创建的储物柜的游戏日志文件

    日志文件

    我要创建一个新的日志文件因为我要做一个更改之前的日志文件包含引擎1.0和

    数学1.0,但我要做一个改变,所以我想要一个结果在日志文件中,我要

    日志文件输出相等吗

    首先要保证的是我们使用的是数学1.0

    它会产生引擎的变化,如果我们期望的话

    在新的日志文件中,我们现在将有趣地看到我们有两个版本的引擎1.1和1.0

    这没有问题,现在我们回到游戏开发者那里,我们想要

    测试他们得到的东西,引擎团队做的,我们做一个骗局和创造

    我们提供了日志文件

    很抱歉引擎团队这么做了

    能保证完成吗

    这将保证我们将使用引擎1.1,但我们仍然会

    锁定数学1.0,如果我们检查

    这个执行的输出我们会有效地意识到我们在拉

    引擎1.0的变化,但数学目标仍然是数学1.2

    不好意思是时间不对哦这样就坏了

    好的,好的,谢谢,日志文件日志文件归零

    大型石油公司是否能够在一定规模上改变游戏规则

    一种开发人员可以理解的简单方法,因为这些日志列表至少需要

    您可以合并它们,您可以合并来自不同产品的日志文件,如果您愿意,您可以手动添加版本hth华体会最新官方网站

    如果你想在你的目录中强制使用特定的版本

    你的依赖关系图,好的,上节课

    你是一个开源的维护者,然后你开始收到很多特性请求

    功能请求,比如,嗯,你能做吗,拜托,我无法安装,但之后,我想,呃,或者打电话

    和创建,但可以自动删除临时构建文件夹,请我们可以添加一个

    配置,将自动删除临时构建文件夹为我或我想要安装

    要在一个命令中自动安装调试和发布配置,请将语法添加到

    命令行,所以我可以做到这一点在一行,而不是两个角落安装与

    不同的参数,或者我们可以用命令创建,然后用配置或者用命令行

    参数做上传到服务器后,只需创建内容,然后

    你意识到,如果你开始做这些功能,复杂性就会消失

    天空的命令行真的很混乱,所以这当然是你不能做的事情,这是不可能的

    因为它会在很大程度上污染你的CLI但是我们从

    社区是大约50个大团队使用的

    他们在创建自己的图层主要是用Python的自动化在角落的顶部,所以看起来他们没有

    当然,他们想要工具,他们想要专栏,他们想要一个可以在上面开发的框架

    好的,当然我们这就是我们没有做的

    我们创建了一个基于用户自定义命令的框架,基本上就是那些Python脚本

    您可以将它们转换为具有特定语法的命令命令

    这些命令可以安装在您的开发人员的Conan客户端中

    对于您的CI,只需使用与我们用于配置文件设置和部署器相同的Conant config install命令

    其他一切外来代码最重要的是

    关于用户命令,现在他们将能够建立在一个公共的

    因为我们有一个共同的API我们有这个API基本上是命令的并行

    命令行命令它们一一映射到一个API

    在Quantum 2中,我们正在创建一个完整的python API,你有一些细节,比如上传API

    您拥有在上传之前发生的所有详细步骤,以及您如何发送工件

    检查需要上传的内容,因为它是否存在于服务器上,您可以完全控制所有这些

    上传安装的步骤以及所有你可以在上面构建的东西你可以在上面构建而不是

    只是一个高级的命令行界面

    这就是命令的样子这是一个非常简单的命令你好

    我们在这里用注释标记它们,你可以有你可以有的命令

    嵌套命令,如果你想的话,我们称它们为Zoo命令

    重要的是,如果您希望有更强的格式不同的命令输出格式,您可以将其实现为

    你可以访问一个漂亮的彩色输出2当然也可以访问API

    最酷的是,这些命令你可以用Conan配置安装它们

    安装在这里你可以你可以使用一个URL,比如git Ripple的URL

    它会从git中获取这些东西放到你的。在演示中,这里是你的星座

    我只使用本地文件夹,这些会复制我文件夹里的命令,然后

    这意味着柯南帮助会向你展示这些命令我看到了

    我这里有一个很好的hello命令当然我可以输入柯南J青蛙

    你好,它将有一个很好的命令行帮助,我可以执行命令将

    打印hello world,或者我可以使用命令加上输出格式

    如果我们想做更有用的事情,Json可以吗

    让我们实现用户想要这样做的情况他们有一个回购

    有一堆食谱,就像柯南中心索引的一种风格,他们

    想要一个接一个地导出所有的食谱,所以他们要求量子导出命令来做这件事

    好的,我们没有这样做但是现在你可以用这几行来做

    命令行参数到您想要导出的Ripple的路径

    里面的所有文件夹如果你在文件夹里找到图标和file。py

    调用Conan导出API,最后捕获的结果

    这个API在最终结果中这就是你要实现的

    柯南·柯南J蛙

    多重导出到我的当前是的,我有抱歉我没有给你们看我这里有一个回购

    几个软件包Ai和物理,这样我就可以指向这里的回购

    对不起

    它会遍历所有的Ripple,导出每一个,我捕获了

    这个命令的结果,所以如果我想看到它,我可以使用格式等于Json

    它会导出每个包,然后返回给我

    导出的所有食谱修订的Json列表,我可以使用该输出进一步自动化到我的目录

    我的流

    好的,这些自定义命令我们对它们也很兴奋,因为它们

    是非常强大的扩展,方便开发人员和CI,它将建立在python API之上

    用真正的积木,超级方便的共享和安装

    对于开发人员来说,它甚至可以是版本,因为你可以在某个分支中放入git仓库

    可以在那里放一个编号的版本C文件吗

    好了,我的结论是这是我们的柯南01

    在这五年里,我们学到了很多东西,这些是主要的

    我们从第一个图模型中学到的知识不足以表示

    我们在CNC和建筑中需要的所有特殊的东西我们需要一个更好的图形

    表示更好的需求特征和包类型,以表示依赖项中的事物应该如何表现

    对于CNC加包图,我们还必须改进二进制模型,因为

    12月显然不是一个好的违约,我们提出了一个新的模型,考虑到当

    原生二进制文件中的嵌入和内嵌会发生并等待,当它们没有发生时,我们也会处理来自

    他们需要把柯南的神器从柯南身上拿出来并以其他方式部署它们

    在部署人员的其他地方,我们也解决了日志的主要问题

    文件和规模的不断整合和我们消除了复杂性

    Conan One日志文件采用了更好的方法,现在可以测试每一个

    对于一个完整的依赖关系图,一个巨大的依赖关系图,有大量的开发人员在做更改

    同时,最后我们创建了一个框架来维持运行

    自动化您自己的自定义命令和您的基于python API

    这并不是全部这是我们学到的五个最重要的经验正如我告诉你们的,与零相关

    非常大,所以还有很多我没有提到的重要的东西,比如缓存

    这可以处理多版本包签名与数据插件,我们正在与六个商店合作

    包签名和其他东西,我对自定义二进制文件很感兴趣

    我们增加了一个插件机制,你可以显式地定义你想要的二进制兼容性

    在编译器版本之间的例子,如果你知道他们我的C我的PRC包他们

    在小版本的GCC 4.1 4.2或任何版本之间具有二进制兼容性

    将其编码到你拥有的插件中你维护你安装的当前配置已经安装好

    会让你在二进制文件的数量上更有效率例如当你升级编译器时

    还有很多其他的优化我们不在电流为0的范围内所以我的结论是电流为0

    将会改变游戏规则和我所经历的一切是的,我做到了

    今天已经发布了,这是测试版,我们会再做两个测试版,好吧,大概是两个测试版

    这取决于它的进展,然后我们就开始了,所以如果你今天在用角一,我们建议你开始用

    试着进行测试并给出反馈,如果你今天没有考虑,你可能会错过你应该考虑的事情

    开始,请从两个0开始因为这是下一个改变的东西如果你有任何问题也可以开始

    内容。这里有我们GitHub的链接,我们的电子邮件和所有的东西,不要犹豫联系我们

    如果有任何关于等价的问题,非常感谢

    如果你们有任何问题请提问[掌声]

    谢谢你嗯是可能传播编译标志从我的项目到所有的

    依赖项,比如如果我想启用杀毒器,我是否可以在项目中设置

    自动传播工具依赖你可以传播传播

    发生在两个不同的方向,所以你可以有一个包,例如,我们称之为CPP信息

    您可以在那里定义cxx flex,并可以注入标记,这些标记将在这些标记所遵循的下游传播

    和我们在交易中看到的规则是一样的,所以如果你把一些CSX标志放在一些依赖项中

    它们将被注入到消费者中,而cxx标志在应用于共享库的情况下将被注入到消费者中

    建立NGSR库,但它们不会向下传播到消费者,最终应用到游戏中

    就讲到这里,但通常情况下你说的是消毒剂消毒剂在大多数情况下

    如果您需要在启用了科学家的情况下构建整个依赖关系图,那么这更像是一个设置

    你想把它建模成一个你可以注入到你的设置中的自定义设置。我也不知道

    也许是编译器的一个子集,它会自动将它注入到所有的配方中,因为一切都应该如此

    建立在科学家的配置下,这比你想要传播的CX效应更重要

    是一个输入,就像你指定编译器版本一样你想指定编译器版本,我想

    使用这些消毒液或指定的标志,所以我们在配置文件中添加了一些,您现在可以指定

    标记它需要像指定一些东西一样,我们也添加了新的

    配置是一种工具。的配置部分中的bill: cxx Flex

    你的概要文件会被注入到所有的依赖关系图中

    所有这些都是包的一部分,就像所有的计算机一样,就像所有的编译标志一样

    您可以对此进行控制,因此默认情况下,像cxx Flex这样的配置项

    它们不是它们不会放在你的包ID中但是你有另一个配置,你可以知道

    我的cxx Flex自动成为包装区域的一部分,当我告诉你你已经满了的时候,你有吗

    对包ID的控制是你已经配置的你可以告诉它我有这个配置

    我想把这个也算进去,谢谢,不用谢

    谢谢你的聊天,从柯南一号到佳能2看起来非常令人兴奋的变化。实际上我有两个问题

    一个是关于你刚才提到的特质要求比如我想要标题或者

    不是,它控制了什么进入cmake包的配置文件

    这是否处理冲突,如果多个库在我的在我的依赖树

    依赖一些东西,有些人想要那些的头文件之类的东西这是一个很大的语言

    已经意识到交易是牛市,而不是与类型的牛市

    让一个公共接口私有,我们决定用公牛,因为有

    除了这三种情况之外,还有第四种情况你还需要处理不依赖任何东西的情况

    好的,哪一个是加拿大的公共接口,所以我们做了它们

    布尔值,因为在一天结束的时候,它是一个掩码所以当你有钻石,你有冲突

    依赖图不是冲突图,而是菱形图如果你有不同的特征

    交易是一种语义,它们是附加的,所以基本上如果你有一个交易,你需要的标题

    无论其他分支说什么,您都希望传播这些标头,因为最终用户会这样做

    获取它的头文件,因为一个分支说他们希望库的头文件相同

    因此,所有的交易都是用这种语义构建的,它们是相加的,这样我们就可以处理依赖关系图

    好的,谢谢,我的另一个问题来自于我之前和康纳一起工作的经历

    它可能是千字节之一

    当运行con和create时,有时我发现自己需要一些构建时间

    包的实时配置,比如这是某个东西的路径或者类似的东西,如果它

    done作为一个选项,它将传播到包ID和Etc,所以有没有办法传递一些let 's

    比如说创建时间参数提供

    自定义用户输入现在是新的配置,所以配置既为内置配置,也为内置配置

    我们有,但也有user。任何你可以管理的用户配置,你可以阅读那些

    配置你的食谱做任何你想做的基本上你有完整的代码

    从试图成为一个更聪明的柯南变成了一个开发者和用户

    控制一切,他们有完全的控制开关和一切,在这种情况下,配置

    我们已经启用了用户类型配置

    谢谢,非常好

    谢谢你回到头发繁殖和图书馆

    传播概念当你指定header = false时

    需求是说我们正在使用的包我们现在正在构建的包将使用头文件,但是我们

    如果header = false,则不会传播它们

    当前包不使用of的头文件

    我可以给你举个例子,比如神话中的protovast包,它包含

    头文件是库,它还包含proto-c编译器所以当你依赖于protob

    在构建上下文中,您将header设置为false,并将叶子设置为false,然后运行

    runtime = true因为你只需要在构建环境中访问运行时所以这意味着

    不要这个包的头文件,这就是传递头文件和传递叶文件的意思

    那些定义这些东西如何传播到垃圾箱的人

    消费者,好的,这里有一个传输头,好的,是的,这里有一个传递头,它在

    幻灯片上有传递标题和传递椭圆,听起来很好,谢谢

    谢谢,还有问题吗

    所以创建新的日志文件我记得有一些食谱

    需求表单等等那么你如何获取

    你知道,你知道,你知道,是的,这是一个非常好的问题,有很多文件,所以我说过,现在你只

    需要一个日志文件来捕获所有可能的配置,如果您有变化,您有条件

    你需要做的是你需要做柯南柯南安装

    您想要锁定的所有配置都在日志文件中作为输入和输出传递,并且它将保留

    添加一些在某些平台上是有条件的新东西

    很酷的是,即使它至少对所有构型都有效所以它是有效的,所以你只

    需要一个接一个地调用不同的配置,另一个提供日志文件

    输入和一些输出,时间到此结束,非常感谢

    每个人都[掌声]