MSBuild Transforms
November 4, 2007
Passing a list of items to a task is pretty straightforward in MSBuild. Consider a simple itemgroup which contains a bunch of files.
<ItemGroup> <MyFiles Include="C:\Windows\Microsoft.NET\Framework\v2.0.50727\1033\*"/> </ItemGroup>
We can call a task and pass our files as a list using @(MyFiles).
<Message Text="@(MyFiles)"/>
Target Build:
C:\Windows\Microsoft.NET\Framework\v2.0.50727\1033\alinkui.dll;C:\Windows\Mi
crosoft.NET\Framework\v2.0.50727\1033\cscompui.dll;C:\Windows\Microsoft.NET\Fram
ework\v2.0.50727\1033\CvtResUI.dll;C:\Windows\Microsoft.NET\Framework\v2.0.50727
\1033\vbc7ui.dll;C:\Windows\Microsoft.NET\Framework\v2.0.50727\1033\vjscui.dll;C
:\Windows\Microsoft.NET\Framework\v2.0.50727\1033\vjslibui.dll;C:\Windows\Micros
oft.NET\Framework\v2.0.50727\1033\Vsavb7rtUI.dll
alinkui;cscompui;CvtResUI;vbc7ui;vjscui;vjslibui;Vsavb7rtUI
Build succeeded.
0 Warning(s)
0 Error(s)
We may not always want to pass in the full file name and path, what we might want to pass is item metadata. This is where MSBuild transforms come in. They let us change which pieces of information are used in the construction of the list. The syntax takes the form of @(itemgroup->’%(itemmetadata)’)
We can pass a just the file names (no extension) taken from the FileName well known item metadata.
<Message Text=“@(MyFiles->’%(FileName)’)“/>
alinkui;cscompui;CvtResUI;vbc7ui;vjscui;vjslibui;Vsavb7rtUI
or the file name and extension
<Message Text="@(MyFiles->'%(FileName)%(Extension)')"/>
alinkui.dll;cscompui.dll;CvtResUI.dll;vbc7ui.dll;vjscui.dll;vjslibui.dll;Vsavb7rtUI.dll
or we might want to pass the list of files but with a different extension.
<Message Text="@(MyFiles->'%(FileName).data')"/>alinkui.data;cscompui.data;CvtResUI.data;vbc7ui.data;vjscui.data;vjslibui.data;Vsavb7rtUI.data