【问题标题】:Does Ant Support File-based Dependencies?Ant 支持基于文件的依赖吗?
【发布时间】:2010-11-10 12:25:42
【问题描述】:

我想创建一个目标文件依赖于源文件的 ant 依赖项。您如何在 ant 中描述这一点?

例如,将此 Make 目标转换为 ant

data.txt: header1.txt body.txt footer.txt
      cat header1.txt body.txt footer.txt > data.txt

【问题讨论】:

  • 提供更多信息可能会帮助您找到解决方案,所以您是说如果文件 A 更改然后执行任务?

标签: java ant


【解决方案1】:

你也许可以做这样的事情,但它开始听起来像脚本。 Ant 不是一种脚本语言。如果你脑子里有很多“if/then/else”逻辑,那么你可能做错了。

请描述“其他数据”。我们在谈论复制文件吗?这是 devl/test/prod 环境问题吗?在这种情况下,您当然可以传入一个指定环境名称的参数并使用条件测试来决定要复制哪个集。阅读this 了解如何操作。

【讨论】:

  • 项目的构建不就是由ant来决定的吗?这是否意味着它必须每次都进行完整的构建?
  • Ant 足够聪明,只编译被触及的代码。为什么每次出现问题时都进行完整构建?我能想到的唯一问题是长时间运行的单元测试。如果是这种情况,请将它们分开。
  • 这不是我关心的代码库。我的构建系统需要为我的应用程序将其他数据部署到我的系统中。这是 Make 可以毫不费力地处理的事情。如果我不能使用 Ant 进行一步构建,那么其他选项是什么?在 Make 中包裹 ant 是否常见?
【解决方案2】:

如果您只是想让一个目录中的文件相对于您的源代码树是最新的, 您可以使用sync 任务。这是文档中的一个基本示例:

<sync todir="site">
  <fileset dir="generated-site"/>
</sync>

site 覆盖所有文件 来自生成的站点的较新文件, 从 site 中删除不属于 存在于生成的站点中。

如果您需要确定哪些资源需要更新, 为了执行比同步更复杂的操作, 您可以使用 ant-contrib outofdate 任务。例如

<outofdate property="compile.needed" outputsourcespath="sources.for.recompile">
    <sourcefiles>
        <fileset dir="${src}" includes="*.c"/>
    </sourcefiles>
    <mapper type="glob" dir="${src}" from="*.c" to="${obj}/*.o"/>
</outofdate>

如果任何目标文件与源文件相比已过期,则将compile.needed 设置为true, 并设置路径 sources.for.recompile 并列出需要重新编译的源 - 然后,您可以只针对这些源进行编译。

(这里假设构建输出区域中的单个文件与一个源直接相关。)

【讨论】:

  • 谢谢,但我仍然很困惑 Make 的核心设计如何被视为 ant 的附加组件?
【解决方案3】:

我现在的简单解决方案是在我的 shell 脚本中手动添加源/目标文件年龄的测试,该脚本是从 ant 中的 exec 任务调用的。

【讨论】:

  • 我迟到了 10 年,但就像 10 年前的你一样,看到蚂蚁不能开箱即用地做到这一点,我完全感到困惑。
猜你喜欢
  • 1970-01-01
  • 2019-08-15
  • 2011-08-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-10
  • 1970-01-01
相关资源
最近更新 更多