,Blade是软件project的利器。有助于模块化,模块化的力度控制自如。对于提高系统的可维护性。复杂性的隔离。代码复用的最大化。都有非常大的优点。

2,Blade提供了单元測试的最佳使用方式。

假若单元測试和代码是分离的,编译代码和执行測试各自为政,那么往往測试仅仅是測试,非常难对开发有什么帮助,由于非常多时候,尽管有測试代码,可是測试却非常少被执行,或者时过境迁后,測试多有失效。

大家假如编译过一些开源项目的话,可能就会有相似的经验。编译完静态库。拿到静态库文件就完了,非常少有人去执行全部的单元測试,确保全部的測试都能执行通过。

有了Blade,通过cc_test将gtest_main.a默认链接,使得单元測试的代码简化到极致。同一时候,主要执行blade test target,就能在编译完目标程序后。执行(并且可并发执行)对应的单元測试,以随时跟进代码是否已经偏离了该有的轨道。开发是否早已脱缰狂奔。

仅仅要公布部署时,使用上Blade test target, 那么就能够保证。上线的模块,能够通过全部单元測试用例的验证把关。Blade集成单元測试。提供cc_test,看似功能简单,可是正是这个简单的功能,使得測试驱动开发。开发人员測试等理念。能够在google全功能范围内得到认同并贯彻实现。

3,blade实现了递归编译。

Blade build …就可以对当前文件夹及其子文件夹下的全部编译对象进行编译。

该功能尽管小,可是却非常有用。

在一个十几人的团队中,百万行级别的代码规模。仅仅有递归编译功能。能够非常方便地实现一个循环编译工具。当某个模块编译失败。或者某个单元測试失败后,自己主动发出邮件通知相关的开发人员。以保证频繁的开发提交代码成为开发。当然,相关的功能。能够通过相似hudson之类的软件完毕。

只是blade 递归编译。对中小规模的代码而言,基本已经游刃有余。

4,blade 实现了依赖查询。

Blade query能够查询依赖到某个模块的全部模块,这个对于代码重构而言,是个不错的功能。

假如你在重构code base,或者是改动接口。或者是fix bug,或者是改进性能,

都可能使得使用到该库的相关模块。集体罢工。单元測试无法通过。

这时候,假如使用上blade query,你就可能编译相关模块。使得你提交的代码,不会给其他模块带来麻烦。

5。blade绑定了静态代码审查功能。

对整个项目而言。严把质量关非常重要,由于一旦一些烂代码进去了,清扫牛粪的工作将会非常痛苦并且艰巨。

这里的异己分子。可能包含bug,风格差异迥异等。

Blade 会在进行编译之前。会全部被变更的编码,使用指定的静态代码审查功能进行代码审查。

C++代码审查脚本。google cpplint较为知名,地址为:

http://google-styleguide.googlecode.com/svn/trunk/cpplint/cpplint.py

当然,每一个公司都能够定制其自己的检查脚本,以符合其自己的代码风格等。

Blade绑定该功能,能够避免出现一些常见的Bug,统一团队的代码风格,对公司project文化的塑造有润物细无声之效。

6,blade是编译的统一入口。并且是开放的

这点是最重要的。也是blade的锋芒所在。由于Blade是统一的编译假设。因此改动统一的编译选项,设置统一的编译警告级别。实现cc_test等全部成为可能。

仅仅要愿意。你不仅能够在编译前实现代码审查。也能够在编译时设置不同的參数,选择指定的编译器。更能够在编译后,执行单元測试。统计单元測试覆盖率。当能够定制各种操作。

由于统一,所以要升级编译器。使用统一的警告级别等牵一发而动全身的动作成为可能。

由于开发,实现cc_test, cc_benchmark, proto_library, thrift_library成为可能。

好使的刀,方为好刀

假如刀尽管,可是太笨重。使用起来仿佛破解机关,这仅仅有寂寞的高手才干使用了。普通人得知,如同废铁。

因此,好使的刀,才是好刀。

