如果没有指定,则询问用户要调用哪个目标

时间:2013-02-01 11:32:50

标签: ant

我有一个包含3个目标的ant build.xml文件:

target1target2target3

如果用户只是运行ant而不是明确的ant target1或类似的东西,我想提示用户询问他想要拨打哪个目标。

请记住,只有在运行ant时没有显式调用目标时,才会提示用户

2 个答案:

答案 0 :(得分:4)

Ant不是一种编程语言,它是一种依赖矩阵语言。这两者之间存在很大差异。

在程序语言中,您可以指定序列的绝对顺序。此外,您可以更灵活地做事。在Ant中,您不需要指定执行顺序。您可以指定各种简短的如何构建此步骤,然后指定它们的依赖项。 Ant会自动确定所需的执行顺序。

这是开发人员了解Ant最困难的事情之一。当开发人员试图强制执行命令并且一遍又一遍地执行同一组目标时,我已经看过太多次了。我最近有一个构建她,花了差不多10分钟构建,我重新编写build.xml以在2分钟内生成相同的构建。

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

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

当有人不理解这一点时,我真的很生气。当我输入ant时我讨厌它,并且我得到了如何执行构建的指示。当默认目标清除我以前的编译时,我真的很恼火。并且,如果我被提示做某事,我会充满致命的渴望,用一个大的钝器打击那个该死的构建文件的人。那是因为我将运行Ant,在构建发生时执行其他操作,然后在我认为构建完成时返回到该命令窗口。没有什么能让我更有兴趣回到 build ,却发现它坐在那里等着我告诉它目标。

如果你真的,真的需要这样做。使用名为build.sh的shell脚本。不要与build.xml做同事,因为这会影响发展。

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

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

很抱歉,这个答案不一定是您正在寻找的答案。你并没有真实地说明你对Ant的所作所为。如果您正在进行构建,请不要执行您尝试执行的操作。如果您正在编写某种程序,请使用真正的编程语言而不是Ant。

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

答案 1 :(得分:0)

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

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

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

来自ant文档:

  

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

     

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

     

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