MSBuild CreateItem条件包括基于配置文件

时间:2010-04-11 13:10:04

标签: msbuild createitem

我正在尝试选择包含相应配置文件的测试dll列表

MyTest.Tests.dll
MyTest.Tests.config

我必须使用createItem,因为在加载脚本时dll不可用

<CreateItem Include="$(AssemblyFolder)\*.Tests.dll"
            Condition="???"
  <Output TaskParameter="Include" ItemName="TestBinariesWithConfig"/>
</CreateItem>

是否存在我可以使用的情况或这是错误的方法?

感谢
MAC

编辑:

好的,澄清一下,我需要构建一个xUnit.Net项目文件。我需要这样做,因为我通过nCover通过xUnit.Console运行器运行测试(不要问!)但是它的长短是我只能使用项目文件。我遇到的问题是当我有一个带有相关.config文件的测试dll时。没有配置文件,测试运行器将失败。

这意味着我需要在测试项目文件中有条件地添加一个额外的属性(config-file)。

项目模板文件:

<?xml version="1.0" encoding="utf-8"?>
<xunit>
  <assemblies>
<!-- SAMPLE    <assembly filename="Tests.dll" shadow-copy="false" config-file="Tests.dll.config" />     -->
<!-- @TARGETS@ -->
  </assemblies>
</xunit>

没有配置文件的测试dll的FileUpdate任务。

<FileUpdate
  Files="$(AssemblyFolder)\$(XUnitProjectFileName)"
  Regex="&lt;!-- @TARGETS@ --&gt;"
  ReplacementText="&lt;!-- @TARGETS@ --&gt;%0D%0A&lt;assembly filename='$(AssemblyFolder)\%(TestBinaries.FileName)%(TestBinaries.Extension)' shadow-copy='false' /&gt;"
  />

所以我需要一种方法来有条件地在FileUpdate任务中添加额外的属性,具体取决于测试dll是否有相应的配置文件。

2 个答案:

答案 0 :(得分:1)

您可以使用MSBuild Task输出作为CreateItem Task的源。

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

    <ItemGroup>
        <ProjectReferences Include="*.*proj" />
    </ItemGroup>

    <Target Name="BuildMyProjects">
        <MSBuild
            Projects="@(ProjectReferences)"
            Targets="Build">
            <Output
                TaskParameter="TargetOutputs"
                ItemName="AssembliesBuiltByChildProjects" />
        </MSBuild>
    </Target>

    <Target Name="AddConfigMetadata" DependsOnTargets="BuildMyProjects">
        <CreateItem
            Include="@(AssembliesBuiltByChildProjects)"
            AdditionalMetadata="config-file=%(Identity).config">
            <Output
                TaskParameter="Include"
                ItemName="MySourceItemsWithMetadata" />
        </CreateItem>
    </Target>

    <Target Name="WhatEverYouLikeToDo" DependsOnTargets="AddConfigMetadata">
        <Message Text="%(MySourceItemsWithMetadata.config-file)" />
    </Target>

</Project>

答案 1 :(得分:0)

您的问题描述对我来说并不是很清楚,但您的.Tests.dll应始终可用,因为您应该在测试之前先构建项目。无论何时构建项目,都可以运行CreateItem任务。 CreateItem是检索.dll的好方法,但你不需要条件。

所以在你的构建文件中你应该有这样的东西: - 构建项目/解决方案 - &GT; .dll将被创建 - 执行CreateItem - 对项目做一些事情

有了这个awnser,我假设你正在尝试自动化你的测试?