Как определить, какая цель вызывает мою текущую цель в Нанте? - PullRequest
1 голос
/ 23 декабря 2008

Я даже не уверен, правильно ли сформулирован мой вопрос ... но я постараюсь объяснить, с чем я сейчас борюсь. Я не очень опытен в этом, так что простите меня, если мои объяснения не самые лучшие .... и я также пытаюсь упростить мой сценарий сборки для целей этого вопроса, так что, если мне не хватает некоторых деталей, дайте знаю ...

Я изменяю скрипт сборки Nant для запуска некоторых модульных тестов. У меня есть разные цели для локально запускаемых тестов и тестов, которые будут выполняться в командном городе.

<target name="run-unit-tests">  
   <property name="test.executable" value="tools\nunit\nunit-console.exe"/>
   <call target="do-unit-tests"/>
</target>

<target name="run-unit-tests-teamcity"> 
   <property name="test.executable" value="${teamcity.dotnet.nunitlauncher}"/>      
   <call target="do-unit-tests"/>
</target>

в цели do-unit-tests Я установил, какие тестовые сборки запускаются, установив свойство и вызвав NCover для выполнения покрытия кода следующим образом:

<target name="do-unit-test">
   <property name="test.assemblies" value="MyProject.dll">
   <call target="do-unit-test-coverage" />
</target>

<target name="do-unit-test-coverage">
   <ncover <!--snip -->
           commandLineArgs="${test.args}"
   <!--snip-->
   </ncover>
</target>

Как вы можете видеть в части ncover, мне нужно свойство с именем "test.args" . Это свойство зависит от "test.assemblies"

т.е.: <property name="test.args" value="${test.assemblies} <!--snip -->" />

test.args нужно настроить по-разному между локальным модульным тестом и тестом в командном городе ... поэтому я пытаюсь выяснить, как его настроить.

если я помещаю свойство для test.args в "do-unit-test" после свойства "test.assemblies", я не могу указать один test.args, если do-unit-test вызывается run-unit- тесты и другое для run-unit-tests-teamcity.

Я пытался сделать что-то вроде следующего в "do-unit-test":

<if test="${target::exists('run-unit-tests-teamcity')}">
 <property name="test.args" value="..." />
</if>

но очевидно, что это не работает, потому что цель всегда будет существовать.

Затем я хотел бы проверить, была ли моя текущая цель do-unit-test вызвана run-unit-tests-teamcity

Возможно ли это? Я не вижу этого в документации Нанта? Так как его там нет, это либо означает, что это будет функция в будущем, либо я не понимаю, как это указано в сценарии сборки Nant.

Любая помощь будет оценена по этому вопросу.

Ответы [ 2 ]

2 голосов
/ 23 декабря 2008

Вы можете определить свойства в одной цели и использовать их значения в другой ... Например, вы можете определить

<target name="run-unit-tests">
   <property name="test.executable" value="tools\nunit\nunit-console.exe"/>
   <property name="test.extratestargs" value="foo,bar,baz"/>
   <call target="do-unit-tests"/>
</target>

<target name="run-unit-tests-teamcity">
   <property name="test.executable" value="${teamcity.dotnet.nunitlauncher}"/>         
   <property name="test.extrtestargs" value="foo,baz,quux,xyzzy"/>
   <call target="do-unit-tests"/>
</target>

<target name="do-unit-test-coverage">
   <property name="test.args" value="${test.assemblies} ${test.extratestargs} <!--snip -->" />
   <ncover <!--snip -->
           commandLineArgs="${test.args}" >
   <!--snip-->
   </ncover>
</target>


Или, если вам нужно, чтобы они были структурированы совершенно по-другому, а не просто имели какие-то разные значения, воспользуйтесь тем, что замена свойства задерживается:


<?xml version="1.0"?>

<project name="nanttest">

        <target name="run-unit-tests">
           <property name="test.executable" value="tools\nunit\nunit-console.exe"/>
           <property name="test.args" value="foo bar -assembly ${test.assemblies} baz" dynamic="true"/>
           <call target="do-unit-test"/>
        </target>

        <target name="run-unit-tests-teamcity">
           <property name="test.executable" value="${teamcity.dotnet.nunitlauncher}"/>
           <property name="test.args" value="foo,baz,quux /a:${test.assemblies} xyzzy" dynamic="true"/>
           <call target="do-unit-test"/>
        </target>

        <target name="do-unit-test-coverage">
           <echo message="test.executable = ${test.executable}, test.args = ${test.args}" />
        </target>

        <target name="do-unit-test">
           <property name="test.assemblies" value="MyProject.dll"/>
           <call target="do-unit-test-coverage" />
        </target>


</project>

user@host:/tmp/anttest$ nant run-unit-tests
[...snip...]
run-unit-tests:
do-unit-test:
do-unit-test-coverage:
     [echo] test.executable = tools\nunit\nunit-console.exe, test.args = foo bar -assembly MyProject.dll baz
BUILD SUCCEEDED
Total time: 0 seconds.

user@host:/tmp/anttest$ nant -D:teamcity.dotnet.nunitlauncher=nunitlauncher run-unit-tests-teamcity
[...snip...]
run-unit-tests-teamcity:
do-unit-test:
do-unit-test-coverage:
     [echo] test.executable = nunitlauncher, test.args = foo,baz,quux /a:MyProject.dll xyzzy
BUILD SUCCEEDED
Total time: 0 seconds.

Если вам действительно нужно знать, работаете ли вы в TeamCity, то это должно помочь:

<target name="run-unit-tests-teamcity">
   <property name="test.executable" value="${teamcity.dotnet.nunitlauncher}"/>         
   <property name="running.in.teamcity" value="true"/>
   <call target="do-unit-tests"/>
</target>

0 голосов
/ 24 декабря 2008

Мне удалось решить проблему. Я не знаю, является ли это лучшим решением, но это решение.

Я устанавливаю свойство с именем test.type и затем использую оператор if, чтобы определить, из какой цели он пришел.

<target name="run-unit-tests">  
   <property name="test.executable" value="tools\nunit\nunit-console.exe"/>
   <property name="test.type" value="unit-tests" />
   <call target="do-unit-tests"/>
</target>

<target name="run-unit-tests-teamcity"> 
   <property name="test.executable" value="${teamcity.dotnet.nunitlauncher}"/>          
   <property name="test.type" value="unit-tests-teamcity" />
   <call target="do-unit-tests"/>
</target>

<target name="do-unit-test">
   <property name="test.assemblies" value="MyProject.dll">
   <call target="do-unit-test-coverage" />
</target>

<target name="do-unit-test-coverage">

   <if test="${test.type=='unit-tests'}">
      <property name="test.args" value="${test.assemblies} ..."/>
   </if>

   <if test="${test.type=='unit-tests-teamcity'}">
      <property name="test.args" value="... ${test.assemblies}"/>
   </if>

   <ncover <!--snip -->
           commandLineArgs="${test.args}"
   <!--snip-->
   </ncover>
</target>

О, и извините, Стобор за то, что отказался от ответа на ваш вопрос ... Я ненавижу, когда люди меня опускают, но в этом случае мне пришлось это сделать, потому что кто-то проголосовал за ваш ответ, даже если он был неправильным, что означает, что мой вопрос не будет отображаться без ответа раздел вопросов сайта ...

...