Как часть решения, содержащего много проектов, у меня есть проект что ссылки (через a <ProjectReference>
три других проекта в решении, плюс некоторые другие). В AfterBuild
, Я должен скопировать выводы 3 определенных зависимых проектов к другому местоположению.
Через различный ТАК ответы, и т.д. способ, которым я обосновался на выполнить, который был:
<MSBuild
Projects="@(ProjectReference)"
Targets="Build"
BuildInParallel="true"
Condition="'%(Name)'=='ProjectA' OR '%(Name)'=='ProjectB' OR '%(Name)'=='ProjectC'">
<Output TaskParameter="TargetOutputs" ItemName="DependentAssemblies" />
</MSBuild>
<Copy SourceFiles="@(DependentAssemblies)" DestinationFolder="XX" SkipUnchangedFiles="true" />
Однако я столкнулся с проблемами с этим. <MSBuild
шаг IncrementalClean
задача заканчивает тем, что удалила много выводов ProjectC
. При выполнении этого под VS2008, a build.force
файл, депонируемый в obj/Debug
папка ProjectC, который затем инициировал ProjectC, восстанавливаемый, если я делаю Сборку на всем решении если проект, содержащий это AfterBuild
цель, тогда как, если Вы исключаете этот проект из сборки, она [правильно] не инициировала восстанавливание ProjectC (и критически восстанавливание всех зависимых ProjectC). Это может быть определенным для VS обманом в этом случае, который не произошел бы в контексте TeamBuild или другой командной строки вызов MSBuild (но наиболее распространенное использование будет с помощью VS, таким образом, я должен буду разрешить это так или иначе),
Зависимые проекты (и остальная часть решения в целом) были все созданы в интерактивном режиме с VS, и следовательно ProjectRefence
s содержат относительные пути и т.д. Я видел упоминание об этом являющемся вероятным порождением проблем - но без полного объяснения почему, или когда оно будет зафиксировано или как работать вокруг этого. Другими словами, я действительно не интересуюсь, например, преобразование ProjectReference
пути к полным путям редактированием руки .csproj.
В то время как совершенно возможно, что я делаю что-то глупое, и кто-то сразу укажет на то, что это (который был бы большим), быть гарантированным, что я провел много времени, детально изучив /v:diag
выводы и т.д. (хотя я не попытался создать репродукцию с нуля - это находится в контексте относительно сложной полной сборки),
Мой текущий обходной путь основан на этом вопросе SO , то есть у меня есть:
<ItemGroup>
<DependentAssemblies Include="
..\ProjectA\bin\$(Configuration)\ProjectA.dll;
..\ProjectB\bin\$(Configuration)\ProjectB.dll;
..\ProjectC\bin\$(Configuration)\ProjectC.dll">
</DependentAssemblies>
</ItemGroup>
Это, однако, не работает в TeamBuild (где все выходные данные попадают в один каталог), а также если имена изменения любого из выходов зависимых проектов.
РЕДАКТИРОВАТЬ: Также ищем комментарии о том, есть ли более ясный ответ о том, как сделать жесткое кодирование немного чище, чем:
<PropertyGroup>
<_TeamBuildingToSingleOutDir Condition="'$(TeamBuildOutDir)'!='' AND '$(CustomizableOutDir)'!='true'">true</_TeamBuildingToSingleOutDir>
</PropertyGroup>
и:
<ItemGroup>
<DependentAssemblies
Condition="'$(_TeamBuildingToSingleOutDir)'!='true'"
Include="
..\ProjectA\bin\$(Configuration)\ProjectA.dll;
..\ProjectB\bin\$(Configuration)\ProjectB.dll;
..\ProjectC\bin\$(Configuration)\ProjectC.dll">
</DependentAssemblies>
<DependentAssemblies
Condition="'$(_TeamBuildingToSingleOutDir)'=='true'"
Include="
$(OutDir)\ProjectA.dll;
$(OutDir)\ProjectB.dll;
$(OutDir)\ProjectC.dll">
</DependentAssemblies>
</ItemGroup>