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

发布于 2024-12-09 14:57:18 字数 734 浏览 0 评论 0 原文

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

I will use the following command to import a set of sql files using the mysql commnd.

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

The problem is that the mysql command execept the file as command input not as a parameter. So is there a way to provide the file from the fileset as input not as parameter?

Another option is to use the -e argument it accept the sql code from the file, but how can i read the data from the file of the fileset list into a property?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

街角卖回忆 2024-12-16 14:57:18

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

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

将处理 sql.dir 下找到的每个文件作为 mysql 调用的输入流。
我省略了所有 mysql 凭据参数;他们会被需要。

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

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

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

您还可以考虑使用 Ant sql 任务为了这。

To pass the content of each 'iterator' file in an apply task you can use an input redirector. For example:

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

will process each file found under the sql.dir as the input stream of a mysql invocation.
I've omitted all the mysql credential args; they would be needed.

In your example you specify two filename elements for the fileset, but neither contains any wildcard - note that in the fileset docs it says:

If any of the selectors within the FileSet do not select the file, the
file is not considered part of the FileSet. This makes a FileSet
equivalent to an <and> selector container.

So your example fileset will actually match zero files.

You might also look into using the Ant sql task for this.

软的没边 2024-12-16 14:57:18

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

Another user asked about Ant run command with pipes for the same reason. Maybe the solutions there will solve your problem.

摇划花蜜的午后 2024-12-16 14:57:18

尝试将 exec 任务与 Ant 插件 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>

Try the exec task combined with a for loop provided by Ant addon Flaka like that :

<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>
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文