<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://www.atalasoft.com/cs/utility/FeedStylesheets/atom.xsl" media="screen"?><feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en"><title type="html">If you build it, They will come</title><subtitle type="html">Thoughts, props and rants in the world of Build Czar at Atalasoft</subtitle><id>http://www.atalasoft.com/cs/blogs/dterrell/atom.aspx</id><link rel="alternate" type="text/html" href="http://www.atalasoft.com/cs/blogs/dterrell/default.aspx" /><link rel="self" type="application/atom+xml" href="http://www.atalasoft.com/cs/blogs/dterrell/atom.aspx" /><generator uri="http://communityserver.org" version="2.1.61025.2">Community Server</generator><updated>2008-04-03T14:19:00Z</updated><entry><title>A Visual Studio command prompt environment in NAnt</title><link rel="alternate" type="text/html" href="http://www.atalasoft.com/cs/blogs/dterrell/archive/2008/05/14/a-visual-studio-command-prompt-environment-in-nant.aspx" /><id>http://www.atalasoft.com/cs/blogs/dterrell/archive/2008/05/14/a-visual-studio-command-prompt-environment-in-nant.aspx</id><published>2008-05-14T13:46:00Z</published><updated>2008-05-14T13:46:00Z</updated><content type="html">



&lt;div class="Section1"&gt;

&lt;p&gt;Released in March, Atalasoft's toolkit v6.0 had a bug release v6.0a and
we've branched to begin building new functionality for our new release while
being able to maintain/bugfix v6.0.&amp;nbsp; In addition, we're internally
branched to have one codebase as a sandbox, of sorts. &amp;nbsp; To a build
engineer, this may mean lots of work!&amp;nbsp; First, you have to branch (which on
our codebase takes a long time in itself) not once, but twice.&amp;nbsp; Each time
you branch, the engineers need to be able to build, which means all those pesky
files with version numbers need updating (check out the &lt;a href="http://www.atalasoft.com/cs/blogs/dterrell/archive/2008/05/09/atalafileregex-putting-it-together.aspx" target="_blank" title="AtalaFileRegex: Putting it together"&gt;AtalaFileRegex&lt;/a&gt;
posts).&amp;nbsp; But mostly, it means new integration targets and projects!&amp;nbsp;
Seeing this coming, I wanted to breakout redundancy and use build files like
objects, and build targets like object methods.&lt;/p&gt;

&lt;p&gt;The first step to this is making the environment work like it does if you
open the Visual Studio command prompt.&amp;nbsp; This command prompt is really just
a regular console with one of a handful of batch files called
automatically.&amp;nbsp; Depending on the hardware and version of VS, mostly its
responsibility is setting the PATH, LIBPATH and framework environment
variables.&amp;nbsp; Once this is set, you can call all the VS tools without
thought.&amp;nbsp; It'd be nice to have that setup before any NAnt script is called
so that any engineer can write a build task knowing they'll get the right
environment for the job.&amp;nbsp; Let's have a look at how this is done.&lt;/p&gt;

&lt;p&gt;Realizing that one would want to include this in all NAnt projects that
require a good environment setup, we'll call this file environment.include instead
of environment.build since it doesn't really build anything, anyway.&lt;/p&gt;

&lt;p&gt;Next, a nifty trick most probably know about, but it's worth
mentioning.&amp;nbsp; NAnt has built-in properties that you can edit, like the
nant.onsuccess and nant.onfailure properties, which take as a value the name of
a target to run in the appropriate case.&amp;nbsp; They're kind of like destructors
in that they'll be called before leaving your script no matter what.&amp;nbsp;&lt;/p&gt;

&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:blue;"&gt;  &amp;lt;!--&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:green;"&gt; Redirect our nant events &lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:blue;"&gt;--&amp;gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:blue;"&gt;  &amp;lt;&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;property&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:blue;"&gt; &lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:red;"&gt;name&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:blue;"&gt;=&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;"&lt;span style="color:blue;"&gt;nant.onsuccess&lt;/span&gt;"&lt;span style="color:blue;"&gt; &lt;/span&gt;&lt;span style="color:red;"&gt;value&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;OnSuccess&lt;/span&gt;"&lt;span style="color:blue;"&gt; /&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:blue;"&gt;  &amp;lt;&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;property&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:blue;"&gt; &lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:red;"&gt;name&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:blue;"&gt;=&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;"&lt;span style="color:blue;"&gt;nant.onfailure&lt;/span&gt;"&lt;span style="color:blue;"&gt; &lt;/span&gt;&lt;span style="color:red;"&gt;value&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;OnFailure&lt;/span&gt;"&lt;span style="color:blue;"&gt; /&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;What you do with those 'events' is up to you.&amp;nbsp; We simple use them to
output some extra information to make logs easier to read:&lt;/p&gt;

&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:blue;"&gt;  &amp;lt;&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;target&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:blue;"&gt; &lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:red;"&gt;name&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:blue;"&gt;=&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;"&lt;span style="color:blue;"&gt;OnSuccess&lt;/span&gt;"&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:blue;"&gt;    &amp;lt;&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;echo&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:blue;"&gt; &lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:red;"&gt;message&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:blue;"&gt;=&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;"&lt;span style="color:blue;"&gt;${datetime::now()}, --- BUILD FINISHED! ---&lt;/span&gt;"&lt;span style="color:blue;"&gt; &lt;/span&gt;&lt;span style="color:red;"&gt;file&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;${Progress.Log.File}&lt;/span&gt;"&lt;span style="color:blue;"&gt; &lt;/span&gt;&lt;span style="color:red;"&gt;append&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;true&lt;/span&gt;"&lt;span style="color:blue;"&gt; &lt;/span&gt;&lt;span style="color:red;"&gt;failonerror&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;false&lt;/span&gt;"&lt;span style="color:blue;"&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:blue;"&gt;  &amp;lt;/&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;target&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:blue;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:blue;"&gt;  &amp;lt;&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;target&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:blue;"&gt; &lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:red;"&gt;name&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:blue;"&gt;=&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;"&lt;span style="color:blue;"&gt;OnFailure&lt;/span&gt;"&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:blue;"&gt;    &amp;lt;&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;echo&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:blue;"&gt; &lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:red;"&gt;message&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:blue;"&gt;=&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;"&lt;span style="color:blue;"&gt;${datetime::now()}, ****************** BUILD FAILED
********************&lt;/span&gt;"&lt;span style="color:blue;"&gt; &lt;/span&gt;&lt;span style="color:red;"&gt;file&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;${Progress.Log.File}&lt;/span&gt;"&lt;span style="color:blue;"&gt; &lt;/span&gt;&lt;span style="color:red;"&gt;append&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;true&lt;/span&gt;"&lt;span style="color:blue;"&gt; &lt;/span&gt;&lt;span style="color:red;"&gt;failonerror&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;false&lt;/span&gt;"&lt;span style="color:blue;"&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal"&gt;  &amp;lt;/&lt;span&gt;target&lt;/span&gt;&amp;gt; 
&lt;/p&gt;

&lt;p&gt;Our environment script needs a bootstrap of sorts.&amp;nbsp; The Visual Studio
command prompt is hard coded with the path to its installation directory, but I
don't want to hardcode that into the script.&amp;nbsp; Instead, we'll let the user
tell us where their VS install dir is with an environment variable and begin
following the Visual Studio batch file.&amp;nbsp; That way this script can be moved
around without editing:&lt;/p&gt;

&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:blue;"&gt;  &amp;lt;&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;fail&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:blue;"&gt; &lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:red;"&gt;message&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:blue;"&gt;=&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;"&lt;span style="color:blue;"&gt;ERROR: The environment variable 'VSINSTALLDIR' was not found. 
Please ensure Visual Studio 2008 is properly installed on the build machine.&lt;/span&gt;"&lt;span style="color:blue;"&gt; &lt;/span&gt;&lt;span style="color:red;"&gt;if&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;${not
environment::variable-exists('VSINSTALLDIR')}&lt;/span&gt;"&lt;span style="color:blue;"&gt; /&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:blue;"&gt;  &amp;lt;&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;property&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:blue;"&gt; &lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:red;"&gt;name&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:blue;"&gt;=&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;"&lt;span style="color:blue;"&gt;VSINSTALLDIR&lt;/span&gt;"&lt;span style="color:blue;"&gt; &lt;/span&gt;&lt;span style="color:red;"&gt;value&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;${environment::get-variable('VSINSTALLDIR')}&lt;/span&gt;"&lt;span style="color:blue;"&gt; /&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:blue;"&gt;  &amp;lt;&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;property&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:blue;"&gt; &lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:red;"&gt;name&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:blue;"&gt;=&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;"&lt;span style="color:blue;"&gt;VCINSTALLDIR&lt;/span&gt;"&lt;span style="color:blue;"&gt; &lt;/span&gt;&lt;span style="color:red;"&gt;value&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;${VSINSTALLDIR}\VC&lt;/span&gt;"&lt;span style="color:blue;"&gt; /&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;Here, we tell the user that they must have the VSINSTALLDIR variable
set.&amp;nbsp; Instead of using the default set VSxxCOMNTOOLS, we want to be a bit
more flexible and not hardcode a particular version, either.&lt;/p&gt;

&lt;p&gt;In Atalasoft, we build our binaries for a few different .NET
frameworks.&amp;nbsp; It's expected when the environment.include file is included
that a particular property, 'Framework.Version,' be set.&amp;nbsp; To ensure that,
we'll let the user know with a failure message:&lt;/p&gt;

&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:blue;"&gt;  &amp;lt;&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;fail&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:blue;"&gt; &lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:red;"&gt;message&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:blue;"&gt;=&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;"&lt;span style="color:blue;"&gt;ERROR: Unknown target framework, select either 2.0 or 3.5&lt;/span&gt;"&lt;span style="color:blue;"&gt; &lt;/span&gt;&lt;span style="color:red;"&gt;if&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;${((Framework.Version
!= '2.0') and (Framework.Version != '3.5'))}&lt;/span&gt;"&lt;span style="color:blue;"&gt; /&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;and ensure that the set framework is available to work with:&lt;/p&gt;

