2014-10-30 1 views
0

Я пытаюсь сделать пользовательский MSBuild скрипт для построения всех решений в нашем хранилище:MSBuild RecursiveDir пуст

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 
    <PropertyGroup> 
     <SourceHome Condition=" '$(SourceHome)'=='' ">..\</SourceHome> 
     <ToolsHome Condition=" '$(ToolsHome)'=='' ">.\Tools\</ToolsHome> 
     <Configuration Condition=" '$(Configuration)'=='' ">Release</Configuration> 
     <DestFolder Condition=" '$(DestFolder)'=='' ">.\$(Configuration)\</DestFolder> 
    </PropertyGroup> 

    <ItemGroup> 
     <AllSolutions Include="$(SourceHome)**\*.sln"/> 
    </ItemGroup> 

    <Target Name="Default" DependsOnTargets="Clean;Build;Assemble"/> 

    <Target Name="Clean"> 
     <Message Text="Cleaning projects..."/> 
     <MSBuild Projects="@(AllSolutions)" 
      Targets="Clean" 
      Properties="Configuration=$(Configuration);"/> 
    </Target> 

    <Target Name="RestorePackages"> 
     <Message Text="Restoring packages..."/> 
     <Exec Command="echo y| &quot;$(ToolsHome)NuGet\NuGet.exe&quot; restore &quot;%(AllSolutions.Identity)&quot;"/> 
    </Target> 

    <Target Name="Build" DependsOnTargets="RestorePackages"> 
     <Message Text="Building projects..."/> 
     <MSBuild Projects="@(AllSolutions)" 
       ContinueOnError="true" 
       Properties="Configuration=$(Configuration)"> 
      <Output ItemName="OutputFiles" TaskParameter="TargetOutputs"/> 
     </MSBuild> 
    </Target> 

    <Target Name="Assemble"> 
     <Message Text="Assembling output..."/> 
     <RemoveDir Directories="$(DestFolder)"/> 
     <Copy SourceFiles="@(OutputFiles)" 
       DestinationFiles="@(OutputFiles->'$(DestFolder)%(RecursiveDir)%(Filename)%(Extension)')"/> 
    </Target> 
</Project> 

Скрипт работает хорошо для последней задачи копирования, где% (RecursiveDir) вычисляется в исключении пустую строку, помещая все файлы в корневую папку назначения ... Я не вижу, что я делаю неправильно здесь.

Я нашел MSBuild ITaskItem RecursiveDir metadata disappears, но это, кажется, не применяется здесь ...

Я также нашел this и this нити, но там нет двойных косых или брекетов в любых путях. Вот пример выхода во время задания копирования:

Копирование файла из . "Х: \ My \ репо \ SolutionDir \ ProjectDir \ Bin \ Release \ Example.dll" в »\ Release \ Пример. длл».

ответ

1

Даже если AllSolutions элементы имеют RecursiveDir metadata заселена из-за ** шаблона в вашем коде, MSBuild task не заселять RecursiveDir в OutputFiles элементов. TargetOutputs помещаются в единый массив с полными путями, но нет RecursiveDir метаданных.

+0

Итак, решение не использовать Output и вместо этого просто создать новую ItemGroup с файлами для копирования в задаче Assembly? – moggizx

Смежные вопросы