Making the TemplateFileTask easier to use…

One of the disadvantages of the TemplateFile task (msbuildtasks) is the fact that it requires a lot of typing to define template values:

<ItemGroup Condition= " '$(ConfigurationEnvironment)'=='build' ">
 <Tokens Include="a">
  <ReplacementValue>localhost</ReplacementValue>
 </Tokens>
 <Tokens Include="b">
  <ReplacementValue><mynode/></ReplacementValue>
 </Tokens>
</ItemGroup>

Here is a format proposition to make this a lot more finger friendly:

<configuration>
 <variables env="build">
  <x name="a">localhost</x>
  <x name="b><mynode/></x>
 </variables>
</configuration>

Here is the msbuild script we need to achieve that:

<PropertyGroup>
 <ConfigurationFile>configuration.xml</ConfigurationFile>
 <ConfigurationEnvironment>build</ConfigurationEnvironment>
</PropertyGroup>

<!-- Retreive all template values for the specific environment -->
<XmlQuery XmlFileName="$(ConfigurationFile)" XPath = "//variables[@env='$(ConfigurationEnvironment)']/*">
 <Output TaskParameter="Values" ItemName="Values" />
</XmlQuery>

<!-- Construct @Tokens -->
<ItemGroup>
 <Tokens Include="%(Values.name)">
  <ReplacementValue>%(Values._innerxml)</ReplacementValue>
 </Tokens>
</ItemGroup>

<!-- Generate the configuration files -->
<Message Text="Available variables:" />
<Message Text="====================" />
<Message Text="%(Tokens.Identity): %(Tokens.ReplacementValue)" />

Happy coding!

Leave a Comment


NOTE - You can use these HTML tags and attributes:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>