我一不小心删掉了Alluxio 34万行代码

作者简介:毛宝龙(神龙),阿里云数据库产品事业部工程师。加入阿里巴巴之前,毛宝龙是京东大数据分布式存储负责人,他主导研发了京东万台规模大数据分布式文件存储。毛宝龙热爱开源技术,并积极投入开源社区,Alluxio开源社区PMC成员。

故事引子

如果你删除了一个软件的34万行代码,心里慌不慌?是不是突然想跑路?No worries!如果你操作得当合理,不仅不会出问题,还能精简软件开发过程,最近俺就干了这么一件神奇的事情:向Alluxio代码仓库增加了7行代码,删除了34万行代码,并且软件还能正常工作。下面就来聊聊具体怎么回事吧~

背 景

Alluxio是一款优秀的开源分布式缓存文件系统,在大数据生态栈中处于承上启下的重要位置,应用十分广泛,因其对大数据IO层的性能提升和稳定性增强,这几年被国内外大厂纷纷翻牌子,有些红得发紫:)

明星火了,粉丝和流量纷至沓来;软件火了,码农和工程师就前仆后继:)Alluxio的软件架构很清晰,源码也很易读。不久前,我就关注并深入捣鼓了Alluxio的alluxio-core-transport模块。在Alluxio的实现中,这个模块的功能定位非常明确,就是把grpc的协议定义到这里来。并且,Alluxio把这些protoc可以生成的java源文件放到了src目录下,作为源码的一部分,这部分代码大概有34万行。这样一旦有人在源头更新或修改了proto文件,就需要重新生成对应的源文件,还得安装protoc工具。窃以为这个过程有些复杂了,经过和开源社区开发者们的认真讨论,最终大家都认同不应该把可生成的代码放到源代码仓库里。这里把方法贴出来,供在其他软件开发过程中有类似思考的小伙伴们参考:)

方 法

Step 1. 删除protoc生成的Java源码

首先,将alluxio-core-transport这个模块的src/main/java/全部删掉,这些代码全部是protoc生成的,不需要进行版本管理。

Step2. 将proto文件移至源码主目录下

然后,将src/grpc和src/proto两个目录移动到src/main/proto/目录下。

Step3. 使用protobuf-maven-plugin maven插件自动化protoc执行

最后,修改pom.xml文件,使用如下maven插件和依赖项,即可实现在mvn compile的过程中自动执行protoc命令进行代码生成,生成的代码默认位于target/generated-sources目录下。在mvn compile的时候,也会对这个目录下的java代码进行编译,而mvn clean的时候,也会清理整个target目录。因此,后续的开发过程中,我们无需关注生成的java代码,只需关注proto文件就可以了。以下是pom.xml中需要增加的grpc和protobuf相关的依赖项以及maven插件。


     3.5.1
     1.17.1
  
 
     
       com.google.protobuf
       protobuf-java
       ${protobuf.version}
     
     
       io.grpc
       grpc-core
       ${grpc.version}
     
     
       io.grpc
       grpc-netty
       ${grpc.version}
     
     
       io.grpc
       grpc-protobuf
       ${grpc.version}
     
     
       io.grpc
       grpc-stub
       ${grpc.version}
     
 
 
   
     
       kr.motd.maven
       os-maven-plugin
       1.5.0.Final
     
   
   
     
       org.xolstice.maven.plugins
       protobuf-maven-plugin
       0.5.0
       
         com.google.protobuf:protoc:${protobuf.version}:exe:${os.detected.classifier}
         grpc-java
         io.grpc:protoc-gen-grpc-java:${grpc.version}:exe:${os.detected.classifier}
         ${skip.protoc}
       
       
         
           
              compile
             compile-custom
           
         
       
     
   
 

值得一提的是,os-maven-plugin这个extension,可以提供${os.detected.classifier}这个变量的值。从而可以使得protobuf-maven-plugin这个插件能够根据当前的os下载相应的protoc,用以将proto文件生成相应的java文件。

结语

通过上述三步,就可以实现整个protoc相关过程的自动化。在Alluxio项目里,我们删掉了本不应该进行版本管理的protoc生成的34万行java代码。而且,后续的项目contributor也不再需要安装protoc工具,降低了Alluxio项目的build入门门槛。是不是有些摩拳擦掌了?参考文献里面我放了一个多模块的示例,可以了解一下:)

参 考

github仓库-多模块示例
https://github.com/opendataio/multimodule

你可能感兴趣的:(我一不小心删掉了Alluxio 34万行代码)