MSBuild CreateItem условие включения на основе файла конфигурации

Я пытаюсь выбрать список тестовых библиотек, которые содержат соответствующие файлы конфигурации

MyTest.Tests.dll
MyTest.Tests.config

Я должен использовать createItem, поскольку DLL не доступны во время загрузки скрипта

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

Есть ли условие, которое я могу использовать, или это неправильный подход?

Спасибо
макинтош

РЕДАКТИРОВАТЬ:

Хорошо, чтобы уточнить, мне нужно создать файл проекта xUnit.Net. Мне нужно сделать это, потому что я запускаю тесты через xUnit.Console через nCover (не спрашивайте!), Но в общем и целом я могу использовать только файл проекта. У меня проблема, когда у меня есть тестовая DLL со связанным файлом.config. Без конфигурационного файла тестовый запуск не удастся.

Это означает, что мне нужно условно добавить дополнительный атрибут (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>

Задача 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 ответа

Решение

Вы можете просто использовать вывод задачи MSBuild в качестве источника для вашей задачи CreateItem.

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

Ваше описание проблемы мне не совсем понятно, но ваши.Tests.dll всегда должны быть доступны, потому что вы должны сначала построить свой проект перед его тестированием. Всякий раз, когда вы строите свой проект, вы можете запускать задачу CreateItem. CreateItem - хороший подход для извлечения.dll, но вам не нужно условие для этого.

Таким образом, в вашем файле сборки у вас должно быть что-то вроде этого: - Создайте проект / решение -> .dll будут созданы - Выполните CreateItem - Сделайте что-нибудь с элементом

Я предполагаю, что с этим ужасом вы пытаетесь автоматизировать свои тесты?

Другие вопросы по тегам