Мне нужно собрать в одну папку все тестовые сборки, их зависимости и файлы конфигурации.Процесс должен сохранять структуру каталогов из результатов каждого тестового проекта.У нас есть решение, которое требует ручного подключения тестовых проектов к основному проекту, но в нашем решении слишком много проектов, чтобы его можно было обслуживать.Они должны быть расположены автоматически в соответствии с соглашением об именах (x.UnitTest.csproj, y.IntegrationTest.csproj).
Для фона мы работаем с системой сборки, которая передает артефакты (двоичные файлы и т. Д.) Между агентами.Мы компилируем на одном агенте и тестируем на других агентах.Массовое дублирование сборок между тестовыми проектами замедляет процесс сборки.
Что я сделал: 1) У меня есть csproj, который ссылается на большинство тестовых проектов.Это получает двоичные файлы и зависимости в одну папку.2) Я могу идентифицировать все файлы для копирования с помощью этого
<CreateItem
Include="%(ProjectReference.RootDir)%(ProjectReference.Directory)$(OutDir)*.config">
<Output TaskParameter="Include" ItemName="TestConfigurationFiles"/>
</CreateItem>
<Copy
SourceFiles="@(TestConfigurationFiles)"
DestinationFolder="$(OutDir)">
</Copy>
Я пытался сделать самые очевидные вещи, такие как
MsBuild task: атрибут RebaseOutputs,переопределяя свойство OutDir.Я могу предоставить задаче msbuild динамически сгенерированный набор выходных данных, но могу построить их только в их папке по умолчанию.
Подключение к TargetOutputs задачи msbuild дает только первичную выходную сборку (без зависимостей).
Я экспериментировал с «Копировать всегда» для файлов конфигурации.Это помещает их в выходной каталог зависимого проекта как «app.config», а не «dllname.config» и не в окончательный проект.
Решения, которые могут сделать это лучше, могутinclude
Предоставьте пример динамического добавления в массив элементов проекта перед компиляцией.
Используйте msbuild TargetOutputs для создания списка всех файловв папке (а не только основной выход) и скопируйте в папку назначения.
Сегодня я использую msbuild 3.5.В идеале решение будет работать с msbuild 3.5.Мы скоро переходим на .NET 4 / MsBuild 4, поэтому, если это необходимо сделать в .Net 4, это нормально.