2010-09-02 22 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>