五分之三
作者:Dan Cohn, 太阳集团APP下载-太阳集团官网app下载v2.5.8苹果版-apple app store-太阳成集团排行榜实验室

在monorepo中开发软件的主要原因之一是便于重用— 不仅是源代码重用,而且是社区对编译器的使用, 代码美化工具, 提交模板, 编辑器配置, 和更多的. 如果每个项目都有自己的构建工具, 共享库变得更加困难, 创建一个公共的持续集成(CI)管道, 在项目之间切换. 支持更少的构建工具意味着更高的一致性和更低的复杂性. 但是,要求每个人都使用相同的工具现实吗? 应该是哪一个呢? 

通过“构建工具”,我指的是一个 构建自动化 实用程序. 有 有很多选择 例如Make、CMake、Maven、Gradle和Grunt. 这些都是软件开发人员必不可少的工具. 从大型应用程序到小型微服务, 构建过程通常比编译一些源文件以生成二进制可执行文件复杂得多. 构建工具编排源代码依赖项的下载和/或编译, 运行自动化测试, 打包各种资产以供部署, 也可能有其他功能. 

太阳集团APP下载-太阳集团官网app下载v2.5.8苹果版-apple app store-太阳成集团排行榜为什么选择巴泽尔 

太阳集团APP下载-太阳集团官网app下载v2.5.8苹果版-apple app store-太阳成集团排行榜的独角兽出生时,太阳集团APP下载-太阳集团官网app下载v2.5.8苹果版-apple app store-太阳成集团排行榜选择了 巴泽尔 作为太阳集团APP下载-太阳集团官网app下载v2.5.8苹果版-apple app store-太阳成集团排行榜的主要构建工具. 巴泽尔是谷歌内部Blaze工具的开源版本. 巴泽尔的一个吸引人的特性是它可以构建用各种语言编写的代码. 它不像Maven主要针对Java那样为特定语言设计, CMake非常适合C/ c++. 事实上, 巴泽尔是完全可扩展的, 使它能够建造任何能让自己 不透气的 方法. 密封性意味着构建不应该依赖于安装在构建环境之外的工具, 无论运行构建的系统的状态如何,构建结果都是一致的. 

除了语言不可知论之外, 巴泽尔是可靠的, 快, 可伸缩的, 而且相对容易使用. 与其他构建工具不同, 尤其是Maven和Gradle, 巴泽尔并不依赖于广泛的插件生态系统. 它利用一个公共的“工作空间”,该工作空间通常在单个组织中的所有项目之间共享. 巴泽尔还包括一个强大的 查询语言 它可以分析构建依赖关系, 在为monorepo创建集中构建系统时非常有用的功能(太阳集团APP下载-太阳集团官网app下载v2.5.8苹果版-apple app store-太阳成集团排行榜将在本系列的后续文章中讨论这个主题). 

巴泽尔还内置了 远程工件缓存远程构建执行. 远程缓存很容易设置,尤其是在使用谷歌云存储时. 使用远程缓存,太阳集团APP下载-太阳集团官网app下载v2.5.8苹果版-apple app store-太阳成集团排行榜可以大大提高持续集成(CI)系统的构建时间, 特别是对于c++应用程序,因为它们是从源代码一直构建到最后一个传递依赖项, 包括第三方库. 太阳集团APP下载-太阳集团官网app下载v2.5.8苹果版-apple app store-太阳成集团排行榜的开发人员也可以使用远程工件缓存, 这意味着工件的每个版本只构建一次,然后跨开发人员工作站共享. 太阳集团APP下载-太阳集团官网app下载v2.5.8苹果版-apple app store-太阳成集团排行榜还没有利用远程执行的优势, 但在未来,当太阳集团APP下载-太阳集团官网app下载v2.5.8苹果版-apple app store-太阳成集团排行榜想要支持更大、更快的建设工作时,这对太阳集团APP下载-太阳集团官网app下载v2.5.8苹果版-apple app store-太阳成集团排行榜来说将变得很重要. 

没有什么是完美的 

尽管巴泽尔有很多优点,并且非常适合基于单线程的开发, 它也有缺点. 对于初学者来说, 很少有开发人员有使用巴泽尔的经验,因此必须从头开始学习. 当然, 掌握一种新的工具或框架是软件工程师不可或缺的一部分, 所以这不应该是一个主要的障碍. 更大的挑战是管理一组常见的第三方依赖项. 在巴泽尔中,这被称为“WORKSPACE”文件. 它导入单个项目中所有项目所需的巴泽尔规则和外部包. 这通常意味着每个人都必须就一组依赖关系达成一致, 更重要的是, 这些依赖项的版本. 

