我将使用以下命令使用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代码,但是如何将文件集列表文件中的数据读入属性?
答案 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>