不一样的go语言-构建系统与构件系统 (2)

  显然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   -   -  
请关注公众号

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wsfjpf.html