Ant:从文件集连接属性

时间:2010-07-20 04:31:05

标签: ant properties concatenation fileset

我正在尝试在ANT中执行以下操作,但我被卡住了。


  1. 读取项目工作区中安装的项目。

    workspace
        buildtools
            build.xml
        project1
            build.xml
                project.name = "project1"
                IP = "44.55.66.77"
                SERVER_NAME = "project1.local"
                DOCUMENT_ROOT = "c:\inetpub\project1"
        project2
            build.xml
                project.name = "project2"
                IP = "44.55.66.77"
                SERVER_NAME = "project2.local"
                DOCUMENT_ROOT = "c:\inetpub\project2"
        ....
    
  2. 为每个项目创建一个Apache virtualhost指令。

    <VirtualHost 44.55.66.77>
       DocumentRoot "c:\inetpub\project1"
       ServerName project1.local
    </VirtualHost>
    
    <VirtualHost 44.55.66.77>
       DocumentRoot "c:\inetpub\project2"
       ServerName project2.local
    </VirtualHost>
    ....
    
  3. 将virtualhost指令连接到Apache配置文件中。


  4. 我花了很多时间研究我可以使用的不同任务。 Concat,loadproperties,fileset,filterreaders等。我对所有的可能性和我的头脑旋转感到不知所措。

    以下是我对如何做到这一点的可怕猜测:

    <concat destfile={$apache.config.file}>
        <fileset>
            <include name="**/build.xml"/>
            <loadproperties resource="fileset.item.project.name???"/>
            <filterchain>       
                <replacetokens>
                    <token key="IP"
                           value="${p.IP}"/>
                    <token key="DOCUMENT_ROOT"
                           value="${p.DOCUMENT_ROOT}"/>
                    <token key="SERVER_NAME"
                           value="${p.SERVER_NAME}"/>                   
                </replacetokens>        
            </filterchain>
        </fileset>
    <concat>
    

    感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

我认为基本上你不应该将包含属性的build.xml文件作为标准属性文件加载,因为它们不是属性文件(我的意思是key =每行文件的值)。如果你需要它们,你应该导入它们。

我建议您使用Groovy代码段执行此类操作。

<!-- this is only a sketch, not a working solution -->
<path id="gr">
  <pathelement location="/path/to/groovy-all.jar"/>
</path>

<taskdef name="groovy"
             classname="org.codehaus.groovy.ant.Groovy"
             classpathref="gr"/>


<groovy>
def b1 = new XmlParser().parse(new File("project1/build.xml")));
def b2 = new XmlParser().parse(new File("project2/build.xml")));

def f = new File("output.xml");
def ip1 = b2.property.find { it.name == 'IP'}.text();
def ip2 = ..
// get out all the stuff you need from the build.xml files with GPath

f.write("<VirtualHost ${ip1}>");
f.write("  DocumentRoot ${r1}");
f.write("  ServerName ${s1}");
f.write("<VirtualHost>");

</groovy>