2010-09-02 140 views
1

任何人都可以告诉我如何编写用于从.proto文件创建.jar文件的蚂蚁规则(build.xml)?构建协议缓冲文件的Ant目标

基本上,我写了一个功能example.proto,我可以使用命令行protoc输出java文件。但是我想要一个ant规则来自动完成上面的过程,作为我的构建的一部分。有人可以分享一个代码片段的起点吗?

回答

1

听起来好像您需要Ant Exec任务来执行二进制文件以从.proto文件创建.javaJavac task然后将编译这些和Jar task构建您的.jar文件。

你如何将所有这一切联系在一起? This tutorial介绍了Ant以及如何利用上述任务。

2

我知道这个问题很古老,但它仍然是谷歌对“ant protoc”的热门搜索引擎之一。

我很失望,我无法找到protoc一个Ant任务,所以我写我自己:https://github.com/okorz001/ant-protoc

这是目前相当原始,但它支持嵌套文件集这是我无法弄清楚如何处理exec黑客。 (我绝不是一个蚂蚁专家。)任务只执行protoc;您需要使用ant的股票javac和jar任务才能生成jar。

2

Proto编译也可以通过ant exec来完成。

<!-- Generates protocol buffers. --> 
    <property name="proto.srcs" value="../protos" /> 
    <target name="proto"> 
    <exec executable="protoc" failonerror="true"> 
     <arg value="--java_out=." /> 
     <arg value="--proto_path=${proto.srcs}" /> 
     <arg line="${proto.srcs}/my.proto" /> 
    </exec> 
    </target> 
1

以下是我所做的将protoc合并到一个项目中。理想情况下,我会使用<mapper>,但将.proto文件与它们的.java文件关联并不重要,因此同时我只需在每次运行protoc时触摸一个标记文件。 关键是<uptodate>任务,它允许您根据两组文件的相对年龄设置属性(如果from大于则为true,否则为false)。

<property name="proto.messages" value="proto"/> 
<property name="proto.src" value="src-proto"/> 
<property name="proto.markerfile" value="${proto.src}/markerfile"/> 

<target name="init"> 
    <uptodate property="skip.protogen" targetfile="${proto.markerfile}"> 
    <srcfiles dir="${proto.messages}" /> 
    </uptodate> 
    ... 
</target> 

<target name="clean"> 
    <delete dir="${proto.src}"/> 
    ... 
</target> 

<target name="protoc" depends="init" unless="skip.protogen"> 
    <!-- delete first to ensure clean build --> 
    <delete dir="${proto.src}"/> 
    <mkdir dir="${proto.src}" /> 
    <apply executable="protoc" failonerror="true"> 
    <arg prefix="--java_out=" file="${proto.src}" /> 
    <arg prefix="--proto_path=" file="${proto.messages}" /> 
    <fileset dir="${proto.messages}" includes="**/*.proto" /> 
    </apply> 
    <touch file="${proto.markerfile}" /> 
</target> 

<target name="build" depends="init,protoc,..."> 
    <javac ...> 
    <src path="${proto.src}"/> 
    ... 
    </javac> 
</target>