是否有必要为整个回购有一个单一的工作区? 从技术上讲, no, 但是一旦你把一个办公室分成多个工作空间, 你不再拥有一个真正的独角兽. 给定工作区之外的任何内容都被视为“外部”依赖项, 这意味着巴泽尔必须从另一个工作区导入它,或者从中央存储库下载它. 由于共享依赖中的冲突,这样的导入甚至可能不可行- 所谓的“依赖地狱”的问题. 除了, 您必须独立管理每个工作空间,并在所有工作空间中手动传播全局更改. 

另一个挑战是,有些语言比其他语言更适合巴泽尔. 太阳集团APP下载-太阳集团官网app下载v2.5.8苹果版-apple app store-太阳成集团排行榜发现NodeJS不太适合巴泽尔,特别是在单线程中. 这在一定程度上是因为NPM, 用于Node项目的标准构建工具, 两者都是构建自动化工具和 包管理 工具. 巴泽尔已经为NodeJS构建了规则, 但是它们要求工作区中的所有项目使用一组通用的第三方Node模块和版本. 您是否遇到过两个具有相同依赖项列表的Node应用程序? 不可能. 另外, 没有办法在同一个repo中的一个Node模块和另一个模块之间声明“内部”依赖关系. 因此,用巴泽尔构建NodeJS项目几乎没有什么好处. 有采用成本,但没有真正的价值. 

解决NodeJS问题 

解决NodeJS问题 

在巴泽尔的实验之后 NodeJS规则, 太阳集团APP下载-太阳集团官网app下载v2.5.8苹果版-apple app store-太阳成集团排行榜的架构团队决定采用一种不同的方法——为JavaScript构建创建一套包装器规则. 包装很简单。”genrules,从巴泽尔内部执行NPM构建和测试. 例如: 

