linux_china技术雷达linux_china技术雷达

Build as Native Language Script

buildscript
评估

项目构建是软件开发过程中的一个重要环节,为此不少开发语言都提供了构建工具,如Java的Maven/Gradle, Rust的Cargo, Node.js的npm等等。 这些构建工具通常都会包括依赖管理、编译、测试、打包、发布等功能,简化了项目构建的流程。

对应大多数构建工具来说,基本上都是采用配置文件或者特定的DSL来描述构建过程,如Maven的pom.xml, Cargo的Cargo.toml,npm的package.json等等。 但是对于大型项目来说,除了构建工具本身的功能外,还需要额外的脚本来处理一些特殊的构建需求,如自定义的构建流程、特殊的构建环境等等, 而一个配置文件或者DSL很难满足这些需求,当然也可以通过插件或者扩展来实现,但是这样会增加构建工具的复杂度。

为此,一种更好的方式是使用一种原生语言来编写构建脚本,这样可以更好的利用语言本身的特性,如函数、模块、异常处理等等, 而且开发人员也可以更加熟悉的编写和维护这些脚本,毕竟构建脚本都是原生语言,不需要额外的学习成本。

如Java的Gradle工具,你可以根据项目的语言,选择Groovy/Java/Kotlin来编写构建脚本,Rust借助cargo-xtask工具,你可以使用Rust来编写构建脚本, 而Zig则直接采用Zig语言编写build.zig构建脚本。

这种方式的优势在于,构建脚本和项目代码可以共享同一种语言,可以更好的利用语言本身的特性,而且开发人员也可以更加熟悉的编写和维护这些脚本, 不需要额外的学习成本,同时也可以更好的利用语言本身的工具链,如IDE、编译器、调试器等等,提升构建脚本的开发效率。

这种方式有一定的好处,但是也有一些缺点,这里列举一下,方便大家参考:

  • 中小型项目:这种方式稍显复杂,项目本身并不复杂,使用配置文件或者DSL可能更加简单,如Java就是简单的pom.xml,Rust就是Cargo.toml
  • 性能考量:对应JS/TS/Python项目,原生语言构建脚本可能会有性能问题,构建时间会变长,可能远不如使用Rust编写的工具链来的更合适
  • 语言特性:如果你的开发语言是Lua, PHP这些语言,性能可能不是问题,但是考虑到语言本身可能不适合编写构建脚本,或者编写起来比较复杂,可能不是一个好的选择

References