2015-12-11 6 views
0

Я работаю над сценарием MSBuild, задачей которого является построение решения, а затем копирование результата сборки из двух проектов в унифицированный каталог. Достаточно просто.Смутно о содержании MSBuild ItemGroup

Я делаю это с Копия Задача. Как так:

<ItemGroup> 
    <OutputFiles1 Include="Project1\bin\Release\*.*" /> 
    <OutputFiles2 Include="Project2\bin\Release\*.*" /> 
</ItemGroup> 

<Target CopyOutput> 
    <Copy SourceFiles="@(OutputFiles1)" DestinationFolder="DeployOutput" /> 
    <Copy SourceFiles="@(OutputFiles2)" DestinationFolder="DeployOutput" /> 
</Target> 

Проблема я испытываю такова: два ItemGroup элементы содержат содержимое каталогов, когда скрипт сборки начинается, а не содержимое каталогов, когда решение построить заканчивается.

Так, например, если я добавлю ссылку в Project1 к новой сборке, а затем запустите сборку, каталог DeployOutput не содержит эту новую сборку, потому что она не была в каталоге вывода проекта при запуске сборки , Но если я снова запустил сборку , файл будет там и будет скопирован.

Похоже, что это поведение по дизайну, но я не уверен, как выполнить свою задачу без появления в пакетном файле или что-то в этом роде для копирования.

ответ

1

Classical msbuild evaluation order проблема: элементы и свойства в корне проекта в основном оцениваются при разборе, прежде чем запускать какие-либо цели. Поместите их внутрь цели, и они будут оцениваться, когда цель будет работать. Что лучше для вашего случая, так как вы также можете убедиться, что одна цель запускается за другой и, следовательно, делает первые выходные данные, созданные последним. Иллюстрация:

<ItemGroup> 
    <OutputFiles1 Include="Project1\bin\Release\*.*" /> 
</ItemGroup> 

<Target Name="BuildIt"> 
    <Message Text="[email protected](OutputFiles1)" /> 
    <MSBuild Projects="Project1.vcxproj" Targets="Build" /> 
</Target> 

<Target Name="Copy" DependsOnTargets="BuildIt"> 
    <ItemGroup> 
    <ActualOutputFiles1 Include="Project1\bin\Release\*.*" /> 
    </ItemGroup> 
    <Message Text="[email protected](OutputFiles1)" /> 
    <Message Text="[email protected](ActualOutputFiles1)" /> 
</Target> 

При выполнении цели копирования (и выходной каталог еще пуст), вы получите выход как

OutputFiles1= 
.... build output .... 
OutputFiles1= 
ActualOutputFiles1=Project1\bin\Release\a.dll;...... 

OutputFiles1 всегда пусто, так как в то время он был оценен выходной каталог был пуст. ActualOutputFiles1, однако, был оценен после, поэтому он содержит содержимое выходного каталога.

+0

Спасибо. Моя подруга также благодарит вас, что мне больше не придется лысать от разочарования. –

+0

В таком случае: скажите привет вашей девушке от меня, я хочу здесь еще много дней без разочарования:] – stijn