Ужасно, но вот оно. Мы можем взломать цели во время выполнения, используя некоторый код внутри тега <script>
. Код в do-dry-run
ниже устанавливает атрибут unless
для каждой из ваших целей, а затем устанавливает это свойство так, чтобы ни одна из них не выполнялась. Ant по-прежнему выводит имена целей, которые не были выполнены из-за атрибута unless
.
* (теги сценариев JavaScript, похоже, поддерживаются в Ant 1.8+ с использованием версий Java Oracle, OpenJDK и IBM.)
<?xml version="1.0" encoding="UTF-8"?>
<project default="build">
<target name="targetA"/>
<target name="targetB" depends="targetA">
<echo message="DON'T RUN ME"/>
</target>
<target name="targetC" depends="targetB"/>
<target name="build" depends="targetB"/>
<target name="dry-run">
<do-dry-run target="build"/>
</target>
<macrodef name="do-dry-run">
<attribute name="target"/>
<sequential>
<script language="javascript"><![CDATA[
var targs = project.getTargets().elements();
while( targs.hasMoreElements() ) {
var targ = targs.nextElement();
targ.setUnless( "DRY.RUN" );
}
project.setProperty( "DRY.RUN", "1" );
project.executeTarget( "@{target}" );
]]></script>
</sequential>
</macrodef>
</project>
Когда я запускаю это нормально, происходит echo
:
$ ant
Buildfile: build.xml
targetA:
targetB:
[echo] DON'T RUN ME
build:
BUILD SUCCESSFUL
Total time: 0 seconds
Но когда я бегу всухую, это не так:
$ ant dry-run
Buildfile: build.xml
dry-run:
targetA:
targetB:
build:
BUILD SUCCESSFUL
Total time: 0 seconds