Blade之所以好使,在于其採用了足够简洁的语法。比方以下便是编译一个静态库libencoding.a的语法描写叙述:

cc_library(

name = 'encoding',

srcs = [

'ascii.cpp',

'base64.cpp',

'hex.cpp',

'percent.cpp',

'shell.cpp',

],

deps = [

'//toft/base/string:string',

'//thirdparty/stringencoders:stringencoders'

]

)

你须要的仅仅有三件事。要打造的刀叫什么刀。它须要使用什么特别的原料。它须要依赖哪些现成的原料。也就是name, srcs,deps, 换言之,就是编译对象名。编译须要的源文件,须要依赖的其他静态库。

你须要描写叙述的有且仅有他们。

怎么编译,编译选项,在哪里编译,中间产物是什么,中间产物放在哪里。你通通不须要关注。

刀一出鞘,东西已在那,躺在了你希望它在的所在。热乎乎的,等你去品尝。

这样的简单到极致的语法,优点却有非常多。比方:

1, easy学习,easy记忆。你须要记忆的仅仅有name, srcs,deps等掰着十指都能数的过来的keyword和规则,剩下的就是。告诉它用到哪些代码文件,用到了哪些外部的库。

相比Makefile繁琐的语法。BUILD文件可谓清爽宜人。

2,简化到了极致的优点是,各种cc_library能够在力度中间轻松转换,因此使用了BUILD文件后,模块划分会更加合理,哪怕有一个文件,其他模块可能能够使用上。你也能够方便地将它打包到一个静态库中,这样其他地方仅仅要依赖上这个cc_library,就能够坐享其成。

我以前见识过各种thrift文件。protobuf文件散落在代码各个文件夹甚至分支中。假设使用上thrift_library, proto_library,将thrift文件定义出细粒度的library,则能够避免因Makefile中频繁描写叙述thrift/protobuf源文件生成与编译的痛苦。

羞于告诉他人的是。我至今都对Makefile不太熟悉,只是所幸,Blade已经开源,我从此不必也不像和Makefile再打交道,我也没有必要告诉别人说。我认识Makefile这个哥们。

宝刀待屠龙

江湖中向来有"武林至尊,宝刀屠龙,号令天下,莫敢不从,倚天不出,谁与争锋."的说法。blade既然是一把绝世好刀,在倚天剑面世之前,各位江湖好友,最好还是试试其刀锋怎样!

Blade - 腾讯开源的构建系统 c/c++编译环境的更多相关文章

  1. 【Android开发】构建Android源码编译环境

    原文:http://android.eoe.cn/topic/android_sdk 构建Android源码编译环境 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 ...

  2. GYP构建系统总结

    GYP,Generate Your Project,一个Google开源的构建系统,最开始用于Chromium项目,现在一些其他的开源项目也开始使用GYP,如v8和node-gyp.不管怎样,这仅仅是 ...

  3. Skia构建系统与编译脚本分析

    分析下Skia的构建系统,详细编译过程參看Windows下从源代码编译Skia.这里以ninja为例来分析.运行以下三条命令就能够完毕编译: SET "GYP_GENERATORS=ninj ...

  4. GitHub开源:升讯威微信营销系统(第三方微信平台)完整源代码

    GitHub:https://github.com/iccb1013/Sheng.WeixinConstruction 升讯威微信营销系统开发实践系列升讯威微信营销系统开发实践:(1)功能设计与架构设 ...

  5. 基于开源软件构建高性能集群NAS系统,包括负载均衡(刘爱贵)

    大数据时代的到来已经不可阻挡,面对数据的爆炸式增长,尤其是半结构化数据和非结构化数据,NoSQL存储系统和分布式文件系统成为了技术浪潮,得到了长足的发展.非结构化数据目前呈现更加快速的增长趋势,IDC ...

  6. nixyx —— 一个小巧的项目工程/编译文件生成器(构建系统?)

    恩..nixyx确实算不上是一个构建系统. 所谓构建系统,比如GNU的Autotools,那是一套很完整的构建体系,包括了程序的配置,编译和安装三大部分. 类似的软件还有:google的gyp.腾讯的 ...

  7. SpringBoot + JWT + Redis 开源知识社区系统

    「Java学习+面试指南」一份涵盖大部分 Java 程序员所需要掌握的核心知识.准备 Java 面试,首选 JavaGuide!:https://javaguide.cn/ 你好,我是 Guide!这 ...

  8. 基于AgileEAS.NET SOA 平台SAAS架构技术的开源分销ERP系统-SmartERP.NET下载配置说明

    一.前言 AgileEAS.NET SOA 中间件平台是一款基于基于敏捷并行开发思想和Microsoft .Net构件(组件)开发技术而构建的一个快速开发应用平台.用于帮助中小型软件企业建立一条适合市 ...

  9. C/C++构建系统 GNU autotool

    我们在网上经常可以看到c/c++开源的项目,其中很多都是使用GNU的构建系统进行配置和编译的,如果按照规范构造这些的步骤,有一定的门槛和复杂度,下文把关于auotools系列的工具和概要的流程简要汇总 ...

