我有一个包含3个目标的ant build.xml
文件:
target1
,target2
和target3
。
如果用户只是运行ant
而不是明确的ant target1
或类似的东西,我想提示用户询问他想要拨打哪个目标。
请记住,只有在运行ant
时没有显式调用目标时,才会提示用户
答案 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。BUILD
与build-programs
与Compile
vs build-my-stuff
与StuffBuild
相比的一个项目。 。我们对Maven lifecycle names名称进行了标准化。他们已经记录在案,没有争论或辩论。<ant/>
或<antcall>
来强制执行构建订单。不要将build.xml
划分为十几个单独的build.xml
计划。所有这些都可能破坏Ant构建目标依赖矩阵的能力。此外,许多Ant工具在构建中显示依赖关系层次结构,并且它们可以跨多个构建文件工作。clean
应该只删除这个目录。有时,这称为build
,有时称为dist
。我通常将其称为target
,因为我已采用Maven命名约定。很抱歉,这个答案不一定是您正在寻找的答案。你并没有真实地说明你对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创建的属性的名称等于属性任务,这意味着现有 属性不能被覆盖。