Ant将文件集和文件应用为命令输入

时间:2011-10-11 12:17:00

标签: mysql ant

我将使用以下命令使用mysql commnd导入一组sql文件。

<apply dir="${basedir}" executable="mysql" failonerror="true" parallel="true">
    <arg value="-u${db.main.user}" />
    <arg value="-p${db.main.password}" />
    <arg value="-P${db.main.port}" />
    <arg value="-h${db.main.host}" />
    <arg value="-D${db.main.database}" />
    <srcfile/>

    <fileset dir="${db.main.path_to_dump}">
        <filename name="keyword_category_rel.sql"/>
        <filename name="keyword_classification.sql"/>
    </fileset>
 </apply>

问题是mysql命令将文件作为命令输入而不是参数。那么有没有办法从文件集中提供文件作为输入而不是参数?

另一种选择是使用-e参数接受文件中的sql代码,但是如何将文件集列表文件中的数据读入属性?

3 个答案:

答案 0 :(得分:4)

要在apply任务中传递每个“迭代器”文件的内容,您可以使用输入redirector。例如:

<apply executable="${mysql}" addsourcefile="false">
    <fileset dir="${sql.dir}" />
    <redirector>
      <inputmapper type="glob" from="*" to="${sql.dir}/*" />
    </redirector>
</apply>

将处理sql.dir下的每个文件作为mysql调用的输入流。 我省略了所有的mysql凭证args;他们是需要的。

在您的示例中,您为文件集指定了两个filename元素,但两者都不包含任何通配符 - 请注意fileset文档中说明:

  

如果FileSet中的任何选择器未选择该文件,则   file不被视为FileSet的一部分。这使得一个FileSet   相当于<and>选择器容器。

因此,您的示例文件集实际上将匹配文件。

您也可以考虑使用Ant sql task

答案 1 :(得分:0)

另一位用户出于同样的原因询问了Ant run command with pipes。也许那里的解决方案将解决您的问题。

答案 2 :(得分:0)

尝试执行exec任务并结合 Ant addon Flaka 提供的for循环:

<project name="demo" xmlns:fl="antlib:it.haefelinger.flaka">

 <!-- define your fileset -->
 <fileset dir="${db.main.path_to_dump}" id="foobar">
  <filename name="keyword_category_rel.sql"/>
  <filename name="keyword_classification.sql"/>
 </fileset>

 <!-- call exec for every file in your fileset -->
 <fl:for var="file" in="split('${toString:foobar}', ';')">
  <exec executable="mysql" dir="${basedir}/${build}" input="#{file}">
   <arg value="-u${db.main.user}"/>
   <arg value="-p${db.main.password}"/>
   <arg value="-P${db.main.port}"/>
   <arg value="-h${db.main.host}"/>
   <arg value="-D${db.main.database}"/>
  </exec>
 </fl:for>

</project>