&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:blue;"&gt;  &amp;lt;&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;readregistry&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:blue;"&gt; &lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:red;"&gt;property&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:blue;"&gt;=&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;"&lt;span style="color:blue;"&gt;FrameworkDir&lt;/span&gt;"&lt;span style="color:blue;"&gt; &lt;/span&gt;&lt;span style="color:red;"&gt;key&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;SOFTWARE\Microsoft\.NETFramework\InstallRoot&lt;/span&gt;"&lt;span style="color:blue;"&gt; &lt;/span&gt;&lt;span style="color:red;"&gt;hive&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;LocalMachine&lt;/span&gt;"&lt;span style="color:blue;"&gt;  &lt;/span&gt;&lt;span style="color:red;"&gt;if&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;${Framework.Version
== '2.0'}&lt;/span&gt;"&lt;span style="color:blue;"&gt; &lt;/span&gt;&lt;span style="color:red;"&gt;failonerror&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;true&lt;/span&gt;"&lt;span style="color:blue;"&gt; /&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:blue;"&gt;  &amp;lt;&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;property&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:blue;"&gt; &lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:red;"&gt;name&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:blue;"&gt;=&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;"&lt;span style="color:blue;"&gt;FrameworkDir&lt;/span&gt;"&lt;span style="color:blue;"&gt; &lt;/span&gt;&lt;span style="color:red;"&gt;value&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;${directory::get-parent-directory(FrameworkDir)}\Framework64&lt;/span&gt;"&lt;span style="color:blue;"&gt;           &lt;/span&gt;&lt;span style="color:red;"&gt;if&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;${Atala64Bit}&lt;/span&gt;"&lt;span style="color:blue;"&gt; /&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:blue;"&gt;  &amp;lt;&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;property&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:blue;"&gt; &lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:red;"&gt;name&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:blue;"&gt;=&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;"&lt;span style="color:blue;"&gt;FrameworkDir&lt;/span&gt;"&lt;span style="color:blue;"&gt; &lt;/span&gt;&lt;span style="color:red;"&gt;value&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;${directory::get-parent-directory(FrameworkDir)}\Framework&lt;/span&gt;"&lt;span style="color:blue;"&gt;             &lt;/span&gt;&lt;span style="color:red;"&gt;if&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;${not Atala64Bit}&lt;/span&gt;"&lt;span style="color:blue;"&gt; /&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:blue;"&gt;  &amp;lt;&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;property&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:blue;"&gt; &lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:red;"&gt;name&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:blue;"&gt;=&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;"&lt;span style="color:blue;"&gt;FrameworkVersion&lt;/span&gt;"&lt;span style="color:blue;"&gt; &lt;/span&gt;&lt;span style="color:red;"&gt;value&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;v2.0.50727&lt;/span&gt;"&lt;span style="color:blue;"&gt;  &lt;/span&gt;&lt;span style="color:red;"&gt;if&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;${Framework.Version
== '2.0'}&lt;/span&gt;"&lt;span style="color:blue;"&gt; /&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:blue;"&gt;  &amp;lt;&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;property&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:blue;"&gt; &lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:red;"&gt;name&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:blue;"&gt;=&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;"&lt;span style="color:blue;"&gt;FrameworkVersion&lt;/span&gt;"&lt;span style="color:blue;"&gt; &lt;/span&gt;&lt;span style="color:red;"&gt;value&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;v3.5&lt;/span&gt;"&lt;span style="color:blue;"&gt;        &lt;/span&gt;&lt;span style="color:red;"&gt;if&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;${Framework.Version
== '3.5'}&lt;/span&gt;"&lt;span style="color:blue;"&gt; /&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:blue;"&gt;  &amp;lt;&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;fail&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:blue;"&gt; &lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:red;"&gt;message&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:blue;"&gt;=&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;"&lt;span style="color:blue;"&gt;ERROR: The FrameworkDir, ${FrameworkDir}, does not exist on
this machine&lt;/span&gt;"&lt;span style="color:blue;"&gt;                      &lt;/span&gt;&lt;span style="color:red;"&gt;if&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;${not directory::exists(FrameworkDir)}&lt;/span&gt;"&lt;span style="color:blue;"&gt; /&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;Notice, we also use another property, 'Atala64Bit' which is also set by the
including script.&amp;nbsp; This flag makes building easier later on, since we use
that to trigger which build configuration we use.&lt;/p&gt;

&lt;p&gt;Finally, we get ready to set some environment variables, as they are in the
vcvars batch file:&lt;/p&gt;

&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:blue;"&gt;  &amp;lt;&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;readregistry&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:blue;"&gt; &lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:red;"&gt;property&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:blue;"&gt;=&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;"&lt;span style="color:blue;"&gt;WindowsSDKDir&lt;/span&gt;"&lt;span style="color:blue;"&gt;  &lt;/span&gt;&lt;span style="color:red;"&gt;key&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;SOFTWARE\Microsoft\Microsoft
SDKs\Windows\CurrentInstallFolder&lt;/span&gt;"&lt;span style="color:blue;"&gt; &lt;/span&gt;&lt;span style="color:red;"&gt;hive&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;LocalMachine&lt;/span&gt;"&lt;span style="color:blue;"&gt; &lt;/span&gt;&lt;span style="color:red;"&gt;failonerror&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;false&lt;/span&gt;"&lt;span style="color:blue;"&gt; /&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:blue;"&gt;  &amp;lt;&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;property&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:blue;"&gt; &lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:red;"&gt;name&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:blue;"&gt;=&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;"&lt;span style="color:blue;"&gt;DevEnv.Path&lt;/span&gt;"&lt;span style="color:blue;"&gt;      &lt;/span&gt;&lt;span style="color:red;"&gt;value&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;${environment::get-variable('VSINSTALLDIR')}&lt;/span&gt;"&lt;span style="color:blue;"&gt; &lt;/span&gt;&lt;span style="color:red;"&gt;if&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;${environment::variable-exists('VSINSTALLDIR')}&lt;/span&gt;"&lt;span style="color:blue;"&gt;  /&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:blue;"&gt;  &amp;lt;&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;property&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:blue;"&gt; &lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:red;"&gt;name&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:blue;"&gt;=&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;"&lt;span style="color:blue;"&gt;DevEnv.Path&lt;/span&gt;"&lt;span style="color:blue;"&gt;      &lt;/span&gt;&lt;span style="color:red;"&gt;value&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;${DevEnv.Path}\Common7\IDE&lt;/span&gt;"&lt;span style="color:blue;"&gt; /&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:blue;"&gt;  &lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:blue;"&gt;  &amp;lt;&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;setenv&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:blue;"&gt; &lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:red;"&gt;verbose&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:blue;"&gt;=&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;"&lt;span style="color:blue;"&gt;true&lt;/span&gt;"&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:blue;"&gt;    &amp;lt;&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;variable&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:blue;"&gt; &lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:red;"&gt;name&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:blue;"&gt;=&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;"&lt;span style="color:blue;"&gt;FrameworkDir&lt;/span&gt;"&lt;span style="color:blue;"&gt;       &lt;/span&gt;&lt;span style="color:red;"&gt;value&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;${FrameworkDir}&lt;/span&gt;"&lt;span style="color:blue;"&gt; /&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:blue;"&gt;    &amp;lt;&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;variable&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:blue;"&gt; &lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:red;"&gt;name&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:blue;"&gt;=&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;"&lt;span style="color:blue;"&gt;FrameworkVersion&lt;/span&gt;"&lt;span style="color:blue;"&gt;   &lt;/span&gt;&lt;span style="color:red;"&gt;value&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;${FrameworkVersion}&lt;/span&gt;"&lt;span style="color:blue;"&gt;
/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:blue;"&gt;    &amp;lt;&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;variable&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:blue;"&gt; &lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:red;"&gt;name&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:blue;"&gt;=&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;"&lt;span style="color:blue;"&gt;Framework35Version&lt;/span&gt;"&lt;span style="color:blue;"&gt; &lt;/span&gt;&lt;span style="color:red;"&gt;value&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;v3.5&lt;/span&gt;"&lt;span style="color:blue;"&gt; /&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:blue;"&gt;    &amp;lt;&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;variable&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:blue;"&gt; &lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:red;"&gt;name&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:blue;"&gt;=&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;"&lt;span style="color:blue;"&gt;VCINSTALLDIR&lt;/span&gt;"&lt;span style="color:blue;"&gt;       &lt;/span&gt;&lt;span style="color:red;"&gt;value&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;${VCINSTALLDIR}&lt;/span&gt;"&lt;span style="color:blue;"&gt; /&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:blue;"&gt;    &amp;lt;&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;variable&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:blue;"&gt; &lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:red;"&gt;name&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:blue;"&gt;=&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;"&lt;span style="color:blue;"&gt;WindowsSdkDir&lt;/span&gt;"&lt;span style="color:blue;"&gt;  &lt;/span&gt;&lt;span style="color:red;"&gt;value&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;${WindowsSDKDir}&lt;/span&gt;"&lt;span style="color:blue;"&gt; &lt;/span&gt;&lt;span style="color:red;"&gt;if&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;${property::exists('WindowsSDKDir')}&lt;/span&gt;"&lt;span style="color:blue;"&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:blue;"&gt;    &amp;lt;&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;variable&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:blue;"&gt; &lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:red;"&gt;name&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:blue;"&gt;=&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;"&lt;span style="color:blue;"&gt;PATH&lt;/span&gt;"&lt;span style="color:blue;"&gt;           &lt;/span&gt;&lt;span style="color:red;"&gt;value&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;${WindowsSDKDir}bin;${environment::get-variable('PATH')}&lt;/span&gt;"&lt;span style="color:blue;"&gt; /&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:blue;"&gt;    &amp;lt;&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;variable&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:blue;"&gt; &lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:red;"&gt;name&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:blue;"&gt;=&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;"&lt;span style="color:blue;"&gt;INCLUDE&lt;/span&gt;"&lt;span style="color:blue;"&gt;        &lt;/span&gt;&lt;span style="color:red;"&gt;value&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;${WindowsSDKDir}include;${environment::get-variable('INCLUDE')}&lt;/span&gt;"&lt;span style="color:blue;"&gt; /&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:blue;"&gt;    &amp;lt;&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;variable&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:blue;"&gt; &lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:red;"&gt;name&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:blue;"&gt;=&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;"&lt;span style="color:blue;"&gt;LIB&lt;/span&gt;"&lt;span style="color:blue;"&gt;            &lt;/span&gt;&lt;span style="color:red;"&gt;value&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;${WindowsSDKDir}lib;${environment::get-variable('LIB')}&lt;/span&gt;"&lt;span style="color:blue;"&gt; /&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:blue;"&gt;    &amp;lt;&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;variable&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:blue;"&gt; &lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:red;"&gt;name&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:blue;"&gt;=&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;"&lt;span style="color:blue;"&gt;DevEnvDir&lt;/span&gt;"&lt;span style="color:blue;"&gt;      &lt;/span&gt;&lt;span style="color:red;"&gt;value&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;${DevEnv.Path}&lt;/span&gt;"&lt;span style="color:blue;"&gt; /&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:blue;"&gt;  &amp;lt;/&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;setenv&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:blue;"&gt;&amp;gt;  &lt;/span&gt;&lt;/p&gt;

