Pants是一个快速、远程友好、符合人体工程学的构建工具,适用于多种语言,包括Python、Go、Java和Scala。让我们来看看。
软件架构师,InfoWorld |

思想库
Pants构建系统是一个多语言工具,具有一系列不错的功能,包括完全并行和远程工作者支持。Pants已经存在好几年了,但从2.0版本开始,它就在一个完全重建的Rust引擎上运行,以追求速度。
截至本文写作时,Pants已经到了2.9版本,现在包括对Java和Scala的alpha支持,以及对Python和Go的支持。继续阅读以了解这个有前途的开源构建工具。
裤子的特点
有几个有趣的特点使Pants成为一个值得考虑的构建系统,可以替代传统的选择。下面是它们的描述。
- 自动的依赖性推理。深吸一口气,松了一口气。Pants可以分析你的导入语句,并在没有大量元数据的情况下找出要下载的东西。
- 细致的无效性。Pants在尽可能小的单元上工作,因此失败会使新工作的无效程度降到最低。
- 智能的结果缓存。Pants被设计为根据输入精确地缓存结果,因此在一段时间内相同的执行将不需要重做相同的工作。
- 并发执行。Pants是用Rust编写的,其架构可以充分利用多核机器,从而在你的构建中实现并行性。
- 远程工作者。Pants可以被设置在远程构建机器上。结合缓存和并发,Pants允许团队重复使用彼此的构建结果并利用高性能的执行。
- 多语言。通过一个统一的接口支持多种语言和平台。
- 插件式API。一个先进的插件系统允许插件使用所有这些相同的设施。
Pants中的依赖性管理
传统的构建工具,如Maven或Bazel,需要你维护一组依赖关系,列在一个外部文件中。Pants建议通过分析你的源文件并推断出它们来改变这种情况。
你可以想象,在不同的平台上实现这一目标(例如,Python与Java)不是一件容易的事。请看这个关于JVM世界中的努力的描述。
在某些情况下,你仍然需要向系统提供提示,告诉它在哪里可以找到Java的外部依赖。正如该团队在添加alpha支持时指出的那样。
[......]第三方依赖往往在JAR文件中,Pants甚至不会下载,直到它确定需要它们。有时,工件组的名称可以给我们一个线索--com.google.truth组中的工件很可能包含com.google.truth类文件--但在其他时候,我们需要更多的数据。你可以在定义依赖关系时提供一个由Maven工件提供的JVM包列表,对于其他工件,我们利用内部数据库的包到未版本化的Maven坐标。
因此,您仍需在一定程度上手动跟踪依赖关系,但比平时要少一些,一旦系统了解如何将某个依赖关系解析到其远程位置,Pants就会在Repo中的所有项目中使用该信息。你不必像使用Maven那样重复这些信息。
就Python而言,你同样需要创建一个中央文件来映射 repo所使用的依赖关系的 "宇宙",但Pants对哪些依赖关系在实际使用中是很明智的。(这与其他工具使用的一揽子方法不同)。
正如Pants文档中所说,"Pants确切地了解你项目中的每个文件需要哪些依赖,并有效地使用任务所需的依赖子集。"
在Pants中,你在一个文件中定义需求映射,对于Python,该文件看起来像清单1。
清单 1.Pants python_requirements 文件
python_requirement(
有相当多的选项可以对依赖管理引擎进行微调。你会在这里找到细节。
Pants的目标
与其他命令行工具类似,Pants使用目标的概念作为执行时的主要命令。例如,你可以通过执行./pants help 来运行简单的帮助目标。
目标可以有子目标(./pants help goals),可以用不同的选项来配置,也可以连锁在一起,如./pants fmt lint :: ,运行格式目标,接着是lint目标,配置为:: ,意味着所有的文件递归。(你可以在这里找到更多关于Pants命令行的文件和目录语法的信息)。
Pants还支持在 "循环 "模式下运行的能力,即引擎将观察变化并按顺序重新运行命令。比如说。
./pants --loop check test project/app_test.py
注意--loop 标志。
Pants BUILD文件
你的Pants构建的元数据将被定义在BUILD文件中。这些文件定义的主要内容之一是目标(target),它是被命名的信息块,将应用于目标类型。每个目标都住在一个目录中,路径和名称提供了一个唯一的ID,以便在配置其他目标或在命令行上对目标进行参数化时处理该目标。
裤子的后端
在pants中,驱动目标的各种能力被称为后端。你可以在全局配置文件pants.toml中启用你的项目的后端。你可以在清单2中看到如何启用一些与Python相关的功能。
清单2.启用Pants的后端
backend_packages = [
你可以看到后端能力是分层次的命名空间。可用的后端完整列表见这里。
Pants源码根
你必须配置的另一个重要方面是你项目中的源根。 这也是在全局的pants.toml文件中完成的。你可以在清单3中看到一个识别Python和Java根的简单例子。
清单 3.Python的源根
root_patterns = [
Pants中的项目自省
Pants包括一些相当强大的自省能力,以获得关于你的项目的信息。
例如,你可以通过运行list 目标找到你所有项目的目标。你可以通过dependencies 目标来识别一个目标所使用的所有依赖关系,或者通过filedeps 找到一个目标使用的文件。
当然,count-loc 目标对于计算总的代码行数和估计复杂性总是很方便的。像这样的目标还支持通过传递file和dir参数来微调要操作的文件和目录。
Pants和持续集成
Pants的文档包括了很多关于如何在CI(持续集成)中最好地使用该系统的信息。你可以利用Pants系统固有的很多优点(并行性、速度和缓存)进行CI设置,所以考虑这些选项是非常值得的。
Pants和远程工作
在Pants中,远程工作有两个方面。
- 远程缓存。Pants将本地进程的执行结果存储在一个远程缓存中,同时也消耗该远程缓存的结果。
- 远程执行。Pants将进程的执行卸载到一个远程服务器上(并消耗该远程服务器的缓存结果)。
远程缓存和远程执行是通过设置一个暴露了REAPI兼容API的远程服务器来处理的,比如BuildBarn。
你的开发机器上的本地Pants客户端然后与远程服务器互动,以利用这些功能。对于大型团队来说,这可能是开发效率的巨大提升。
Pants语言支持
Pants的最终目标是为你所有的编程语言提供一站式的构建体验。这将使它成为最终的单程序构建系统,你可以把任何东西扔给这个工具,它就会理解它。
截至目前,Pants对下列语言有一级支持。
- Python - 从2.0版本开始
- Protobuf和gRPC - 从2.2版开始
- Shell - 从2.5版开始
- Go - 从2.8版开始
- Java - 从2.9版开始支持Alpha
- Scala - 从2.9版开始支持Alpha。
- JavaScript - 在路标上
Pants是一个雄心勃勃的项目。如果它继续增加语言,它可以提供一个令人难以置信的新的和更简单的方法来建立项目,特别是对于使用几种语言的大型项目。
马修-泰森是黑马集团的创始人。他相信以人为本的技术。在不弹吉他的时候,Matt会去探索内陆地区和哲学腹地。自2007年以来,他一直为JavaWorld撰写文章。
Copyright © 2022 IDG Communications, Inc.