То есть, вызовет следующую цель, когда testSetupDone будет оценивать значение false, выполнить цели в цепочке зависимостей?
<target name="-runTestsIfTestSetupDone" if="testSetupDone" depends="-runTests" />
То есть, вызовет следующую цель, когда testSetupDone будет оценивать значение false, выполнить цели в цепочке зависимостей?
<target name="-runTestsIfTestSetupDone" if="testSetupDone" depends="-runTests" />
Да, зависимости выполняются до того, как условия будут оценены.
Из руководства Ant:
Важно: атрибуты if и if позволяют включать или отключать только те объекты, к которым они прикреплены. Они не контролируют, зависят ли цели, которые условная цель зависит от того, выполняются ли они. Фактически, они даже не оцениваются до тех пор, пока цель не будет выполнена, и все ее предшественники уже запущены.
Вы также могли бы попробовать себя:
<project>
<target name="-runTests">
<property name="testSetupDone" value="foo"/>
</target>
<target name="runTestsIfTestSetupDone" if="testSetupDone" depends="-runTests">
<echo>Test</echo>
</target>
</project>
Я устанавливаю свойство testSetupDone
внутри зависимой цели, а вывод:
Buildfile: build.xml
-runTests:
runTestsIfTestSetupDone:
[echo] Test
BUILD SUCCESSFUL
Total time: 0 seconds
Выполняется таргетинг -runTests
, хотя testSetupDone
не установлен в данный момент, а runTestsIfTestSetupDone
выполняется впоследствии, поэтому depend
оценивается до if
(используя Ant 1.7.0).
От документы:
Ant tries to execute the targets in the depends attribute in the order they
appear (from left to right). Keep in mind that it is possible that a
target can get executed earlier when an earlier target depends on it:
<target name="A"/>
<target name="B" depends="A"/>
<target name="C" depends="B"/>
<target name="D" depends="C,B,A"/>
Suppose we want to execute target D. From its depends attribute,
you might think that first target C, then B and then A is executed.
Wrong! C depends on B, and B depends on A,
so first A is executed, then B, then C, and finally D.
Call-Graph: A --> B --> C --> D