&lt;p&gt;I ran into a problem with %LIBPATH%, and found a way around the environment
script from halting when this fails.&amp;nbsp; Perhaps there's a better way of
doing this, but this is good enough for now.&amp;nbsp; We start by getting the
current settings from the environment, and saving them into properties:&lt;/p&gt;

&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:blue;"&gt;   &amp;lt;!--&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:green;"&gt; This is where the environment
splits between 32/64-bit machines&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:blue;"&gt;--&amp;gt; &lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:blue;"&gt;  &amp;lt;&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;property&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:blue;"&gt; &lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:red;"&gt;name&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:blue;"&gt;=&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;"&lt;span style="color:blue;"&gt;VS90COMNTOOLS&lt;/span&gt;"&lt;span style="color:blue;"&gt;    &lt;/span&gt;&lt;span style="color:red;"&gt;value&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;${environment::get-variable('VS90COMNTOOLS')}&lt;/span&gt;"&lt;span style="color:blue;"&gt; /&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:blue;"&gt;  &amp;lt;&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;property&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:blue;"&gt; &lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:red;"&gt;name&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:blue;"&gt;=&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;"&lt;span style="color:blue;"&gt;INCLUDE&lt;/span&gt;"&lt;span style="color:blue;"&gt;          &lt;/span&gt;&lt;span style="color:red;"&gt;value&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;${environment::get-variable('INCLUDE')}&lt;/span&gt;"&lt;span style="color:blue;"&gt; /&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:blue;"&gt;  &amp;lt;&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;property&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:blue;"&gt; &lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:red;"&gt;name&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:blue;"&gt;=&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;"&lt;span style="color:blue;"&gt;PATH&lt;/span&gt;"&lt;span style="color:blue;"&gt;             &lt;/span&gt;&lt;span style="color:red;"&gt;value&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;${environment::get-variable('PATH')}&lt;/span&gt;"&lt;span style="color:blue;"&gt; /&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:blue;"&gt;  &amp;lt;&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;property&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:blue;"&gt; &lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:red;"&gt;name&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:blue;"&gt;=&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;"&lt;span style="color:blue;"&gt;LIB&lt;/span&gt;"&lt;span style="color:blue;"&gt;              &lt;/span&gt;&lt;span style="color:red;"&gt;value&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;${environment::get-variable('LIB')}&lt;/span&gt;"&lt;span style="color:blue;"&gt; /&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:blue;"&gt;   &amp;lt;!--&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:green;"&gt; We haven't set %LIBPATH% yet, so
may be empty.  This circumvents that issue&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:blue;"&gt;--&amp;gt; &lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:blue;"&gt;  &amp;lt;&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;property&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:blue;"&gt; &lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:red;"&gt;name&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:blue;"&gt;=&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;"&lt;span style="color:blue;"&gt;LIBPATH&lt;/span&gt;"&lt;span style="color:blue;"&gt;          &lt;/span&gt;&lt;span style="color:red;"&gt;value&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;${environment::get-variable('LIBPATH')}&lt;/span&gt;"&lt;span style="color:blue;"&gt; &lt;/span&gt;&lt;span style="color:red;"&gt;if&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;${environment::variable-exists('LIBPATH')}&lt;/span&gt;"&lt;span style="color:blue;"&gt; /&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:blue;"&gt;  &amp;lt;&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;property&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:blue;"&gt; &lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:red;"&gt;name&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:blue;"&gt;=&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;"&lt;span style="color:blue;"&gt;LIBPATH&lt;/span&gt;"&lt;span style="color:blue;"&gt;          &lt;/span&gt;&lt;span style="color:red;"&gt;value&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;""&lt;span style="color:blue;"&gt;                                       
&lt;/span&gt;&lt;span style="color:red;"&gt;if&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;${not property::exists('LIBPATH')}&lt;/span&gt;"&lt;span style="color:blue;"&gt; /&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;and then, as the vcvars batch file does, we tack on the settings we've discovered:&lt;/p&gt;

&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:blue;"&gt;    &amp;lt;&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;setenv&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:blue;"&gt; &lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:red;"&gt;verbose&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:blue;"&gt;=&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;"&lt;span style="color:blue;"&gt;true&lt;/span&gt;"&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:blue;"&gt;      &amp;lt;&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;variable&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:blue;"&gt; &lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:red;"&gt;name&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:blue;"&gt;=&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;"&lt;span style="color:blue;"&gt;PATH&lt;/span&gt;"&lt;span style="color:blue;"&gt;         &lt;/span&gt;&lt;span style="color:red;"&gt;value&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;${DevEnv.Path};${VCINSTALLDIR}\BIN;${VS90COMNTOOLS};${FrameworkDir}\v3.5;${FrameworkDir}\${FrameworkVersion};${VCINSTALLDIR}\VCPackages;${PATH}&lt;/span&gt;"&lt;span style="color:blue;"&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:blue;"&gt;      &amp;lt;&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;variable&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:blue;"&gt; &lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:red;"&gt;name&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:blue;"&gt;=&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;"&lt;span style="color:blue;"&gt;INCLUDE&lt;/span&gt;"&lt;span style="color:blue;"&gt;      &lt;/span&gt;&lt;span style="color:red;"&gt;value&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;${VCINSTALLDIR}\ATLMFC\INCLUDE;${VCINSTALLDIR}\INCLUDE;${INCLUDE}&lt;/span&gt;"&lt;span style="color:blue;"&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:blue;"&gt;      &amp;lt;&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;variable&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:blue;"&gt; &lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:red;"&gt;name&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:blue;"&gt;=&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;"&lt;span style="color:blue;"&gt;LIB&lt;/span&gt;"&lt;span style="color:blue;"&gt;          &lt;/span&gt;&lt;span style="color:red;"&gt;value&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;${VCINSTALLDIR}\ATLMFC\LIB;${VCINSTALLDIR}\LIB;${LIB}&lt;/span&gt;"&lt;span style="color:blue;"&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:blue;"&gt;      &amp;lt;&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;variable&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:blue;"&gt; &lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:red;"&gt;name&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:blue;"&gt;=&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;"&lt;span style="color:blue;"&gt;LIBPATH&lt;/span&gt;"&lt;span style="color:blue;"&gt;      &lt;/span&gt;&lt;span style="color:red;"&gt;value&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;${FrameworkDir}\v3.5;${FrameworkDir}\${FrameworkVersion};${VCINSTALLDIR}\ATLMFC\LIB;${VCINSTALLDIR}\LIB;${LIBPATH}&lt;/span&gt;"&lt;span style="color:blue;"&gt; /&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:blue;"&gt;    &amp;lt;/&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;setenv&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;

&lt;p&gt; (Keep in mind, these are all going to be different if you're running
64-bit; I've chosen not to paste the whole file for brevity).&lt;/p&gt;

&lt;p&gt;Finally, as an example of what we do at Atalasoft, we set the Build.Suffix
property.&amp;nbsp; This is a convenience thing I use later on in the build script,
however, it shows that we have a few different build configurations to maintain
depending on the target:&lt;/p&gt;

&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:blue;"&gt;  &amp;lt;&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;property&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:blue;"&gt; &lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:red;"&gt;name&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:blue;"&gt;=&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;"&lt;span style="color:blue;"&gt;Build.Suffix&lt;/span&gt;"&lt;span style="color:blue;"&gt;                     &lt;/span&gt;&lt;span style="color:red;"&gt;value&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;_v8&lt;/span&gt;"&lt;span style="color:blue;"&gt;   &lt;/span&gt;&lt;span style="color:red;"&gt;if&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;${not Atala64Bit}&lt;/span&gt;"&lt;span style="color:blue;"&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:blue;"&gt;  &amp;lt;&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;property&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:blue;"&gt; &lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:red;"&gt;name&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:blue;"&gt;=&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;"&lt;span style="color:blue;"&gt;Build.Suffix&lt;/span&gt;"&lt;span style="color:blue;"&gt;                     &lt;/span&gt;&lt;span style="color:red;"&gt;value&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;_x64&lt;/span&gt;"&lt;span style="color:blue;"&gt;  &lt;/span&gt;&lt;span style="color:red;"&gt;if&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;${Atala64Bit}&lt;/span&gt;"&lt;span style="color:blue;"&gt; /&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:blue;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:blue;"&gt;  &amp;lt;&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;if&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:blue;"&gt; &lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:red;"&gt;test&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:blue;"&gt;=&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;"&lt;span style="color:blue;"&gt;${Framework.Version
== '2.0'}&lt;/span&gt;"&lt;span style="color:blue;"&gt; &amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:blue;"&gt;    &amp;lt;&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;property&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:blue;"&gt; &lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:red;"&gt;name&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:blue;"&gt;=&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;"&lt;span style="color:blue;"&gt;nant.settings.currentframework&lt;/span&gt;"&lt;span style="color:blue;"&gt; &lt;/span&gt;&lt;span style="color:red;"&gt;value&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;net-2.0&lt;/span&gt;"&lt;span style="color:blue;"&gt; /&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:blue;"&gt;    &amp;lt;&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;property&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:blue;"&gt; &lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:red;"&gt;name&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:blue;"&gt;=&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;"&lt;span style="color:blue;"&gt;Build.Config&lt;/span&gt;"&lt;span style="color:blue;"&gt;                  
&lt;/span&gt;&lt;span style="color:red;"&gt;value&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;AutomatedRelease_dotnet20&lt;/span&gt;"&lt;span style="color:blue;"&gt;       &lt;/span&gt;&lt;span style="color:red;"&gt;if&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;${not Atala64Bit}&lt;/span&gt;"&lt;span style="color:blue;"&gt;  /&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:blue;"&gt;    &amp;lt;&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;property&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:blue;"&gt; &lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:red;"&gt;name&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:blue;"&gt;=&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;"&lt;span style="color:blue;"&gt;Build.Config&lt;/span&gt;"&lt;span style="color:blue;"&gt;                  
&lt;/span&gt;&lt;span style="color:red;"&gt;value&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;AutomatedRelease_dotnet20_64bit&lt;/span&gt;"&lt;span style="color:blue;"&gt; &lt;/span&gt;&lt;span style="color:red;"&gt;if&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;${Atala64Bit}&lt;/span&gt;"&lt;span style="color:blue;"&gt;      /&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:blue;"&gt;    &amp;lt;&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;property&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:blue;"&gt; &lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:red;"&gt;name&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:blue;"&gt;=&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;"&lt;span style="color:blue;"&gt;Build.Description&lt;/span&gt;"&lt;span style="color:blue;"&gt;             
&lt;/span&gt;&lt;span style="color:red;"&gt;value&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;.NET 2.0&lt;/span&gt;"&lt;span style="color:blue;"&gt;                       
&lt;/span&gt;&lt;span style="color:red;"&gt;if&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;${not Atala64Bit}&lt;/span&gt;"&lt;span style="color:blue;"&gt; 
/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:blue;"&gt;    &amp;lt;&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;property&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:blue;"&gt; &lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:red;"&gt;name&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:blue;"&gt;=&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;"&lt;span style="color:blue;"&gt;Build.Description&lt;/span&gt;"&lt;span style="color:blue;"&gt;             
&lt;/span&gt;&lt;span style="color:red;"&gt;value&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;.NET 2.0, 64-bit&lt;/span&gt;"&lt;span style="color:blue;"&gt;               
&lt;/span&gt;&lt;span style="color:red;"&gt;if&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;${Atala64Bit}&lt;/span&gt;"&lt;span style="color:blue;"&gt;     
/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:blue;"&gt;  &amp;lt;/&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;if&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:blue;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:blue;"&gt;  &amp;lt;&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;if&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:blue;"&gt; &lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:red;"&gt;test&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:blue;"&gt;=&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;"&lt;span style="color:blue;"&gt;${Framework.Version
== '3.5'}&lt;/span&gt;"&lt;span style="color:blue;"&gt; &amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:blue;"&gt;    &amp;lt;&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;property&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:blue;"&gt; &lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:red;"&gt;name&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:blue;"&gt;=&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;"&lt;span style="color:blue;"&gt;nant.settings.currentframework&lt;/span&gt;"&lt;span style="color:blue;"&gt; &lt;/span&gt;&lt;span style="color:red;"&gt;value&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;net-3.5&lt;/span&gt;"&lt;span style="color:blue;"&gt; /&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:blue;"&gt;    &amp;lt;&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;property&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:blue;"&gt; &lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:red;"&gt;name&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:blue;"&gt;=&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;"&lt;span style="color:blue;"&gt;Build.Config&lt;/span&gt;"&lt;span style="color:blue;"&gt;                  
&lt;/span&gt;&lt;span style="color:red;"&gt;value&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;AutomatedRelease_dotnet35&lt;/span&gt;"&lt;span style="color:blue;"&gt;       &lt;/span&gt;&lt;span style="color:red;"&gt;if&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;${not Atala64Bit}&lt;/span&gt;"&lt;span style="color:blue;"&gt;  /&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:blue;"&gt;    &amp;lt;&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;property&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:blue;"&gt; &lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:red;"&gt;name&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:blue;"&gt;=&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;"&lt;span style="color:blue;"&gt;Build.Config&lt;/span&gt;"&lt;span style="color:blue;"&gt;                  
&lt;/span&gt;&lt;span style="color:red;"&gt;value&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;AutomatedRelease_dotnet35_64bit&lt;/span&gt;"&lt;span style="color:blue;"&gt; &lt;/span&gt;&lt;span style="color:red;"&gt;if&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;${Atala64Bit}&lt;/span&gt;"&lt;span style="color:blue;"&gt;      /&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:blue;"&gt;    &amp;lt;&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;property&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:blue;"&gt; &lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:red;"&gt;name&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:blue;"&gt;=&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;"&lt;span style="color:blue;"&gt;Build.Description&lt;/span&gt;"&lt;span style="color:blue;"&gt;             
&lt;/span&gt;&lt;span style="color:red;"&gt;value&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;.NET 3.5&lt;/span&gt;"&lt;span style="color:blue;"&gt;                       
&lt;/span&gt;&lt;span style="color:red;"&gt;if&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;${not Atala64Bit}&lt;/span&gt;"&lt;span style="color:blue;"&gt; 
/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:blue;"&gt;    &amp;lt;&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;property&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:blue;"&gt; &lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:red;"&gt;name&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:blue;"&gt;=&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;"&lt;span style="color:blue;"&gt;Build.Description&lt;/span&gt;"&lt;span style="color:blue;"&gt;             
&lt;/span&gt;&lt;span style="color:red;"&gt;value&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;.NET 3.5, 64-bit&lt;/span&gt;"&lt;span style="color:blue;"&gt;               
&lt;/span&gt;&lt;span style="color:red;"&gt;if&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;${Atala64Bit}&lt;/span&gt;"&lt;span style="color:blue;"&gt;     
/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:blue;"&gt;  &amp;lt;/&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;if&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;That's pretty much it!&amp;nbsp; A vcvarsall.bat file in NAnt language.&amp;nbsp;
From here you can imagine a nice clean call to devenv.exe, without the need for
discovering the path.&amp;nbsp; Best of all, put this in a central location on your
build server, and include it in all your build scripts like this:&lt;/p&gt;

&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:blue;"&gt;  &amp;lt;&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;property&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:blue;"&gt; &lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:red;"&gt;name&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:blue;"&gt;=&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;"&lt;span style="color:blue;"&gt;Framework.Version&lt;/span&gt;"&lt;span style="color:blue;"&gt;  &lt;/span&gt;&lt;span style="color:red;"&gt;value&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;2.0&lt;/span&gt;"&lt;span style="color:blue;"&gt; /&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:blue;"&gt;  &amp;lt;&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;property&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:blue;"&gt; &lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:red;"&gt;name&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:blue;"&gt;=&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;"&lt;span style="color:blue;"&gt;Atala64Bit&lt;/span&gt;"&lt;span style="color:blue;"&gt;         &lt;/span&gt;&lt;span style="color:red;"&gt;value&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;false&lt;/span&gt;"&lt;span style="color:blue;"&gt; /&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:blue;"&gt;  &amp;lt;&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;include&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:blue;"&gt; &lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:red;"&gt;buildfile&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:blue;"&gt;=&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;"&lt;span style="color:blue;"&gt;${Dir.Build}\environment.include&lt;/span&gt;"&lt;span style="color:blue;"&gt; &lt;/span&gt;&lt;span style="color:red;"&gt;failonerror&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;true&lt;/span&gt;"&lt;span style="color:blue;"&gt; /&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;and your calls to devenv are simple, like this:&lt;/p&gt;

&lt;p class="MsoNormal"&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:blue;"&gt;    &amp;lt;&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;exec&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:blue;"&gt; &lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:red;"&gt;program&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';color:blue;"&gt;=&lt;/span&gt;&lt;span style="font-size:10pt;font-family:'Courier New';"&gt;"&lt;span style="color:blue;"&gt;devenv.com&lt;/span&gt;"&lt;span style="color:blue;"&gt; &lt;/span&gt;&lt;span style="color:red;"&gt;commandline&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;/UseEnv /${Build.Type} ${Build.Config} &lt;/span&gt;&lt;span style="color:red;"&gt;&amp;amp;quot;&lt;/span&gt;&lt;span style="color:blue;"&gt;${Dir.Source}\SomeSolution.sln&lt;/span&gt;&lt;span style="color:red;"&gt;&amp;amp;quot;&lt;/span&gt;&lt;span style="color:blue;"&gt; /out ${Build.Log}&lt;/span&gt;"&lt;span style="color:blue;"&gt; &lt;/span&gt;&lt;span style="color:red;"&gt;verbose&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;true&lt;/span&gt;"&lt;span style="color:blue;"&gt; &lt;/span&gt;&lt;span style="color:red;"&gt;failonerror&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;true&lt;/span&gt;"&lt;span style="color:blue;"&gt; /&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;I hope that streamlines some build processes out there.&amp;nbsp; If anyone has
suggestions on how I can make this better, please let me know! &lt;/p&gt;

&lt;p class="MsoNormal"&gt;&amp;nbsp;&lt;/p&gt;

&lt;/div&gt;
&lt;div class = "shareblock"&gt;&lt;strong&gt;Share this post:&lt;/strong&gt; &lt;a href = "mailto:?body=Thought you might like this: http://www.atalasoft.com/cs/blogs/dterrell/archive/2008/05/14/a-visual-studio-command-prompt-environment-in-nant.aspx&amp;amp;;subject=A+Visual+Studio+command+prompt+environment+in+NAnt" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/dterrell/archive/2008/05/14/a-visual-studio-command-prompt-environment-in-nant.aspx"&gt;email it!&lt;/a&gt; |  &lt;a href = "http://del.icio.us/post?url=http://www.atalasoft.com/cs/blogs/dterrell/archive/2008/05/14/a-visual-studio-command-prompt-environment-in-nant.aspx&amp;amp;;title=A+Visual+Studio+command+prompt+environment+in+NAnt" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/dterrell/archive/2008/05/14/a-visual-studio-command-prompt-environment-in-nant.aspx"&gt;bookmark it!&lt;/a&gt; |  &lt;a href = "http://www.digg.com/submit?url=http://www.atalasoft.com/cs/blogs/dterrell/archive/2008/05/14/a-visual-studio-command-prompt-environment-in-nant.aspx&amp;amp;;phase=2" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/dterrell/archive/2008/05/14/a-visual-studio-command-prompt-environment-in-nant.aspx"&gt;digg it!&lt;/a&gt; |  &lt;a href = "http://reddit.com/submit?url=http://www.atalasoft.com/cs/blogs/dterrell/archive/2008/05/14/a-visual-studio-command-prompt-environment-in-nant.aspx&amp;amp;title=A+Visual+Studio+command+prompt+environment+in+NAnt" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/dterrell/archive/2008/05/14/a-visual-studio-command-prompt-environment-in-nant.aspx"&gt;reddit!&lt;/a&gt; |  &lt;a href = "http://www.dotnetkicks.com/submit/?url=http://www.atalasoft.com/cs/blogs/dterrell/archive/2008/05/14/a-visual-studio-command-prompt-environment-in-nant.aspx&amp;amp;;title=A+Visual+Studio+command+prompt+environment+in+NAnt" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/dterrell/archive/2008/05/14/a-visual-studio-command-prompt-environment-in-nant.aspx"&gt;kick it!&lt;/a&gt; |  &lt;a href = "https://favorites.live.com/quickadd.aspx?marklet=1&amp;amp;;mkt=en-us&amp;amp;;url=http://www.atalasoft.com/cs/blogs/dterrell/archive/2008/05/14/a-visual-studio-command-prompt-environment-in-nant.aspx&amp;amp;;title=A+Visual+Studio+command+prompt+environment+in+NAnt&amp;amp;;top=1" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/dterrell/archive/2008/05/14/a-visual-studio-command-prompt-environment-in-nant.aspx"&gt;live it!&lt;/a&gt;&lt;/div&gt;&lt;img src="http://www.atalasoft.com/cs/aggbug.aspx?PostID=14028" width="1" height="1"&gt;</content><author><name>dterrell</name><uri>http://www.atalasoft.com/cs/members/dterrell.aspx</uri></author><category term="NAnt" scheme="http://www.atalasoft.com/cs/blogs/dterrell/archive/tags/NAnt/default.aspx" /><category term="Visual Studio" scheme="http://www.atalasoft.com/cs/blogs/dterrell/archive/tags/Visual+Studio/default.aspx" /></entry><entry><title>AtalaFileRegex: Putting it together</title><link rel="alternate" type="text/html" href="http://www.atalasoft.com/cs/blogs/dterrell/archive/2008/05/09/atalafileregex-putting-it-together.aspx" /><id>http://www.atalasoft.com/cs/blogs/dterrell/archive/2008/05/09/atalafileregex-putting-it-together.aspx</id><published>2008-05-09T15:38:00Z</published><updated>2008-05-09T15:38:00Z</updated><content type="html">&lt;p&gt;In my recent blog posts &lt;a href="http://www.atalasoft.com/cs/blogs/dterrell/archive/2008/05/07/writing-nant-tasks-with-nested-types.aspx" title="Writing NAnt tasks with nested types"&gt;Writing NAnt tasks with nested types&lt;/a&gt; and &lt;a href="http://www.atalasoft.com/cs/blogs/dterrell/archive/2008/05/08/extending-nant-with-your-own-types.aspx" title="Extending NAnt with your own type"&gt;Extending NAnt with your own type&lt;/a&gt; I went through adding nested types to custom task, and also making your own nested type to show how easy it is to get NAnt to do something it doesn't do already (it does so much, new tasks are rarely needed).&amp;nbsp; In this case, I thought the generic Regex/Replace task in an entire file, or set of files would be nice.&amp;nbsp; &lt;br&gt;&lt;/p&gt;

&lt;p&gt;I explained before that I wanted to make our builds parallel while maintaining their consistent version numbers.&amp;nbsp; To do this, I needed to be able to hand out version numbers from CC.NET to my NAnt scripts.&amp;nbsp; In an out-of-order fashion, I showed you the carriage but not the horse, but the point is the same.&amp;nbsp; We'll assume NAnt has a build number coming in, somehow, so here I'll show you how I applied this to our build process.&lt;/p&gt;

&lt;p&gt;Before I begin, I want to add to our task one small difference from the code I showed (but it's included in the posted source).&amp;nbsp; I make a simple assumption in our builds that read only files have been gotten from version control and never edited.&amp;nbsp; This is a safe assumption, since the source files should only be changed from the source control version by the build script.&amp;nbsp; The next time the build script runs, we don't want it touching the version number (for continuous builds) because that causes a total rebuild of the project (nightly deletes the folder and starts from scratch).&amp;nbsp; To get around this, I want the version part of the build script (using the AtalaFileRegex task) to only work on read only files (files that were freshly gotten from version control).&amp;nbsp; To accomplish that, I added another boolean attribute to the AtalaFileRegex task called "onReadOnly."&amp;nbsp; It's assumed false (that is, work on all files in the fileset).&amp;nbsp; With this attribute, using the AtalaFileRegex task to apply version information to our assemblies only happens when the file has been updated in source control, or at least once per day in the nightly build.&amp;nbsp; The result is our projects will be considered up-to-date when they should be!&lt;/p&gt;

&lt;p&gt;I'm sure everyone is familiar with the AssemblyInfo.[cs,cpp] file.&amp;nbsp; This file contains information used by the compiler to set assembly attributes, like version number, company name, trademark, etc.&amp;nbsp; As part of my job, I cleaned up all of the AssemblyInfo files and separated out the fields that would be updated by the build server.&amp;nbsp; I commented them to indicate to the editing engineers that certain fields will be edited by the build server (and that they don't have to maintain them manually).&lt;/p&gt;

&lt;p&gt;So here's my (shaved down) task: &lt;/p&gt;

&lt;p&gt;&amp;nbsp;&amp;lt;AtalaFileRegex verbose="true" onReadOnly="true"&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;regexs&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;regex value="\[assembly:\s?AssemblyVersion(Attribute)?\(.*\)\]"&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; replace="[assembly:AssemblyVersionAttribute(&amp;amp;quot;${Build.Version}&amp;amp;quot;)]" /&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/regexs&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;fileset basedir="${Dir.Source}"&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;include name="**\AssemblyInfo.cs" /&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;include name="**\AssemblyInfo.cpp" /&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/fileset&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/AtalaFileRegex&amp;gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;Everybody love regex, so I'll break it down a bit (this one's pretty easy).&amp;nbsp; The regex/replace will find any lines like:&lt;/p&gt;&lt;p&gt;[assembly: AssemblyVersion("1.23.45.67890")]&lt;/p&gt;&lt;p&gt;and replace it with a line like:&lt;/p&gt;&lt;p&gt;[assembly:AssemblyVersionAttribute("9.0.0.45000")] &lt;/p&gt;&lt;p&gt;Which will work for both the semi-colon terminated, and the non-semi-colon terminated lines (.cpp and .cs respectively).&amp;nbsp; I'm sure you could put more checking in there, like ensuring there wasn't comment-type characters preceding the text, but this is a destructive regex; if it's in comments, who cares?&amp;nbsp; It only matters on the one line where the compiler sees it.&lt;/p&gt;&lt;p&gt;Next time, I'll show you how I've used Cruise Control and Team Foundation Server to feed NAnt some interesting information.&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.atalasoft.com/cs/files/folders/14025/download.aspx" title="AtalaFileRegex" target="_blank"&gt;Get the source!&lt;/a&gt;&amp;nbsp;&lt;/p&gt;
&lt;div class = "shareblock"&gt;&lt;strong&gt;Share this post:&lt;/strong&gt; &lt;a href = "mailto:?body=Thought you might like this: http://www.atalasoft.com/cs/blogs/dterrell/archive/2008/05/09/atalafileregex-putting-it-together.aspx&amp;amp;;subject=AtalaFileRegex%3a+Putting+it+together" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/dterrell/archive/2008/05/09/atalafileregex-putting-it-together.aspx"&gt;email it!&lt;/a&gt; |  &lt;a href = "http://del.icio.us/post?url=http://www.atalasoft.com/cs/blogs/dterrell/archive/2008/05/09/atalafileregex-putting-it-together.aspx&amp;amp;;title=AtalaFileRegex%3a+Putting+it+together" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/dterrell/archive/2008/05/09/atalafileregex-putting-it-together.aspx"&gt;bookmark it!&lt;/a&gt; |  &lt;a href = "http://www.digg.com/submit?url=http://www.atalasoft.com/cs/blogs/dterrell/archive/2008/05/09/atalafileregex-putting-it-together.aspx&amp;amp;;phase=2" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/dterrell/archive/2008/05/09/atalafileregex-putting-it-together.aspx"&gt;digg it!&lt;/a&gt; |  &lt;a href = "http://reddit.com/submit?url=http://www.atalasoft.com/cs/blogs/dterrell/archive/2008/05/09/atalafileregex-putting-it-together.aspx&amp;amp;title=AtalaFileRegex%3a+Putting+it+together" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/dterrell/archive/2008/05/09/atalafileregex-putting-it-together.aspx"&gt;reddit!&lt;/a&gt; |  &lt;a href = "http://www.dotnetkicks.com/submit/?url=http://www.atalasoft.com/cs/blogs/dterrell/archive/2008/05/09/atalafileregex-putting-it-together.aspx&amp;amp;;title=AtalaFileRegex%3a+Putting+it+together" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/dterrell/archive/2008/05/09/atalafileregex-putting-it-together.aspx"&gt;kick it!&lt;/a&gt; |  &lt;a href = "https://favorites.live.com/quickadd.aspx?marklet=1&amp;amp;;mkt=en-us&amp;amp;;url=http://www.atalasoft.com/cs/blogs/dterrell/archive/2008/05/09/atalafileregex-putting-it-together.aspx&amp;amp;;title=AtalaFileRegex%3a+Putting+it+together&amp;amp;;top=1" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/dterrell/archive/2008/05/09/atalafileregex-putting-it-together.aspx"&gt;live it!&lt;/a&gt;&lt;/div&gt;&lt;img src="http://www.atalasoft.com/cs/aggbug.aspx?PostID=13963" width="1" height="1"&gt;</content><author><name>dterrell</name><uri>http://www.atalasoft.com/cs/members/dterrell.aspx</uri></author></entry><entry><title>Extending NAnt with your own types</title><link rel="alternate" type="text/html" href="http://www.atalasoft.com/cs/blogs/dterrell/archive/2008/05/08/extending-nant-with-your-own-types.aspx" /><id>http://www.atalasoft.com/cs/blogs/dterrell/archive/2008/05/08/extending-nant-with-your-own-types.aspx</id><published>2008-05-08T10:51:00Z</published><updated>2008-05-08T10:51:00Z</updated><content type="html">&lt;p&gt;&lt;a href="http://www.atalasoft.com/cs/blogs/dterrell/archive/2008/05/07/writing-nant-tasks-with-nested-types.aspx" title="Extending NAnt"&gt;Last time&lt;/a&gt; I talked about how to nest existing elements in your custom NAnt tasks.&amp;nbsp; Now that you've had a good look at that, and Jacob's custom task, there's only one other thing to cover in this subject: a new type.&amp;nbsp;&amp;nbsp;&lt;/p&gt;&lt;p&gt;Types end up looking a lot like a new task, but throwing this all together should be a lot of fun.&lt;/p&gt;&lt;p&gt;Last time, I explained how I envisioned this working; a neat little task that I would give a FileSet to, and a regular expression plus a replacement string on match.&amp;nbsp; Considering this is a build process, you're going to be manipulating a lot of files with the same regex, that we have covered.&amp;nbsp; But what if I want to apply more than one regex to each file that's processed; I'd like to pass a collection of regex elements to my AtalaFileRegex task &lt;i&gt;along with&lt;/i&gt; my FileSet.&amp;nbsp; For that you need the BuildElementCollection decorator on one of your field types, like this:&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// &amp;lt;summary&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// A collection of regex/replace pairs that will be used on the file&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// &amp;lt;/summary&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; [BuildElementCollection("regexs", "regex", Required = true)]&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; [StringValidator(AllowEmpty = false)]&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public AtalaRegexCollection Regexs&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; get { return _regexs; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;&lt;p&gt;As Jacob explained, we're requiring this field exist in our task, and that it cannot be empty.&amp;nbsp; But what about those first two arguments to BuildElementCollection?&amp;nbsp; Those define the outer element's name, and the inner elements name, respectively.&amp;nbsp; This will make your task have the following form:&lt;/p&gt;&lt;p&gt;&amp;lt;task someattribute=something someotherattribute=somethingelsle&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;lt;regexs&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;lt;regex ...&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;lt;regex ...&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;lt;/regexs&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;lt;fileset&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp; &amp;lt;include ...&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp; &amp;lt;exclude ...&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;lt;/fileset&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;lt;/task&amp;gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;Now, all we're missing is the two types we said we're going to use in the BuildElementCollection.&lt;/p&gt;&lt;p&gt;First, we need our regex type so that we can work with it in our collection.&amp;nbsp; For a type, you decorate the class itself, extend the Element type, and then decorate elements within the class as we've done before:&lt;/p&gt;&lt;p&gt;using System;&lt;br&gt;using NAnt.Core;&lt;br&gt;using NAnt.Core.Attributes;&lt;br&gt;&lt;br&gt;namespace Atalasoft.NAnt.Types&lt;br&gt;{&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// &amp;lt;summary&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// Represents an regex pattern&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// &amp;lt;/summary&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; [ElementName("regex")]&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; [Serializable()]&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public class AtalaRegex : Element&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; #region Public Instance Constructors&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// &amp;lt;summary&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// Initializes a new instance of the &amp;lt;see cref="AtalaRegex" /&amp;gt; &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// class.&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// &amp;lt;/summary&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public AtalaRegex()&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; #endregion Public Instance Constructors&lt;/p&gt;&lt;p&gt;I threw in the empty constructor since it's uninteresting.&lt;br&gt;&lt;/p&gt;&lt;p&gt;Cool, now, we said we want the regex type to accept both a matching pattern and a replacement string, so let's get a couple of instance fields going on to hold those:&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; #region Private Instance Fields&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; private string _value;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; private string _replace;&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; #endregion Private Instance Fields &lt;/p&gt;&lt;p&gt;&amp;nbsp;And finally, our getters and setters, properly decorated:&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; #region Public Instance Properties&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// &amp;lt;summary&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// The actual regex string&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// &amp;lt;/summary&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; [TaskAttribute("value")]&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; [StringValidator(AllowEmpty = false)]&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public string Value&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; get { return _value; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; set { _value = value; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// &amp;lt;summary&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// The replacement string on match&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// &amp;lt;/summary&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; [TaskAttribute("replace")]&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; [StringValidator(AllowEmpty = true)]&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public string Replace&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; get { return _replace; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; set { _replace = value; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; #endregion Public Instance Properties&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;} &lt;/p&gt;&lt;p&gt;Notice on each, we've named the attribute (I called the regex string 'value' because I didn't want an element like &amp;lt;regex regex...).&amp;nbsp; Also note, the replace string can be empty. &lt;/p&gt;&lt;p&gt;That's all there is to making your own, simple type.&amp;nbsp; We'll move on to the more "complicated" part of the task at hand. &lt;br&gt;&lt;/p&gt;&lt;p&gt;Second, realize that we told NAnt it's a collection, so when we make our regexs type it's going to need to extend the CollectionBase abstract class.&amp;nbsp; You need nothing from the NAnt core.&amp;nbsp; Let's set up the class, and the default constructors:&lt;/p&gt;&lt;p&gt;using System;&lt;br&gt;using System.Collections;&lt;br&gt;&lt;br&gt;namespace Atalasoft.NAnt.Types&lt;br&gt;{&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// &amp;lt;summary&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// Contains a strongly typed collection of &amp;lt;see cref="AtalaRegex" /&amp;gt; objects.&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// &amp;lt;/summary&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; [Serializable()]&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public class AtalaRegexCollection : CollectionBase&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; #region Public Instance Constructors&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// &amp;lt;summary&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// Initializes a new instance of the &amp;lt;see cref="AtalaRegexCollection"/&amp;gt; class.&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// &amp;lt;/summary&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public AtalaRegexCollection()&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// &amp;lt;summary&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// Initializes a new instance of the &amp;lt;see cref="AtalaRegexCollection"/&amp;gt; class&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// with the specified &amp;lt;see cref="AtalaRegexCollection"/&amp;gt; instance.&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// &amp;lt;/summary&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public AtalaRegexCollection(AtalaRegexCollection value)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; AddRange(value);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// &amp;lt;summary&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// Initializes a new instance of the &amp;lt;see cref="AtalaRegexCollection"/&amp;gt; class&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// with the specified array of &amp;lt;see cref="AtalaRegex"/&amp;gt; instances.&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// &amp;lt;/summary&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public AtalaRegexCollection(AtalaRegex[] value)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; AddRange(value);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; #endregion Public Instance Constructors &lt;br&gt;&lt;/p&gt;&lt;p&gt;From here, there's a lot of things to implement from the CollectionsBase class, and an enumerator.&amp;nbsp; Suffice it to say, you're going to end up filling in a lot of stubs for insert, add, copyto, remove, etc.&amp;nbsp; There's not much to cover here, it's a stong-typed collection.&lt;/p&gt;&lt;p&gt;Next time we'll put these things to work in our task. &lt;br&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;div class = "shareblock"&gt;&lt;strong&gt;Share this post:&lt;/strong&gt; &lt;a href = "mailto:?body=Thought you might like this: http://www.atalasoft.com/cs/blogs/dterrell/archive/2008/05/08/extending-nant-with-your-own-types.aspx&amp;amp;;subject=Extending+NAnt+with+your+own+types" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/dterrell/archive/2008/05/08/extending-nant-with-your-own-types.aspx"&gt;email it!&lt;/a&gt; |  &lt;a href = "http://del.icio.us/post?url=http://www.atalasoft.com/cs/blogs/dterrell/archive/2008/05/08/extending-nant-with-your-own-types.aspx&amp;amp;;title=Extending+NAnt+with+your+own+types" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/dterrell/archive/2008/05/08/extending-nant-with-your-own-types.aspx"&gt;bookmark it!&lt;/a&gt; |  &lt;a href = "http://www.digg.com/submit?url=http://www.atalasoft.com/cs/blogs/dterrell/archive/2008/05/08/extending-nant-with-your-own-types.aspx&amp;amp;;phase=2" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/dterrell/archive/2008/05/08/extending-nant-with-your-own-types.aspx"&gt;digg it!&lt;/a&gt; |  &lt;a href = "http://reddit.com/submit?url=http://www.atalasoft.com/cs/blogs/dterrell/archive/2008/05/08/extending-nant-with-your-own-types.aspx&amp;amp;title=Extending+NAnt+with+your+own+types" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/dterrell/archive/2008/05/08/extending-nant-with-your-own-types.aspx"&gt;reddit!&lt;/a&gt; |  &lt;a href = "http://www.dotnetkicks.com/submit/?url=http://www.atalasoft.com/cs/blogs/dterrell/archive/2008/05/08/extending-nant-with-your-own-types.aspx&amp;amp;;title=Extending+NAnt+with+your+own+types" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/dterrell/archive/2008/05/08/extending-nant-with-your-own-types.aspx"&gt;kick it!&lt;/a&gt; |  &lt;a href = "https://favorites.live.com/quickadd.aspx?marklet=1&amp;amp;;mkt=en-us&amp;amp;;url=http://www.atalasoft.com/cs/blogs/dterrell/archive/2008/05/08/extending-nant-with-your-own-types.aspx&amp;amp;;title=Extending+NAnt+with+your+own+types&amp;amp;;top=1" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/dterrell/archive/2008/05/08/extending-nant-with-your-own-types.aspx"&gt;live it!&lt;/a&gt;&lt;/div&gt;&lt;img src="http://www.atalasoft.com/cs/aggbug.aspx?PostID=13937" width="1" height="1"&gt;</content><author><name>dterrell</name><uri>http://www.atalasoft.com/cs/members/dterrell.aspx</uri></author><category term="NAnt" scheme="http://www.atalasoft.com/cs/blogs/dterrell/archive/tags/NAnt/default.aspx" /><category term="C#" scheme="http://www.atalasoft.com/cs/blogs/dterrell/archive/tags/C_2300_/default.aspx" /><category term="Visual Studio" scheme="http://www.atalasoft.com/cs/blogs/dterrell/archive/tags/Visual+Studio/default.aspx" /></entry><entry><title>Writing NAnt tasks with nested types</title><link rel="alternate" type="text/html" href="http://www.atalasoft.com/cs/blogs/dterrell/archive/2008/05/07/writing-nant-tasks-with-nested-types.aspx" /><id>http://www.atalasoft.com/cs/blogs/dterrell/archive/2008/05/07/writing-nant-tasks-with-nested-types.aspx</id><published>2008-05-07T20:04:00Z</published><updated>2008-05-07T20:04:00Z</updated><content type="html">&lt;br&gt;
&lt;p&gt;If you follow the &lt;a href="http://www.atalasoft.com/cs/ControlPanel/Blogs/www.atalasoft.com/blogs" title="Atalasoft Blogs"&gt;Atalasoft Blogs&lt;/a&gt; by whatever means, and you're reading this, it's quite possible you've also read &lt;a href="http://www.atalasoft.com/cs/blogs/jake/archive/2008/05/07/writing-custom-nant-tasks.aspx" title="Writing Custom NAnt Tasks"&gt;Jacob's blog post about extending NAnt&lt;/a&gt;.&amp;nbsp; If you haven't already, go check it out since he's covered a huge amount of ground related to what I'm going to show in this and subsequent posts.&amp;nbsp; In fact, I'll assume you've either read his post, or have some general idea about extending NAnt.&lt;/p&gt;
&lt;p&gt;First, let me give some background on why I did this task.&lt;/p&gt;
&lt;p&gt;At Atalasoft, our builds (built by Jacob) can run in parallel, but our .NET 2.0 and 64-bit builds cannot.&amp;nbsp; Before our installer is created we want the .NET 2.0 and 64-bit assemblies to have the same version numbers.&amp;nbsp; In order for that to happen, we introduced a dependency on the .NET 2.0 build by the 64-bit build (the version number is a guaranteed increasing, randomly generated number that, in the case of the 64-bit build, is obtained from the built .NET 2.0 assemblies).&amp;nbsp; For continuous integration, the version numbering is internal, and not as important to our engineering department.&amp;nbsp; With that in mind, it should be easy to break the dependency just for a nightly build, but how?&amp;nbsp; Enter ChangeSetId, LastChangeLabeller, and a special Atalasoft NAnt task called AtalaFileRegex (the "Atala" prefix is somewhat of a running joke internally, but helps future build engineers realize it's not a built-in task for NAnt, yet).&amp;nbsp; The ChangeSetId and LastChangeLabeller topics will be covered in another, upcoming post.&lt;/p&gt;
&lt;p&gt;Now, you ask, why the FileRegex task when we're dealing with version numbers?&amp;nbsp; Ah, well, assembly version numbers are gotten a few different ways, and I wanted to alleviate a pain in our current build setup (preceding Jacob) where we use no less than 3 different approaches for updating version numbers for 3 different file types (AssemblyInfo.cs/.cpp, and any .rc files).&amp;nbsp; Enter AtalaFileRegex!&lt;/p&gt;
&lt;p&gt;I imagined a task that I could give a &lt;a href="http://nant.sourceforge.net/release/latest/help/types/fileset.html" title="NAnt FileSet"&gt;FileSet&lt;/a&gt; to, a regular expression to match, and a string to replace that match with.&amp;nbsp; It's a sharp (no pun intended) tool that you can easily break things with if you're not careful, but incredibly powerful if you are careful!&lt;/p&gt;
&lt;p&gt;So we set out to make our task (this is where you read Jacob's blog).&amp;nbsp; And in our shiny new task, we'd like to have a FileSet.&amp;nbsp; Easy, peasy!&amp;nbsp; In your public instance properties, make a field that is the NAnt.Core.Types.FileSet, and add some getter/setter code, like the following:&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// &amp;lt;summary&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// All the matching files in this set will be updated according&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// to the given regex/replace&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /// &amp;lt;/summary&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; [BuildElement("fileset")]&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; [StringValidator(AllowEmpty = false)]&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public FileSet RegexFileSet&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; get { return _fileSet; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; set { _fileSet = value; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;
&lt;p&gt;Notice I use the BuildElement() decorator here, instead of the already familiar TaskAttribute() decorator.&amp;nbsp; This means that it's a nested element.&amp;nbsp; The way you'd write your NAnt task with this is&lt;/p&gt;
&lt;p&gt;&amp;lt;taskname taskattribute=something taskattribute2=somethingelse&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;fileset basedir="${Dir.Source}"&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;include name="**\AssemblyInfo.cs" /&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;include name="**\AssemblyInfo.cpp" /&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/fileset&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;/taskname&amp;gt;&lt;/p&gt;
&lt;p&gt;Sweet!&amp;nbsp; That was easy...&lt;/p&gt;
&lt;p&gt;Next time I'll write a walk through on how to make your own type, and add that to your new task.&amp;nbsp;&lt;/p&gt;
&lt;div class = "shareblock"&gt;&lt;strong&gt;Share this post:&lt;/strong&gt; &lt;a href = "mailto:?body=Thought you might like this: http://www.atalasoft.com/cs/blogs/dterrell/archive/2008/05/07/writing-nant-tasks-with-nested-types.aspx&amp;amp;;subject=Writing+NAnt+tasks+with+nested+types" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/dterrell/archive/2008/05/07/writing-nant-tasks-with-nested-types.aspx"&gt;email it!&lt;/a&gt; |  &lt;a href = "http://del.icio.us/post?url=http://www.atalasoft.com/cs/blogs/dterrell/archive/2008/05/07/writing-nant-tasks-with-nested-types.aspx&amp;amp;;title=Writing+NAnt+tasks+with+nested+types" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/dterrell/archive/2008/05/07/writing-nant-tasks-with-nested-types.aspx"&gt;bookmark it!&lt;/a&gt; |  &lt;a href = "http://www.digg.com/submit?url=http://www.atalasoft.com/cs/blogs/dterrell/archive/2008/05/07/writing-nant-tasks-with-nested-types.aspx&amp;amp;;phase=2" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/dterrell/archive/2008/05/07/writing-nant-tasks-with-nested-types.aspx"&gt;digg it!&lt;/a&gt; |  &lt;a href = "http://reddit.com/submit?url=http://www.atalasoft.com/cs/blogs/dterrell/archive/2008/05/07/writing-nant-tasks-with-nested-types.aspx&amp;amp;title=Writing+NAnt+tasks+with+nested+types" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/dterrell/archive/2008/05/07/writing-nant-tasks-with-nested-types.aspx"&gt;reddit!&lt;/a&gt; |  &lt;a href = "http://www.dotnetkicks.com/submit/?url=http://www.atalasoft.com/cs/blogs/dterrell/archive/2008/05/07/writing-nant-tasks-with-nested-types.aspx&amp;amp;;title=Writing+NAnt+tasks+with+nested+types" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/dterrell/archive/2008/05/07/writing-nant-tasks-with-nested-types.aspx"&gt;kick it!&lt;/a&gt; |  &lt;a href = "https://favorites.live.com/quickadd.aspx?marklet=1&amp;amp;;mkt=en-us&amp;amp;;url=http://www.atalasoft.com/cs/blogs/dterrell/archive/2008/05/07/writing-nant-tasks-with-nested-types.aspx&amp;amp;;title=Writing+NAnt+tasks+with+nested+types&amp;amp;;top=1" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/dterrell/archive/2008/05/07/writing-nant-tasks-with-nested-types.aspx"&gt;live it!&lt;/a&gt;&lt;/div&gt;&lt;img src="http://www.atalasoft.com/cs/aggbug.aspx?PostID=13933" width="1" height="1"&gt;</content><author><name>dterrell</name><uri>http://www.atalasoft.com/cs/members/dterrell.aspx</uri></author><category term="NAnt" scheme="http://www.atalasoft.com/cs/blogs/dterrell/archive/tags/NAnt/default.aspx" /><category term="C#" scheme="http://www.atalasoft.com/cs/blogs/dterrell/archive/tags/C_2300_/default.aspx" /><category term="Visual Studio" scheme="http://www.atalasoft.com/cs/blogs/dterrell/archive/tags/Visual+Studio/default.aspx" /></entry><entry><title>Update on another post</title><link rel="alternate" type="text/html" href="http://www.atalasoft.com/cs/blogs/dterrell/archive/2008/05/07/update-on-another-post.aspx" /><id>http://www.atalasoft.com/cs/blogs/dterrell/archive/2008/05/07/update-on-another-post.aspx</id><published>2008-05-07T11:43:00Z</published><updated>2008-05-07T11:43:00Z</updated><content type="html">&lt;p&gt;You may have seen &lt;a href="http://www.atalasoft.com/cs/blogs/31appsin31days/archive/2008/05/02/Atala-Auto-Rotater.aspx" title="AtalaAutoRotate"&gt;my post&lt;/a&gt; in the &lt;a href="http://www.atalasoft.com/blogs/31appsin31days" title="31 Apps in 31 Days"&gt;31 Apps in 31 Days &lt;/a&gt;blog.&amp;nbsp; If you haven't already seen the 31 Apps in 31 Days blog, definitely check it out!&amp;nbsp; There's already a week's worth of applications you can make using the Atalasoft family of tools in one way or another.&lt;/p&gt;&lt;p&gt;I got some requests to expand the functionality of my autorotater application, namely that it have some additional &lt;u&gt;rotational&lt;/u&gt; functionality.&amp;nbsp; Sometimes you'll stumble on those pictures that were taken with an orientation 90 degrees to the right or left, or even upside-down.&amp;nbsp; Some viewers will read this orientation information and rotate the picture for you while viewing, but at the same time they don't update the orientation flag of the image.&amp;nbsp; As a result the image may continue to be rotated by other viewers, or in this case, it'll be rotated by the AtalaAutoRotater.&lt;/p&gt;&lt;p&gt;&amp;nbsp;To fix this, I've added two new buttons to the autorotater.&amp;nbsp; This functionality was pretty easy to add with these few steps (technical stuff here, skip to MultiSelect if you don't like techie stuff).&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Modify the &lt;i&gt;selectedIndexChanged &lt;/i&gt;event handler to enable/disable the rotation buttons.&amp;nbsp; This is just an added visual to let users know they must select one or more images before rotating&lt;br&gt;&lt;/li&gt;&lt;li&gt;Add two buttons, and give them appropriate names &lt;i&gt;btnRotLeft &lt;/i&gt;and &lt;i&gt;btnRotRight&lt;/i&gt;.&lt;/li&gt;&lt;li&gt;Add a wrapper function&lt;i&gt; rotate_()&lt;/i&gt; that will gather a collection of thumbnails into a new&lt;i&gt; ICollection&amp;lt;Thumbnail&amp;gt;() &lt;/i&gt;before calling&lt;i&gt; rotate()&lt;br&gt;&lt;/i&gt;&lt;/li&gt;&lt;li&gt;Add a new &lt;i&gt;enum &lt;/i&gt;that contains Left, Right, All&lt;/li&gt;&lt;li&gt;Have the &lt;i&gt;btnRotLeft &lt;/i&gt;and &lt;i&gt;btnRotRight &lt;/i&gt;(modify &lt;i&gt;btnRotate) &lt;/i&gt;call the wrapper with its direction&lt;/li&gt;&lt;li&gt;Modify &lt;i&gt;rotate()&lt;/i&gt; so that it accepts an &lt;i&gt;ICollection&amp;lt;Thumbnail&amp;gt;&lt;/i&gt; and a Rotation &lt;i&gt;enum&lt;/i&gt;.&amp;nbsp; Check, before the &lt;i&gt;switch&lt;/i&gt;, whether it's rotating all images, or a selection and update the &lt;i&gt;orientation int&lt;/i&gt; if it's a selection Left/Right.&lt;/li&gt;&lt;li&gt;Let the rest of the code do the work!&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;b&gt;MultiSelect&lt;/b&gt; &lt;br&gt;&lt;/p&gt;&lt;p&gt;But wait!&amp;nbsp; You don't want your users having to select individual files and hit rotate buttons each time.&amp;nbsp; So we'll make it possible to select a whole set of images to rotate.&amp;nbsp; To select multiple images, users can either hold down the Ctrl key while selecting individual pictures, or the Shift key to select two endpoints of a range of photos.&lt;br&gt;&lt;/p&gt;&lt;p&gt;For this functionality, the &lt;i&gt;FolderThumbnailViewer &lt;/i&gt;needs to be updated as well.&amp;nbsp; This might be a bit confusing, because there are two spots where you need to change options to get multiselect working, both in the &lt;i&gt;FolderThumbnailView&lt;/i&gt; properties matrix.&amp;nbsp; First, you have to enable &lt;i&gt;MultiSelect&lt;/i&gt;, then you have the change the &lt;i&gt;SelectionMode&lt;/i&gt; to &lt;i&gt;MultiSelect&lt;/i&gt; from &lt;i&gt;Single&lt;/i&gt;.&amp;nbsp; Once that's done, the app is ready to go!&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;img src="http://www.atalasoft.com/cs/photos/dterrell/images/13917/original.aspx" title="New buttons!" alt="New buttons!" height="260" width="345"&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;To make this a bit easier, I've included the source in the installer this time so there's only one file to download.&lt;/p&gt;&lt;p&gt;Get the &lt;a href="http://www.atalasoft.com/cs/files/folders/13931/download.aspx" title="Atala rotater with more buttons!"&gt;installer&lt;/a&gt; &lt;br&gt;&lt;/p&gt;
&lt;div class = "shareblock"&gt;&lt;strong&gt;Share this post:&lt;/strong&gt; &lt;a href = "mailto:?body=Thought you might like this: http://www.atalasoft.com/cs/blogs/dterrell/archive/2008/05/07/update-on-another-post.aspx&amp;amp;;subject=Update+on+another+post" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/dterrell/archive/2008/05/07/update-on-another-post.aspx"&gt;email it!&lt;/a&gt; |  &lt;a href = "http://del.icio.us/post?url=http://www.atalasoft.com/cs/blogs/dterrell/archive/2008/05/07/update-on-another-post.aspx&amp;amp;;title=Update+on+another+post" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/dterrell/archive/2008/05/07/update-on-another-post.aspx"&gt;bookmark it!&lt;/a&gt; |  &lt;a href = "http://www.digg.com/submit?url=http://www.atalasoft.com/cs/blogs/dterrell/archive/2008/05/07/update-on-another-post.aspx&amp;amp;;phase=2" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/dterrell/archive/2008/05/07/update-on-another-post.aspx"&gt;digg it!&lt;/a&gt; |  &lt;a href = "http://reddit.com/submit?url=http://www.atalasoft.com/cs/blogs/dterrell/archive/2008/05/07/update-on-another-post.aspx&amp;amp;title=Update+on+another+post" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/dterrell/archive/2008/05/07/update-on-another-post.aspx"&gt;reddit!&lt;/a&gt; |  &lt;a href = "http://www.dotnetkicks.com/submit/?url=http://www.atalasoft.com/cs/blogs/dterrell/archive/2008/05/07/update-on-another-post.aspx&amp;amp;;title=Update+on+another+post" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/dterrell/archive/2008/05/07/update-on-another-post.aspx"&gt;kick it!&lt;/a&gt; |  &lt;a href = "https://favorites.live.com/quickadd.aspx?marklet=1&amp;amp;;mkt=en-us&amp;amp;;url=http://www.atalasoft.com/cs/blogs/dterrell/archive/2008/05/07/update-on-another-post.aspx&amp;amp;;title=Update+on+another+post&amp;amp;;top=1" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/dterrell/archive/2008/05/07/update-on-another-post.aspx"&gt;live it!&lt;/a&gt;&lt;/div&gt;&lt;img src="http://www.atalasoft.com/cs/aggbug.aspx?PostID=13914" width="1" height="1"&gt;</content><author><name>dterrell</name><uri>http://www.atalasoft.com/cs/members/dterrell.aspx</uri></author></entry><entry><title>CI Hurts!</title><link rel="alternate" type="text/html" href="http://www.atalasoft.com/cs/blogs/dterrell/archive/2008/04/03/why-the-pain.aspx" /><id>http://www.atalasoft.com/cs/blogs/dterrell/archive/2008/04/03/why-the-pain.aspx</id><published>2008-04-03T18:19:00Z</published><updated>2008-04-03T18:19:00Z</updated><content type="html">&lt;p&gt;I've only recently begun working as the &lt;a href="http://www.dre.vanderbilt.edu/%7Eschmidt/DOC_ROOT/ACE/docs/bczar/bczar.html" title="Build Czar" target="_blank"&gt;Build Czar&lt;/a&gt; here at Atalasoft, and immediately there are pains.&amp;nbsp; The builds (from what I see) are really complicated.&amp;nbsp; True: building a &lt;i&gt;very&lt;/i&gt; complicated product is going to be complicated; however, it's thought that I can work myself out of this job, making it everyone's responsibility not just one person.&amp;nbsp; How can I do this?&lt;/p&gt;&lt;p&gt;Currently, Atalasoft employs &lt;a href="http://confluence.public.thoughtworks.org/display/CCNET/Welcome+to+CruiseControl.NET" target="_blank" title="Cruise Control.net"&gt;Cruise Control.net&lt;/a&gt;, &lt;a href="http://confluence.public.thoughtworks.org/display/CCNET/CCTray" target="_blank" title="CCTray"&gt;CCTray&lt;/a&gt;, &lt;a href="http://www.nunit.org" title="NUnit" target="_blank"&gt;NUnit&lt;/a&gt; and &lt;a href="http://nant.sourceforge.net/" title="NAnt" target="_blank"&gt;NAnt&lt;/a&gt; to make our &lt;a href="http://en.wikipedia.org/wiki/Continuous_integration" title="CI" target="_blank"&gt;CI&lt;/a&gt; &lt;a href="http://www.twiztv.com/scripts/nextgeneration/season2/tng-217.txt" target="_blank" title="ship go"&gt;ship go&lt;/a&gt;.&amp;nbsp; Each piece of this puzzle is extraordinarily powerful, the problem is getting them to shine in the way they shine on their own.&amp;nbsp; If I put the pieces in the wrong places, I'm going to overextend one of these applications, and end up paying the price for sure.&lt;/p&gt;&lt;p&gt;Welcome to my blog!&amp;nbsp; For a while I'll be concentrating on overhauling an enterprise build process, the trials, tribulations, pains and glories therein.&amp;nbsp; At then end of this process I can only hope the title and content of my blog will change, as that signals one of two things: &lt;/p&gt;&lt;ol&gt;&lt;li&gt;I accomplished what I set out to do, and the builds are no longer owned by me.&amp;nbsp; My Build Czar title will be retired, and the entire engineering team will work together to ensure the CI process continues.&lt;/li&gt;&lt;li&gt;The builds break &lt;i&gt;&lt;u&gt;me&lt;/u&gt;.&lt;/i&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;Let's hope it's the former.&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;Dave Terrell&amp;nbsp;&lt;/p&gt;&lt;p&gt;Build Engineer&amp;nbsp;&lt;/p&gt;
&lt;div class = "shareblock"&gt;&lt;strong&gt;Share this post:&lt;/strong&gt; &lt;a href = "mailto:?body=Thought you might like this: http://www.atalasoft.com/cs/blogs/dterrell/archive/2008/04/03/why-the-pain.aspx&amp;amp;;subject=CI+Hurts!" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/dterrell/archive/2008/04/03/why-the-pain.aspx"&gt;email it!&lt;/a&gt; |  &lt;a href = "http://del.icio.us/post?url=http://www.atalasoft.com/cs/blogs/dterrell/archive/2008/04/03/why-the-pain.aspx&amp;amp;;title=CI+Hurts!" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/dterrell/archive/2008/04/03/why-the-pain.aspx"&gt;bookmark it!&lt;/a&gt; |  &lt;a href = "http://www.digg.com/submit?url=http://www.atalasoft.com/cs/blogs/dterrell/archive/2008/04/03/why-the-pain.aspx&amp;amp;;phase=2" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/dterrell/archive/2008/04/03/why-the-pain.aspx"&gt;digg it!&lt;/a&gt; |  &lt;a href = "http://reddit.com/submit?url=http://www.atalasoft.com/cs/blogs/dterrell/archive/2008/04/03/why-the-pain.aspx&amp;amp;title=CI+Hurts!" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/dterrell/archive/2008/04/03/why-the-pain.aspx"&gt;reddit!&lt;/a&gt; |  &lt;a href = "http://www.dotnetkicks.com/submit/?url=http://www.atalasoft.com/cs/blogs/dterrell/archive/2008/04/03/why-the-pain.aspx&amp;amp;;title=CI+Hurts!" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/dterrell/archive/2008/04/03/why-the-pain.aspx"&gt;kick it!&lt;/a&gt; |  &lt;a href = "https://favorites.live.com/quickadd.aspx?marklet=1&amp;amp;;mkt=en-us&amp;amp;;url=http://www.atalasoft.com/cs/blogs/dterrell/archive/2008/04/03/why-the-pain.aspx&amp;amp;;title=CI+Hurts!&amp;amp;;top=1" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/dterrell/archive/2008/04/03/why-the-pain.aspx"&gt;live it!&lt;/a&gt;&lt;/div&gt;&lt;img src="http://www.atalasoft.com/cs/aggbug.aspx?PostID=13600" width="1" height="1"&gt;</content><author><name>dterrell</name><uri>http://www.atalasoft.com/cs/members/dterrell.aspx</uri></author><category term="Rant" scheme="http://www.atalasoft.com/cs/blogs/dterrell/archive/tags/Rant/default.aspx" /></entry></feed>