显然go的构建系统还不够强大,开发人员还无法定制构建过程与结果。只有go build命令而没有辅助go build命令的工具,在这一方面go依然任得道远。
常见构建系统列表
语言 构建系统 说明c/c++ gnu make, automake, nmake, cmake, qmake 各个make对应于不同时期,不同架构体系下的构建工具
java ant, maven, gradle 目前maven与gradle是主流, ant已经退出历史舞台
python distribute, setuptools, easy_install, eggs, pip python的构建系统百家齐放,世界大战般。不过pip最终赢得王座
nodejs npm -
javasript grunt, gulp, webpack 谁是王者?
go go build 嫡系
rust cargo 号称最强大的构建系统, 超级大杀器。
ruby rubygem -
.net visual studio之nuget 最牛逼的IDE, 包罗万有
swift&object-c xcode 最霸道的IDE
除了上述列表的构建系统,现在已经有不少云构建系统存在。比如google的Bazel,滴滴的建木。
上面提到的大杀器cargo,它与其他语言的构建系统不同,其既是构建系统又是构件系统。cargo口号叫得那么响,除了其是官方出品之外,恐怕也只是为了与go一较高下。rust可能为程序 员考虑得更多,极力地想讨好程序员。而在构建系统方面,对比一下go module与cargo,只怕go也是借鉴了不少cargo的东西。但与当代成熟的构建系统,比如gradle,并没有高下立判之感。不同之处在于cargo在配置中使用rust语言本身来做扩展,而gradle则是使用自身的DSL语言来实现。相比这下,go在这一方面还需要快马加鞭,总比在屁颠屁颠地跟在别人后面追好。
构件系统go语言的构件系统,官方默认是github。此外也可以是支持vgo下载协议的仓库(如athens, goproxy.io),然后通过设置GOPROXY环境变量来设置构件系统代理,此举可以完美解决国内下载依赖不畅的问题。而对于私库,目前免费开源的只有athens,但是仍不够完善。除此之外,jfrog的artifactory也支持go私库,只不过要收费。
私库对于一个成熟、专业的开发团队来说,是极其重要的一个工具。团队内部会产生大量的公共程序包,对于go语言来说,如果没有一个类似于maven的nexus仓库,那么项目如何构建?如何持续集成?虽然必然会有各种巧妙地方案来解决或避开这些问题,但无疑是不得已而为之。现代编程体系发展至今天,没有理由让历史倒退,走回批处理或者基础设施(网络)的老路来解决问题。有时候我真觉得王垠大侠对go的批判有道理,不吸取前人在编程语言设计上的经验教训,而一意孤行到底。尽管我不否认,写go确实会比java舒服很多,java严谨地啰嗦,所以它只适合用来做大项目。
鉴于此,go的官方团队应该鼓励社区去达成构件系统这事。而不应该像go module那样,将社区招之即来,挥之即去,利用完了,就没社区什么事了。
那么构件系统,应该具有以下特征。
构件存储:包括二进制包、源码包、文档
版本:支持release、snapshot,
元数据:设计良好的元数据的存储机制
缓存:支持本地缓存
安全&权限:支持用户、角色、权限模型;支持常用的用户体系集成,如LDAP
仓库管理:多语言,多仓库,支持代理仓库,远程仓库。
常见构件系统列表
构件系统 支持语言/系统 支持构建系统 说明nexus java maven, gradle, npm 历史悠久,流行的构件系统
jfrog java, go maven, gradle, go 后起之秀,有选择的收费
proget .net vistual studio -
cargo rust cargo -
Cocoapods swift&object-c xcode -
Carthage swift&object-c xcode -
dpkg&apt Debian, Ubuntu - -
yum CentOS - -
homebrew Mac OS - -
请关注公众号