2013-02-25 52 views
1

我有以下要求。在我的项目中有一个目录,托管一套谷歌protobuf模式文件(.proto)。由于.proto文件应该与我的应用程序可以与其他项目进行通信,我想要一个ANT构建任务来验证本地和“远程”.proto文件是否相同。从文件路径元素编写Ant Proprty名称

下面是一个简单的项目目录结构:

${project.root} 
    etc 
    refData 
     refdata.proto 
    marketData 
     md.proto 

Ant任务将文件路径映射到一个属性名称。属性将反过来用于查找远程路径。对于样品目录上面,我应该能够映射等目录下的每个.proto文件到以下属性:

refdata.refdata.proto=[configure remote path here] 
marketdata.md.proto=[configure remote path here] 

我不是所有熟悉ANT,我应该用什么样的任务来实现上述?

回答

0
<?xml version="1.0" encoding="UTF-8" ?> 
<project default="all" basedir="."> 
    <target name="all"> 
     <property name="project.root" value="c:\" /> 
     <property name="refdata.refdata.proto" value="${project.root}etc\refData\refdata.proto" /> 
     <echo message="refdata.refdata.proto = ${refdata.refdata.proto}" /> 
     <property name="marketdata.md.proto" value="${project.root}etc\marketData\md.proto" /> 
     <echo message="marketdata.md.proto = ${refdata.refdata.proto}" /> 
    </target> 
</project> 
+0

我对一个细节并不清楚,我希望它是通用的,这样当新的.proto文件被添加到项目中时,我需要做的就是将相应的属性添加到build.properties中,但不需要更改build.xml本身。我希望ant任务能够动态获取所有原始文件,根据原始文件路径/名称为每个文件组成属性名称,然后查找属性,该属性将在属性文件中定义并包含到外部.proto文件的路径。 – Eugene 2013-02-26 15:00:41

0

文件结构:

. 
├── build.xml 
├── etc 
│   ├── a 
│   │   └── aa.proto 
│   └── b 
│    └── bb.proto 
└── some.properties 

some.properties:

a.aa.proto=propa 
b.bb.proto=propb 

的build.xml:

<project name="a" default="props" basedir="."> 

    <!-- define file containing *.proto propterties --> 
    <property name="prop.file" value="some.properties" /> 

    <target name="props"> 

     <echo>props file: ${prop.file}</echo> 

     <!-- create an OR regex based on file names 
      while stripping the path prefix --> 
     <pathconvert property="proto.files" pathsep="|"> 
      <map from="${basedir}/etc/" to="" /> 
      <fileset dir="${basedir}"> 
       <include name="**/*.proto" /> 
      </fileset> 
     </pathconvert> 
     <echo>proto files: ${proto.files}</echo> 

     <!-- load converted regex into new property --> 
     <loadresource property="proto.props"> 
      <!-- use property as a resource, avoids temp files --> 
      <propertyresource name="proto.files" /> 
      <!-- replace/with . --> 
      <filterchain> 
       <tokenfilter> 
        <filetokenizer /> 
        <replacestring from="/" to="." /> 
       </tokenfilter> 
      </filterchain> 
     </loadresource> 
     <echo>proto props: ${proto.props}</echo> 

     <!-- load properties matching the regex --> 
     <loadproperties srcfile="${prop.file}"> 
      <filterchain> 
       <containsregex pattern="${proto.props}" /> 
      </filterchain> 
     </loadproperties> 

     <!-- confirm --> 
     <echo>a:${a.aa.proto}</echo> 
     <echo>b:${b.bb.proto}</echo> 
    </target> 
</project> 

构建输出:

Buildfile: /tmp/a/build.xml 

props: 
    [echo] props file: some.properties 
    [echo] proto files: a/aa.proto|b/bb.proto 
    [echo] proto props: a.aa.proto|b.bb.proto 
    [echo] a:propa 
    [echo] b:propb 

BUILD SUCCESSFUL 
Total time: 1 second