分类 技术志 下的文章

buildc 0.2.0版本发布

buildc的演进先后经历了构建管理安装包工程管理两个阶段。其中buildc的构建管理功能在项目中应用较早,目前相对稳定可靠。但其支持的安装包工程是直到最近才被大家所正式使用的。不出意料,大家在使用过程发现了一些问题,于是我们也是边用边改。

目前一个setup工程一般具有类似如下源码组织结构:

distributions/
setup.cfg
src/
    – README
    – app/
    – conf/
    – deps/
    – layout.cfg
    – others/
    – scripts/
    – setup.py

按照最初的设计,deps目录下会存放一些目标程序运行时依赖的库、工具等。但就一些细节并未考虑清楚,比如如果一个程序需要在两个平台(linux和solaris)上运行,那deps下的依赖库应该如何存放?

就这个问题一线的人员在设计setup工程时采用的策略是将某个库的所有平台版本都手工放到deps下,以instantclient这个oracle的客户端库来说,就形成了如下结构:

deps/
    – instantclient/
        – 10.2.0.5.0/
            – x86_64_linux/
                – lib/
            – x86_64_solaris/
                – lib/

这样一来安装包制作完后size非常的大,不便于存储和传输。另外手工copy依赖库显然不够专业。打包过程是buildc来完成的,而buildc是拥 有全部依赖库的存储位置、版本等信息的。于是我们就这个问题做了改进,让buildc 0.2.0支持将依赖的第三方库根据目标程序运行平台类别自动打包到最终的安装包中。

也就是说,如果你是为x86-64 linux平台做的安装包,最终安装包中的目录结构会是:

deps/
    – instantclient/
        – 10.2.0.5.0/
            – x86_64_linux/
                – lib/

而这一切仅需通过配置完成。在setup工程顶层目录的setup.cfg文件中,我们增加了一个新配置项,用于描述目标程序运行时依赖哪些第三方库,这些库将被打包到安装包中,并部署到目标主机上去。

配置的格式如下:

dependences = [
    ("instantclient", "10.2.0.5.0", ["libclntsh.so", "libclntsh.so.10.1", "libnnz10.so"]), # 打包指定的库文件
    #("instantclient", "10.2.0.5.0", []), # 打包instantclient/10.2.0.5.0下所有的库文件
    #("instantclient", "10.2.0.5.0"),     # 打包instantclient/10.2.0.5.0下所有的库文件
]

通过例子可以看出dependences中的元素支持三种形式配置,可以指定打包的库文件,也可以将库目录整体打包。

BTW,buildc自从发布以来一直没有user guide,好消息是项目组的小兄弟wtz1989227已经在wiki上建立了buildc_user_guide页面,后续他会逐步完善这个guide的。

辩证地看待“重新发明轮子”

C程序员骨子里都有一种“重新发明轮子(Reinventing the Wheel)”的特质。在面向对象、组件化流行以及崇尚复用的今天,这种特质似乎总是被认为是反面教材。但伟大的毛主席教导我们:要辩证地看待一切事物, 凡事无绝对。事物都是有两面性的,有好就有坏,有坏就有好。拿“重新发明轮子”这事而言,我们除了看到其弊端外,还要充分领会到其好的一面,不能一棒子打 死,这样才能在特定的场景下作出正确合理地判断。

关于这个题目我不打算长篇大论,几个鲜活的例子便足矣让大家看到“重新发明轮子”的另外一面。

我们来回顾一下IT技术发展道路上的一些产品或工具的演化和变革历程:

- 从ApacheNginx
- 从CVS到subversion再到git、mercurial
- 从memcachedredisleveldb
- 从symbian、WindowsCE到android、iOS
- 从Unix到Linux
- 从Perl到Python,再到Ruby
- 从C、C++到Go
- 从IE到Firefox、Chrome
- 从普通mp3 player到Apple的iPod

诸如此类。有些举例你可能觉得有点牵强,不过没有关系。你只要认同其中一两个即可。我想说的是一个结论,那就是“重新发明轮子”在某种程度上是推动进步和变革的一种原动力,这就是“重新发明轮子”的另外一面。因此辩证地去对待“重新发明轮子”才是一个专业程序员应该具备的正确态度。我们不应该在所有场合都 否定“重新发明轮子”,因为你可能会扼杀一种创新,甚至是一个伟大工具或产品的诞生。

如发现本站页面被黑,比如:挂载广告、挖矿等恶意代码,请朋友们及时联系我。十分感谢! Go语言第一课 Go语言精进之路1 Go语言精进之路2 Go语言编程指南
商务合作请联系bigwhite.cn AT aliyun.com

欢迎使用邮件订阅我的博客

输入邮箱订阅本站,只要有新文章发布,就会第一时间发送邮件通知你哦!

这里是 Tony Bai的个人Blog,欢迎访问、订阅和留言! 订阅Feed请点击上面图片

如果您觉得这里的文章对您有帮助,请扫描上方二维码进行捐赠 ,加油后的Tony Bai将会为您呈现更多精彩的文章,谢谢!

如果您希望通过微信捐赠,请用微信客户端扫描下方赞赏码:

如果您希望通过比特币或以太币捐赠,可以扫描下方二维码:

比特币:

以太币:

如果您喜欢通过微信浏览本站内容,可以扫描下方二维码,订阅本站官方微信订阅号“iamtonybai”;点击二维码,可直达本人官方微博主页^_^:
本站Powered by Digital Ocean VPS。
选择Digital Ocean VPS主机,即可获得10美元现金充值,可 免费使用两个月哟! 著名主机提供商Linode 10$优惠码:linode10,在 这里注册即可免费获 得。阿里云推荐码: 1WFZ0V立享9折!


View Tony Bai's profile on LinkedIn
DigitalOcean Referral Badge

文章

评论

  • 正在加载...

分类

标签

归档



View My Stats