MSBuild ItemGroup element issue

So you just moved from NAnt to MSBuild and put together the following MSBuild script to copy files (just like in my case)

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <PropertyGroup>
    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
    <WSPDir>.\release</WSPDir>
  </PropertyGroup>
  <ItemGroup>
    <CompiledBinaries Include=".\bin\debug\*.dll" />
    <ProjectReferences Include="$(WSPDir)\**\*.*proj"/>
  </ItemGroup>
  <Target Name="Build">
    <MSBuild Projects="@(ProjectReferences)" Targets="Build"
                     Properties="Configuration=$(Configuration)">
      <Output   TaskParameter="TargetOutputs" ItemName="AssembliesBuiltByChildProjects"/>
    </MSBuild>
  </Target>
  <Target Name="Release" DependsOnTargets="Build">
    <Copy SourceFiles="@(CompiledBinaries)"       DestinationFolder="$(WSPDir)"/>
  </Target>
</Project>

So I have an Item defined to generate a file list from the Bin\Debug folder

 <CompiledBinaries Include=".\bin\debug\*.dll" />

And then use the Copy command to copy the dlls

<Copy SourceFiles="@(CompiledBinaries)"       DestinationFolder="$(WSPDir)"/>

But you will find that no dlls were copied from the bin folder, reason being that @(CompiledBinaries) is empty. This is because the content for the CompiledBinaries item is generated before running the actual targets.

The trick is to move the item creation into a Target by using a CreateItem task. So the following will create an item on the fly when the Target is executed.

<CreateItem Include="$(WSPDir)bin\**\*.*" >
  <Output TaskParameter="Include" ItemName="CompiledBinaries"/>
</CreateItem>

So here is how the final working script will look like:


<Projectxmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    <PropertyGroup>
        <ConfigurationCondition=" '$(Configuration)' == '' ">Debug</Configuration>
        <WSPDir>.\release</WSPDir>
    </PropertyGroup>
    <ItemGroup>
        <ProjectReferences Include="$(WSPDir)\**\*.*proj"/>
    </ItemGroup>

    <Target Name="Build">
        <MSBuild Projects="@(ProjectReferences)" Targets="Build" Properties="Configuration=$(Configuration)">
            <Output    TaskParameter="TargetOutputs" ItemName="AssembliesBuiltByChildProjects"/>
        </MSBuild>
    </Target>
    <Target Name="Release" DependsOnTargets="Build">
        <CreateItem Include="$(WSPDir)bin\**\*.dll" >
            <Output TaskParameter="Include" ItemName="CompiledBinaries"/>
        </CreateItem>
        <Copy SourceFiles="@(CompiledBinaries)"
       DestinationFolder="$(WSPDir)"/>
    </Target>
</Project>

About

I love coffee!

Posted in Programming Tagged with:
0 comments