sofa-pbrpc去boost依赖
背景
当前一些依赖sofa-pbrpc的应用程序同时也依赖了boost,rpc依赖的boots如果和应用程序依赖的boost没有版本打平会造成一些不可预期的结果,之前出现过此类问题,而且问题追查也十分困难。
方案
从boost中抠出一个rpc依赖的最小子集放在src下的单独目录,之后的rpc不再依赖外部的boost库。
排期
11.7 -11.11: 完成开发自测,提交pr; 11.11-11.18: pr完善和修改,合入;
避免这个问题有两个办法:
- 不将boost对用户隐藏,而是要求用户显式依赖boost,且明确要求用户使用一致的boost版本
- 将boost代码剥离出来(就像现在已经剥离出来的smart_ptr一样),但是需要注意namespace问题,剥离出来的代码需要修改namespace,不然就算剥离出来,也会因为符号相同出现和没有打平一样的结果
@qinzuoyan 谢谢左言,剥离出来的boost的namespace也会修改为rpc的namespace。
赞,不过这也有一个弊端,就是没法跟进boost的更新,譬如bug-fix等,除非定期同步升级代码。 有个建议,开两个branch:
- 一个是完全依赖boost的,把里面原有的smart_ptr、system库等都改成依赖boost;
- 一个完全不依赖boost的; 把其中一个设为master,用户可以选择用合适的版本。
赞同 可以搞两个分支
另外 @zd-double 明确下准备使用哪个版本的boost?
赞~ 完全不依赖boost的版本,需要讲boost代码合入我们的主干,所以建议慎重选个稳定的boost版本。
rpc去boost方案
选用boost版本:1.58.0
- rpc对boost的主要依赖模块为asio、date_time、multi_index等,boost1.58对asio中c++11和clong编译的一些问题进行修复,且在1.58之后的版本中这些模块没有新的修改,可以看出比较稳定。
- 当前最新版本1.62在今年9月份发布,过新的版本存在隐藏问题的可能性更大,1.58版本在15年4月发布。
执行方案 分两个分支: 完全不依赖boost:抽出的boost在src目录下,使用sofa::pbrpc的namespace。
- 采用boost工具bcp,自动将rpc依赖的头文件及依赖的代码抽取出来得到初步的依赖子集,大小20M左右。
- 对抽出的boost代码进一步精简,去除windows平台相关的文件和代码。
- 使用脚本对精简后的boost 替换namespace为sofa::pbrpc。
- boost放在src下和 rapidjson 、sofa同级。
完全依赖boost:将之前抽出的smart_ptr和system_error的内容去掉,仍旧依赖boost的实现。
维护方案: 将依赖boost的版本设为master,不依赖boost的作为另一个分支。
- 已有的master用户已经依赖boost。
- 默认情况下自己配置boost版本。
之后维护两个分支,功能升级需要更新到两个分支上去。
@cyshi @bluebore @qinzuoyan 大家看看有什么意见?
我觉得将不依赖boost的版本作为master是不是更好,因为长期看倾向于让用户选择不依赖的版本,我们应该也不会长时间的维护两个分支
另外对于之后boost升级或者bug fix这部分是怎么打算的?
gitter 这也可以讨论问题 github账户登录 而且实时性更好 github上的动态也会同步到上面 讨论也可以长久保留
@zd-double ,我觉得挺好。有一点小建议:既然抽出来的boost代码放在sofa::pbrpc的namespace,那么相应的源代码应当放在src/sofa/pbrpc下面吧,而不应当与sofa同级,可以参考现有的smart_ptr怎么做的。
使用脚本对精简后的boost 替换namespace为sofa::pbrpc。
最好不要直接修改boost的命名空间 统一在boost之外包裹一层sofa::pbrpc
sofa-pbrpc去boost版本的暂时放在这里,大家review一下给点意见。 实现上主要有几点:
- rpc依赖的boost代码位于 src/sofa/pbrpc/boost下,采用sofa::pbrpc::boost的命名空间
- src/sofa/pbrpc/boost下代码中防止重复编译的ifndef宏采用SOFA_PBRPC作为前缀。
- 由于rpc暴露给用户的头文件中存在shared_ptr,如rpc_channel.h、 rpc_client.h等,暂时将高度精简的boost下的smart_ptr也最终拷到output下,目录层级为sofa/pbrpc/boost/smart_ptr。
可以先放分支下
no-boost分支可以发布一个release吗?
@zd-double 测试如何了