1

我有这个 antbuild.xml文件,里面有 3 个目标:

target1,target2target3.

如果用户只是运行ant而不是显式运行ant target1或类似的东西,我想提示用户询问他想调用哪个目标。

请记住,仅当用户在运行时未显式调用目标时才应提示用户ant

4

2 回答 2

4

Ant 不是一种编程语言,它是一种依赖矩阵语言。两者有很大的不同。

在程序语言中,您可以指定序列的绝对顺序。另外,您在做事方面有更多的灵活性。在 Ant 中,您无需指定执行顺序。您指定各种简短的如何构建此步骤,然后指定它们的依赖关系。Ant 会自动计算出所需的执行顺序。

对于开发人员来说,了解 Ant 是最困难的事情之一。当开发人员试图强制执行顺序并最终一遍又一遍地执行同一组目标时,我见过太多次了。我最近有一个构建她花了将近 10 分钟来构建,我重写了它build.xml以在 2 分钟内生成相同的构建。

您可以使用<input/>获取用户输入,然后使用<exec><java>执行另一个 Ant 进程来执行请求的目标。然而,这打破了 Ant 的工作方式。

默认目标应该是开发人员在编程时希望定期执行的默认目标。它不应该清理构建。它不应该运行 10 分钟的测试。它应该编译任何更改的文件,并重建 war 或 jar。这就是我大约 99% 的时间想要的。整个过程需要10秒。

当有人不理解这一点时,我会非常非常生气。当我打字时我讨厌它,ant并且我得到有关如何执行我的构建的指示。当默认目标清除我以前的编译时,我真的很生气。而且,如果有人提示我做某事,我充满了一种致命的欲望,那就是用一个大的钝物来打击编写该死的构建文件的人。那是因为我将运行 Ant,在构建发生时执行其他操作,然后在我认为构建完成时返回该命令窗口。没有什么比让我更生气的是,回到一个构建只是发现它坐在那里等我告诉它哪个目标。

如果你真的,真的需要这样做。使用名为build.sh. 不要build.xml因为这样做会影响开发而感到困惑。

你真正需要做的是教大家如何使用 Ant:

  • Ant 将在您键入时列出用户可执行目标ant -p。这将列出所有目标及其描述。如果目标没有描述,则不会列出它。这对于用户不应自行执行的内部目标非常有用。(例如,一个目标只是进行某种测试以查看另一个目标是否应该执行)。要完成这项工作,请确保您的目标有描述。当编写 Ant 文件的人对一些我不想要的小目标进行描述时,我很生气,但忘记了我想要的目标的描述(比如编译)。不要让大卫生气。你不想让大卫生气
  • 为您的组使用默认目标名称。这样,我就知道哪些目标在整个项目中做什么,而不是使用vs. BUILDvs. build-programsvs.Compile的一个项目。我们标准化了Maven 生命周期名称。他们被记录在案,没有争论或辩论。build-my-stuffStuffBuild
  • 不要使用<ant/><antcall>强制执行构建顺序。不要把你build.xml分成十几个单独的build.xml程序。所有这些都可能破坏 Ant 构建目标依赖矩阵的能力。此外,许多 Ant 工具在构建中显示依赖层次结构,它们不能跨多个构建文件工作。
  • 不要将构建包装在 shell 脚本中。如果你这样做,你可能不了解构建是如何工作的。
  • 构建不应该更新我的工作目录中由我签出的任何文件。它不应该用遍布各处的各种构建工件来污染我的工作目录。它不应该在工作目录之外做任何事情(除了可能做某种部署,但只有当我运行部署目标时)。事实上,所有构建处理都应该在我的工作目录内的一个子目录中进行。Aclean应该只删除这个目录。有时,这被称为build,有时dist。我通常称它为target因为我采用了 Maven 命名约定。
  • 您的构建脚本应该是构建脚本。它不应该进行结帐或更新——至少不应该自动进行。我知道,如果您将 CruiseControl 用作连续构建过程,则您的 build.xml 中必须具有更新和签出功能。这是我现在使用 Jenkins 的原因之一。

抱歉,这个答案不一定是您要找的答案。你并没有真正说明你在用 Ant 做什么。如果您正在构建,请不要做您想做的事情。如果您正在编写某种程序,请使用真正的编程语言而不是 Ant。

Ant 构建通常应该在一两分钟内完成,并且因为您更改了文件而重做构建不应该超过 30 秒。理解这一点很重要,因为我想鼓励我的开发人员使用 Ant 构建,并使用我的 Jenkins 服务器使用的相同目标。这样,他们就可以像我的 Jenkins 服务器进行官方构建一样测试他们的构建。

于 2013-02-01T15:59:56.090 回答
0

您可以使用inputant 提供的任务并将其设为默认目标。

<input
message="Please enter Target ID (1,2 or 3):"
validargs="1,2,3"
addproperty="targetID"
/>

使用此属性的值来决定执行哪个目标。

从蚂蚁文档:

message:在构建运行期间向用户显示的消息。

validargs:逗号分隔的字符串,包含有效的输入参数。如果设置,输入任务将拒绝此处未定义的任何输入。您可以根据需要传递任何参数。

addproperty:要从 input.Behaviour 创建的属性的名称等于属性任务,这意味着不能覆盖现有属性。

于 2013-02-01T13:22:05.793 回答