如何确定在Nant中调用当前目标的目标是什么?

时间:2008-12-23 07:11:23

标签: configuration nant build-script

我甚至不确定我的问题措辞是否正确......但我会试着解释一下我目前正在努力解决的问题。我对此并不是很有经验,所以请原谅我,如果我的解释不是最好的......我也试图为了这个问题的目的简化我的构建脚本,所以如果我错过了一些细节让我知道...

我正在修改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”

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

test.args需要在本地运行的单元测试和团队城市之间进行不同的设置...所以我试图弄清楚如何设置它。

如果我将test.args的属性放在属性“test.assemblies”之后的“do-unit-test”中我不能指定一个test.args如果运行单元调用do-unit-test-测试和另一个用于run-unit-tests-teamcity。

我一直在尝试在“do-unit-test”中执行以下操作:

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

但显然这不起作用,因为目标将始终存在。

我当时要测试的是 run-unit-tests-teamcity

是否已调用当前目标 do-unit-test

这可能吗?我在Nant文档中看不到它?既然它不存在它或者意味着它将来会成为一个特征,或者我不理解在Nant构建脚本中如何指定事物。

任何帮助都会受到赞赏。

2 个答案:

答案 0 :(得分:2)

您可以在一个目标中定义属性,并在另一个目标中使用它们的值...例如,您可以定义

<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>

答案 1 :(得分:0)

我设法解决了这个问题。我不知道它是否是最佳解决方案,但它是 解决方案。

我设置了一个名为 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>

哦,抱歉Stobor对你的回答低估了...我讨厌当人们向我投票但是在这种情况下我不得不因为有人提出你的答案,即使它是不正确的,这意味着我的问题不会出现在未答复中该网站的问题部分......