当从 NAnt 脚本调用 PartCover 时,我必须经过许多步骤才能最终让 PartCover 正常工作。为了方便他人,我收集了我必须在这里做的一切;请注意,其中一些已经被其他人回答了,但我花了很多时间把它们放在一起。
首先,正如此处其他地方所回答的那样,如果您的操作系统是 64 位,则需要运行 [最新的 Windows SDK]\bin\CorFlags.exe [PartCover install dir]\PartCover.exe /32BIT+ /Force
这是 PartCover 安装后的一次性步骤。它将更改可执行文件,并警告您需要重新签署程序集,但我没有这样做,它(最终)工作正常。请注意,尽管 CorFlags 看起来没有按照您的要求执行并警告您有关签名,但它确实更改了 .exe,只是没有明确指出这一点。
接下来,如果您的操作系统是 64 位,并且您使用 NUnit(或其他测试 exe)和 PartCover,您将需要调用为 x86 显式编译的版本。在 NUnit 的情况下,这将是 nunit-console-x86.exe。调用 nunit-console.exe 只会在完成工作后无限期地挂起,而不是返回提示。
接下来,正如此处其他地方所回答的那样,开发版本 PartCover 2.3 即使在其上运行了 CorFlags 后也默默地失败了。但是,2.2 起作用了。
接下来,当调用 PartCover.exe 时,参数的语法是 --arg-name ... 而不是 --=arg-name(即破折号空格 arg 名称,而不是破折号等于 arg 名称);PartCover 文档似乎是双向的,但等号对我不起作用。
在上述之后,PartCover 终于可以从命令行工作了。我使用了一个设置文件(您可以使用 PartCover 浏览器 UI 应用程序保存一个设置文件,然后您可以从命令行使用),因此我指定的唯一参数是设置文件完整路径和输出报告文件命名完整路径。
当从 NAnt 脚本调用时,这仍然不起作用,所以我终于意识到必须引用 arg 值......并使用 HTML 编码的标记作为引号。因此...
摘录:
<property name="PartCoverExePath" value="c:\Program Files (x86)\PartCover .NET 2\PartCover.exe" />
<property name="PartCoverWorkPath" value="c:\Projects\MyProject\trunk\CI\" />
<property name="PartCoverSettingsFileName" value="PartCover.Settings.xml" />
<property name="PartCoverReportFileName" value="PartCover.Report.xml" />
<target name="MyTarget">
<exec program="${PartCoverExePath}">
<arg value="--settings "${PartCoverWorkPath}${PartCoverSettingsFileName}"" />
<arg value="--output "${PartCoverWorkPath}${PartCoverReportFileName}"" />
</exec>
</target>
PartCover 设置文件:
<PartCoverSettings>
<Target>C:\CI\Binaries\NUnit2.5.2\bin\net-2.0\nunit-console-x86.exe</Target>
<TargetWorkDir>c:\Projects\MyProject\trunk\MyProject.Test\bin\Debug</TargetWorkDir>
<TargetArgs>MyProject.Test.dll</TargetArgs>
<Rule>+[*]*</Rule>
<Rule>-[log4net*]*</Rule>
<Rule>-[nunit*]*</Rule>
<Rule>-[MyProject.Test*]*</Rule>
</PartCoverSettings>
呸!希望这可以避免其他人让我头疼。