There is a way you can do this with minimal changes to your existing sample code. You can combine metadata from ConfigFiles
items and DatabaseConfig
items into a new "combined" item and then output that "combined" item.
To combine the metadata, use target batching with the batched target running once for each DatabaseConfig
item. Then you can call another target to output the combined metadata to get the output you described. Take a look at my extension of your sample code to see how this would all be accomplished:
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="test" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<ConfigFiles Include="*.config" />
<DatabaseConfig Include="ABC">
<Database>DB1</Database>
<CsString>Database</CsString>
</DatabaseConfig>
<DatabaseConfig Include="DEF">
<Database>DB2</Database>
<CsString>Logging</CsString>
</DatabaseConfig>
</ItemGroup>
<Target Name="test" DependsOnTargets="test_setup;test_output" >
<!-- Logic here runs after targets listed in "DependsOnTargets". -->
</Target>
<!-- This will run once for each "DatabaseConfig" item. -->
<Target Name="test_setup" Outputs="%(DatabaseConfig.Identity)">
<PropertyGroup>
<!-- Specify the Database for the current DatabaseConfig item -->
<CurrentDb>%(DatabaseConfig.Database)</CurrentDb>
</PropertyGroup>
<ItemGroup>
<!-- Add a new CombinedOutput item with each run, combining metadata. -->
<CombinedOutput Include=" %(ConfigFiles.FileName)%(ConfigFiles.Extension) $(CurrentDb) " />
</ItemGroup>
</Target>
<Target Name="test_output">
<!-- Output the combined metadata from the CombinedOutput items -->
<Message Text=" %(CombinedOutput.Identity) " />
</Target>
</Project>
What's happening in the sample:
- The
test
target now just serves as a way to call two other targets to perform the work: test_setup
, and test_output
- The
test_setup
target is batched and creates the new
CombinedOutput
items.
- The
test_output
target is called after test_setup
to output the CombinedOutput
items' metadata.
Output from test_output
:
one.config DB1
two.config DB1
one.config DB2
two.config DB2