随机推荐

  1. Linux 获取设备树源文件(DTS)里的资源【转】

    本文转载自:http://blog.csdn.net/keleming1/article/details/51036000 http://www.cnblogs.com/dyllove98/archi ...

  2. 国外物联网平台初探(二) ——微软Azure IoT

    平台定位 连接设备.其它 M2M 资产和人员,以便在业务和操作中更好地利用数据. 连接 IoT 设备 将所有设备连接到云,从这些设备接收大规模数据,以及管理这些设备的授权和限制. 在将设备连接到云和处 ...

  3. php 获取随机字符串(原创)

    //获取随机数字字母字符串 function get_rand_str($len=8){ $randArr=array_merge(range(0,9),range('a','z'),range('A ...

  4. Hdu-6242 2017CCPC-哈尔滨站 M.Geometry Problem 计算几何 随机

    题面 题意:给你n个点,让你找到一个圆,输出圆心,和半径,使得有超过一半的点刚好在圆上.n<=1e5,题目保证了有解 题解:刚开始看着很不可做的样子,但是多想想,三点确定一个圆,三点啊! 现在有 ...

  5. 微信小程序蓝牙连接小票打印机

    1.连接蓝牙 (第一次发表博客)   第一步打开蓝牙并搜索附近打印机设备// startSearch: function() { var that = this wx.openBluetoothAda ...

  6. 利用道格拉斯·普客法(DP法)压缩矢量多边形(C++)

    1.算法描述 经典的Douglas-Peucker算法(简称DP法)描述如下: (1)在曲线首尾两点A,B之间连接一条直线AB,该直线为曲线的弦: (2)得到曲线上离该直线段距离最大的点C,计算其与A ...

  7. Tomcatsession共享方案--memcached-session-manager

    https://github.com/magro/memcached-session-manager/wiki/SerializationStrategies     MSM的特性:    a.支持t ...

  8. 使用DbVisualizer变量

    变量可用于构建参数化SQL语句,并让DbVisualizer在执行SQL时提示您输入值.如果您重复执行相同的SQL,只是希望在同一个SQL语句中传递新数据,这很方便. 变量语法 变量格式支持设置默认值 ...

  9. 登录linux,输入ls显示anaconda-ks.cfg cobbler.ks ....., 原因在于root@ ~ / 区别

    今天登录linux测试机,想要创建目录,ls的时候,找不到之前的的目录,才发现是目录不对的问题. 首先,先要弄清楚 [root@330c353813ea ~] 和 [root@330c353813ea ...

  10. 【Oracle】手工建库启动到nomount状态时错误ORA-09925,ORA-01017

    配置好pfile和口令文件后启动数据库到nomount状态下出现错误: [oracle@localhost ~]$ sqlplus / as sysdba SQL*Plus: Release 11.2 ...