使用这些规则(在BUILD.巴泽尔“文件”看起来像这样: 

如你所见, 这将创建一个简单的适配器,以便巴泽尔可以按照预期构建Node模块(即, 使用" npm "工具). 这样做的好处是太阳集团APP下载-太阳集团官网app下载v2.5.8苹果版-apple app store-太阳成集团排行榜可以用 巴泽尔建造 命令,太阳集团APP下载-太阳集团官网app下载v2.5.8苹果版-apple app store-太阳成集团排行榜可以使用 巴泽尔查询 comm和. 这对于CI至关重要,本系列的第5部分将讨论这个主题. 

Java难题 

与JavaScript的NPM不同,没有单一的Java构建工具. 常用的选项包括Ant、Gradle、Maven和Make/CMake. 然而, 当涉及到第三方软件包时, 哪些是企业Java开发所必需的, 基本上只有一个标准:Apache Maven JAR (Java ARchive). 第三方库打包为jar,并通过在线存储库(如 Maven中央

为了构建Java项目,巴泽尔依赖于一组特殊的规则,称为 rules_jvm_external 以解析第三方依赖版本并下载Maven构件. 这增加了一层复杂性,但也创建了许多Java开发人员更熟悉的环境. 不利方面, 然而, 集中管理Java依赖项是一项不小的壮举, 而巴泽尔必须花时间(通常是几分钟)安装Maven依赖项,无论何时发生更改(通常是在大型单线程中)。. 

不幸的是, 当太阳集团APP下载-太阳集团官网app下载v2.5.8苹果版-apple app store-太阳成集团排行榜开始将现有的Java应用程序转换为使用巴泽尔时,这些并不是太阳集团APP下载-太阳集团官网app下载v2.5.8苹果版-apple app store-太阳成集团排行榜遇到的唯一障碍. 迁移过程可能是复杂且耗时的, 特别是对于依赖于Maven可用的一个或多个插件的项目. 说到插件, 与IntelliJ与Maven(或Gradle)之间的紧密集成相比,IntelliJ IDEA的巴泽尔插件提供了糟糕的用户体验。. 太阳集团APP下载-太阳集团官网app下载v2.5.8苹果版-apple app store-太阳成集团排行榜的大多数开发人员使用IntelliJ作为他们的主要代码编辑器/IDE(集成开发环境), 这很快就成为一个重要的痛点. 在这方面有改善的迹象 公告 几个月前,巴泽尔和JetBrains合作改进和维护插件.) 

太阳集团APP下载-太阳集团官网app下载v2.5.8苹果版-apple app store-太阳成集团排行榜需要考虑的另一个问题是,几乎所有的Java应用程序都依赖于 春天 框架和 春天的引导 特别是. 为什么这很重要?? 好吧, 不同的团队多年来开发了这些应用程序, 这意味着每个版本都有自己所需的春天包和版本集. 传递依赖项的完整列表可以达到数百个. 从一组版本转移到另一组版本很少是一件容易的工作. 事实上,当考虑到其他业务优先级和承诺时,它往往接近于不可能. 

你可能猜到这是怎么回事了. 在太阳集团APP下载-太阳集团官网app下载v2.5.8苹果版-apple app store-太阳成集团排行榜的开发人员和架构师的焦虑和沉思之后, 太阳集团APP下载-太阳集团官网app下载v2.5.8苹果版-apple app store-太阳成集团排行榜决定改变使用巴泽尔作为Java应用程序唯一构建工具的做法. 相反,太阳集团APP下载-太阳集团官网app下载v2.5.8苹果版-apple app store-太阳成集团排行榜对Java采用了与对Node相同的“包装器脚本”方法. 基于它在太阳集团APP下载-太阳集团官网app下载v2.5.8苹果版-apple app store-太阳成集团排行榜的流行程度,Maven是Java的首选构建工具. 巴泽尔使用“mvn”工具在“底层”运行Maven构建和测试. 它还跟踪monorepo内部的依赖关系,以确保在共享模块或API更新时重新构建适当的应用程序. 

这种非传统的方法有优点也有缺点. Java开发人员对这个决定非常满意,并报告说生产率提高了. 项目在依赖项选择和升级时间方面具有独立性. 太阳集团APP下载-太阳集团官网app下载v2.5.8苹果版-apple app store-太阳成集团排行榜通过使用相同的命令和相同的JDK(在大多数情况下)构建单个Java项目来保持它们的一致性。. 它们中的许多依赖于Maven BOM(材料清单),其中包含内部和外部依赖项的包版本的共享列表. 此BOM进行了版本控制,以允许从一个“版本”到另一个“版本”的受控转换, 一个不容易用rules_jvm_external管理的活动. 

另一方面, 太阳集团APP下载-太阳集团官网app下载v2.5.8苹果版-apple app store-太阳成集团排行榜已经失去了集中式依赖管理的好处, 比如跨项目的一致性,以及伴随而来的重用太阳集团APP下载-太阳集团官网app下载v2.5.8苹果版-apple app store-太阳成集团排行榜内部库的能力,而没有传递依赖冲突的风险. 太阳集团APP下载-太阳集团官网app下载v2.5.8苹果版-apple app store-太阳成集团排行榜还牺牲了构建和远程工件缓存的隐秘性, 这是前面提到的巴泽尔的两个特性. 由于太阳集团APP下载-太阳集团官网app下载v2.5.8苹果版-apple app store-太阳成集团排行榜为monorepo的用户提供了一个标准化的开发人员环境,因此对太阳集团APP下载-太阳集团官网app下载v2.5.8苹果版-apple app store-太阳成集团排行榜来说,hermitticity就不那么重要了. 每个人都有相同版本的Maven和Java编译器. 当涉及到工件缓存时, Maven有自己的本地存储库缓存, 但是通过使用远程缓存扩展来提高构建性能肯定还有空间 这一个

结论 

回到最初的问题: 在一个多语言平台中为所有的应用程序和服务使用一个构建工具是现实的吗? 答案有些微妙. 太阳集团APP下载-太阳集团官网app下载v2.5.8苹果版-apple app store-太阳成集团排行榜发现巴泽尔是一个伟大的统一器- 是一个保护伞,所有构建都可以通过一个公共接口执行. 然而,巴泽尔可能不是所有语言或情况的最佳选择. 下表总结了太阳集团APP下载-太阳集团官网app下载v2.5.8苹果版-apple app store-太阳成集团排行榜为各种语言所做的选择. 

语言 本地构建工具 巴泽尔包装? 
C++ 巴泽尔 No 
Go 巴泽尔 No 
Java Maven 是的 
JavaScript / NodeJS NPM或纱线 是的 
Python 巴泽尔 No 

本系列的下一篇文章将深入探讨基于容器的开发,以及它如何为整个公司的开发人员提供一致的环境. 

请阅读本系列的其余部分: