使用 Ant 进行自动化处理时,不想记住每一个 target 的名称,而是让默认的 target 列出需要的 target 出来,让用户输入名称或数字选择执行哪个 target。这样做自然是多了一步,有时候确也方便不少,但 Ant 还是有个缺点,它不能持久性的保持在 Ant 控制台下,持续的进行用户交互。
对于实现 Ant 的简单用户交互,我们可以借助于两个 Task,input 和 antcall, input 用来提示用户输入值,再根据 input 设定的属性来确定 antcall 调用哪个 target。执行完退出到系统 Shell 下,想要再来,就再执行一下 ant 吧,我也只能做到这一步了。
看下面的例子 build.xml 内容
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
<project default="showTasks" name="input"> <target name="task1" if="do.1"> <echo>execute task 1</echo> </target> <target name="task2" if="do.2"> <echo>execute task 2</echo> </target> <target name="task3" if="do.3"> <echo>execute task 3</echo> </target> <target name="showTasks"> <echo>1 task1</echo> <echo>2 task2</echo> <echo>3 task3</echo> <input validargs="1,2,3" addproperty="option" defaultvalue="1">place your option</input> <condition property="do.1"> <equals arg1="1" arg2="${option}"/> </condition> <antcall target="task1"/> <condition property="do.2"> <equals arg1="2" arg2="${option}"/> </condition> <antcall target="task2"/> <condition property="do.3"> <equals arg1="3" arg2="${option}"/> </condition> <antcall target="task3"/> </target> </project> |
在控制台下执行 ant, 根据提示输入 2
unmi@localhost$ ant
Buildfile: /Users/unmi/test/build.xml
showTasks:
[echo] 1 task1
[echo] 2 task2
[echo] 3 task3
[input] place your option ([1], 2, 3)
2
task1:
task2:
[echo] execute task 2
task3:
BUILD SUCCESSFUL
Total time: 1 second
执行了 task2。
对比脚本和执行结果很好理解
1. 提示用户输入,并把输入设置为 option 的属性值,可用 validargs 限定输入范围,并可指定默认值,即直接回车的值
2. 根据得到的 option 值创造各种条件 do.1, do.2, do.3
3. 其实是今次尝试去调用 target task1, task2, task3
4. 在每个 target 上都设置了执行条件,如 if="do.2"
所以上面执行的是 task2。
可惜这个脚本都能执行一次就退到系统 Shell 上了,没法持续呆在 Ant 控制台下,比如再次提示,换成别的输入又可以为我们执行其他的任务。这个不容易做到。假使在 task2 最后处再写上 <antcall target="showTasks"/> 这样会造成一个死循环,原因为 <input> 只有在不存在 “addproperty” 指定的 option 属性值时才会提示,否则直接往下走,结果 option 一直是 2,所以不停的执行 task2, 直至崩溃。
那么可不可以 unset 掉 option 属性呢,不能,ant 中 property 出来的东西都是 immutable,是常量,不能死也不能变。如果还能多走一步的话,可让 task2 antcall 另一个含 <input> 的 target,那么真正的 task 的执行条件设计起来就会变得很复杂,我还是死了这条心吧。
如果想要持续的呆在自己的控制台下,可以选择其他的构建工具,如 PlayFramework1, 和 2 分别用的 Python 和 SBT。
本文链接 https://yanbin.blog/ant-prompt-input-call-different-task/, 来自 隔叶黄莺 Yanbin Blog
[版权声明] 本文采用 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 进行许可。