【问题标题】:Ant: Concatenate properties from a filesetAnt:连接文件集中的属性
【发布时间】:2010-07-20 04:31:05
【问题描述】:

我正在尝试在 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 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. 将虚拟主机指令连接到 Apache 配置文件中。


我花了很多时间研究我可以使用的不同任务。 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>

感谢您的帮助!

【问题讨论】:

  • 不完全遵循:IP/DOCUMENT_ROOT/SERVER_NAME 值在哪里定义 - 在每个项目下的属性文件中?还是在每个项目下的build.xml?看起来 buildtools 不应该生成虚拟主机指令 - 对吗?
  • 你是对的。对不起,我应该更清楚。问题已编辑。
  • 为了更清楚;我通常在每个项目下的文件中定义我的每个项目属性。为简洁起见,我将它们显示为上面 build.xml 的一部分。

标签: ant properties concatenation fileset


【解决方案1】:

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

我建议您使用 Groovy sn-p 执行此类操作。

<!-- 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>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-09-08
    • 1970-01-01
    • 1970-01-01
    • 2011-09-10
    • 2015-11-25
    • 1970-01-01
    • 2011-04-10
    • 1970-01-01
    相关资源
    最近更新 更多