<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Never Run With Scissors &#187; development</title>
	<atom:link href="http://blog.neverrunwithscissors.com/category/development/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.neverrunwithscissors.com</link>
	<description>&#34;Inspiration?  Inspiration is the momentary cessation of stupidity&#34;</description>
	<lastBuildDate>Mon, 10 May 2010 20:17:02 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>TeamCity v5.0.1 with NUnit v2.5.3</title>
		<link>http://blog.neverrunwithscissors.com/2010/01/13/teamcity-v5-0-1-with-nunit-v2-5-3/</link>
		<comments>http://blog.neverrunwithscissors.com/2010/01/13/teamcity-v5-0-1-with-nunit-v2-5-3/#comments</comments>
		<pubDate>Wed, 13 Jan 2010 16:01:28 +0000</pubDate>
		<dc:creator>Pete</dc:creator>
				<category><![CDATA[development]]></category>
		<category><![CDATA[tools]]></category>
		<category><![CDATA[automation]]></category>
		<category><![CDATA[build]]></category>
		<category><![CDATA[continuous-integration]]></category>

		<guid isPermaLink="false">http://blog.neverrunwithscissors.com/?p=262</guid>
		<description><![CDATA[If you want to see per-test reporting during TeamCity build-running, with NUnit 2.5.3 (which isn&#8217;t mentioned as being supported in the TeamCity v2.5.3 release notes, but actually seems to be fine) executing tests via a command-line command (instead of TeamCity&#8217;s built-in NUnitLauncher), where your nunit-console.exe is stored in source-control, you need to: Jump onto an [...]]]></description>
			<content:encoded><![CDATA[<p>If you want to see per-test reporting during TeamCity build-running, with NUnit 2.5.3 (which isn&#8217;t mentioned as being supported in the TeamCity v2.5.3 release notes, but actually seems to be fine) executing tests via a command-line command (instead of TeamCity&#8217;s built-in NUnitLauncher), where your nunit-console.exe is stored in source-control, you need to:</p>
<ol>
<li>Jump onto an agent machine</li>
<li>Open up {agent-install-dir}\plugins\dotnetPlugin.zip\bin</li>
<li>Pull out JetBrains.TeamCity.NUnitAddin-NUnit-2.5.3.dll and .pdb</li>
<li>Drop those into your {nunit-in-source-control}\bin\net-2.0\addins directory in source-control</li>
<li>Commit</li>
<li>Marvel at the per-test reporting that then happens (because a build will kick off)</li>
</ol>
<p>Thanks to <a href="http://legeronline.blogspot.com/2009/05/team-city-addin-for-nunit.html">John Leger</a> for getting me most of the way there :-)</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.neverrunwithscissors.com/2010/01/13/teamcity-v5-0-1-with-nunit-v2-5-3/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Getting Fluent NHibernate and Castle NHibernateFacility to play well together</title>
		<link>http://blog.neverrunwithscissors.com/2009/12/08/getting-fluent-nhibernate-and-castle-nhibernatefacility-to-play-well-together/</link>
		<comments>http://blog.neverrunwithscissors.com/2009/12/08/getting-fluent-nhibernate-and-castle-nhibernatefacility-to-play-well-together/#comments</comments>
		<pubDate>Tue, 08 Dec 2009 00:09:58 +0000</pubDate>
		<dc:creator>Pete</dc:creator>
				<category><![CDATA[development]]></category>
		<category><![CDATA[nhibernate]]></category>

		<guid isPermaLink="false">http://blog.neverrunwithscissors.com/?p=250</guid>
		<description><![CDATA[There&#8217;s an interface, Castle.Facilities.NHibernateIntegration.IConfigurationContributor, which gives one the opportunity to hook onto the NHibernate.Cfg.Configuration that the Facility will create, and add on the FluentNH mappings that you&#8217;d like (or do anything else you might like to enrich it, actually).  You register your config contributor into your IoC container &#8211; the Facility will look for these [...]]]></description>
			<content:encoded><![CDATA[<p>There&#8217;s an interface, <code>Castle.Facilities.NHibernateIntegration.IConfigurationContributor</code>, which gives one the opportunity to hook onto the NHibernate.Cfg.Configuration that the Facility will create, and add on the FluentNH mappings that you&#8217;d like (or do anything else you might like to enrich it, actually).  You register your config contributor into your IoC container &#8211; the Facility will look for these during start-up (so, if you have more than one SessionFactory, you&#8217;ll need to filter on the ids).  This ends up looking something like:</p>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;"><span style="color: #0600FF;">public</span> <span style="color: #FF0000;">class</span> FooConfigurationContributor <span style="color: #008000;">:</span> IConfigurationContributor 
<span style="color: #000000;">&#123;</span>
	<span style="color: #0600FF;">public</span> <span style="color: #0600FF;">void</span> Process<span style="color: #000000;">&#40;</span><span style="color: #FF0000;">string</span> name, Configuration config<span style="color: #000000;">&#41;</span>
	<span style="color: #000000;">&#123;</span>
		<span style="color: #0600FF;">if</span> <span style="color: #000000;">&#40;</span>name <span style="color: #008000;">==</span> <span style="color: #666666;">&quot;foo&quot;</span><span style="color: #000000;">&#41;</span> <span style="color: #008080; font-style: italic;">// only enrich the session-factory configuration with id=&quot;foo&quot; in the facility ioc-config.</span>
		<span style="color: #000000;">&#123;</span>
			var maps <span style="color: #008000;">=</span> from t <span style="color: #0600FF;">in</span> <span style="color: #008000;">typeof</span> <span style="color: #000000;">&#40;</span>FooMap<span style="color: #000000;">&#41;</span>.<span style="color: #0000FF;">Assembly</span>.<span style="color: #0000FF;">GetTypes</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>
			                   where
			                   	t.<span style="color: #0000FF;">BaseType</span>.<span style="color: #0000FF;">Name</span>.<span style="color: #0000FF;">Contains</span><span style="color: #000000;">&#40;</span><span style="color: #008000;">typeof</span> <span style="color: #000000;">&#40;</span>ClassMap<span style="color: #008000;">&lt;&gt;</span><span style="color: #000000;">&#41;</span>.<span style="color: #0000FF;">Name</span><span style="color: #000000;">&#41;</span>
			                   select t<span style="color: #008000;">;</span>
			Fluently
				.<span style="color: #0000FF;">Configure</span><span style="color: #000000;">&#40;</span>config<span style="color: #000000;">&#41;</span>
				.<span style="color: #0000FF;">Mappings</span><span style="color: #000000;">&#40;</span>x <span style="color: #008000;">=&gt;</span>
				<span style="color: #000000;">&#123;</span>
					<span style="color: #0600FF;">foreach</span> <span style="color: #000000;">&#40;</span>var map <span style="color: #0600FF;">in</span> maps<span style="color: #000000;">&#41;</span>
					<span style="color: #000000;">&#123;</span>
						x.<span style="color: #0000FF;">FluentMappings</span>.<span style="color: #0000FF;">Add</span><span style="color: #000000;">&#40;</span>map<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
					<span style="color: #000000;">&#125;</span>
				<span style="color: #000000;">&#125;</span><span style="color: #000000;">&#41;</span>
				.<span style="color: #0000FF;">BuildConfiguration</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
		<span style="color: #000000;">&#125;</span>
	<span style="color: #000000;">&#125;</span>
<span style="color: #000000;">&#125;</span></pre></div></div>

]]></content:encoded>
			<wfw:commentRss>http://blog.neverrunwithscissors.com/2009/12/08/getting-fluent-nhibernate-and-castle-nhibernatefacility-to-play-well-together/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>IncludeCombiner merged into MvcContrib as MvcContrib.IncludeHandling</title>
		<link>http://blog.neverrunwithscissors.com/2009/09/27/includecombiner-merged-into-mvccontrib-as-mvccontrib-includehandling/</link>
		<comments>http://blog.neverrunwithscissors.com/2009/09/27/includecombiner-merged-into-mvccontrib-as-mvccontrib-includehandling/#comments</comments>
		<pubDate>Sun, 27 Sep 2009 19:26:30 +0000</pubDate>
		<dc:creator>Pete</dc:creator>
				<category><![CDATA[development]]></category>
		<category><![CDATA[aspnet-mvc]]></category>
		<category><![CDATA[include-combiner]]></category>

		<guid isPermaLink="false">http://blog.neverrunwithscissors.com/?p=247</guid>
		<description><![CDATA[Over the last few days, I&#8217;ve forked MvcContrib on github and merged in my IncludeCombiner library to it as MvcContrib.IncludeHandling.  It was accepted (thanks Jeremy!), and is now part of MvcContrib/HEAD. So, if you&#8217;re running off HEAD, you&#8217;ll get it in the continuous-builds&#8217; artifacts [most-recent successful build] at the codebetter.com teamcity instance.  You can also [...]]]></description>
			<content:encoded><![CDATA[<p>Over the last few days, I&#8217;ve forked <a href="http://github.com/petemounce/mvccontrib">MvcContrib on github</a> and merged in my <a href="http://blog.neverrunwithscissors.com/2009/04/18/improving-front-end-website-performance-in-aspnet-mvc/">IncludeCombiner</a> library to it as <a href="http://github.com/mvccontrib/MvcContrib/tree/master/src/MvcContrib.IncludeHandling/">MvcContrib.IncludeHandling</a>.  It was accepted (thanks <a href="http://www.jeremyskinner.co.uk/">Jeremy</a>!), and is now part of MvcContrib/HEAD.</p>
<p>So, if you&#8217;re running off HEAD, you&#8217;ll get it in the <a href="http://teamcity.codebetter.com/viewLog.html?buildTypeId=bt81&amp;buildId=lastSuccessful&amp;tab=artifacts">continuous-builds&#8217; artifacts</a> [most-recent successful build] at the <a href="http://codebetter.com">codebetter.com</a> <a href="http://teamcity.codebetter.com">teamcity instance</a>.  You can also download it from <a href="http://mvccontrib.codeplex.com/">codeplex.com</a> &#8211; I just noticed builds are published there automatically.</p>
<p>There are a few known issues / areas for improvement that I&#8217;ll push into the <a href="http://mvccontrib.codeplex.com/WorkItem/List.aspx">codeplex.com issue tracker</a> from the github.com issue tracker where I was keeping them, over the next few days.  I&#8217;ll also transfer documentation from my blog to the codeplex wiki, though there is a demo-site; see <a href="http://github.com/mvccontrib/MvcContrib/tree/master/src/Samples/MvcContrib.Samples.IncludeHandling/">MvcContrib.Samples.IncludeHandling</a>.  But, essentially, it&#8217;s there.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.neverrunwithscissors.com/2009/09/27/includecombiner-merged-into-mvccontrib-as-mvccontrib-includehandling/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>rake-dotnet 0.1.15</title>
		<link>http://blog.neverrunwithscissors.com/2009/09/23/rake-dotnet-0-1-15/</link>
		<comments>http://blog.neverrunwithscissors.com/2009/09/23/rake-dotnet-0-1-15/#comments</comments>
		<pubDate>Wed, 23 Sep 2009 21:08:27 +0000</pubDate>
		<dc:creator>Pete</dc:creator>
				<category><![CDATA[development]]></category>
		<category><![CDATA[tools]]></category>
		<category><![CDATA[build]]></category>
		<category><![CDATA[rake]]></category>
		<category><![CDATA[rake-dotnet]]></category>

		<guid isPermaLink="false">http://blog.neverrunwithscissors.com/?p=244</guid>
		<description><![CDATA[I just released rake-dotnet 0.1.15.  Here is the changelog: === 0.1.15 / 2009-09-23 CHANGE: Xunit.NET &#8211; cope with v1.5 release which packages an x86 console runner as well as x64 one, in combination with wanting to run x86 one if it exists because of WatiN seeming to not be happy running under x64. === 0.1.14 [...]]]></description>
			<content:encoded><![CDATA[<p>I just released rake-dotnet 0.1.15.  Here is the changelog:</p>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">=== 0.1.15 / 2009-09-23</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">CHANGE: Xunit.NET &#8211; cope with v1.5 release which packages an x86 console runner as well as x64 one, in combination with wanting to run x86 one if it exists because of WatiN seeming to not be happy running under x64.</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">=== 0.1.14 / 2009-09-08</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">FIX: Versioner: Replace the RDNVERSION constant with calls to Versioner.new.get</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">CHANGE: Added version task for convenience</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">=== 0.1.13 / 2009-09-01</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">FIX: Versioner: Need to make the version.txt file a file-task, so assembly_info can depend on it.</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">=== 0.1.12 / 2009-08-29</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">FIX: Versioner: Cache the version number to a file, so CI can pull/push it and maintain same version number throughout CI pipeline stages</div>
<ul>
<li>CHANGE: Xunit.NET &#8211; cope with v1.5 release which packages an x86 console runner as well as x64 one, in combination with wanting to run x86 one if it exists because of WatiN seeming to not be happy running under x64.</li>
<li>FIX: Versioner: Replace the RDNVERSION constant with calls to Versioner.new.get</li>
<li>CHANGE: Added version task for convenience</li>
<li>FIX: Versioner: Need to make the version.txt file a file-task, so assembly_info can depend on it.</li>
<li>FIX: Versioner: Cache the version number to a file, so CI can pull/push it and maintain same version number throughout CI pipeline stages</li>
</ul>
<div>Note: there is still an off-by-one error with the build-number of the Versioner feature.</div>
]]></content:encoded>
			<wfw:commentRss>http://blog.neverrunwithscissors.com/2009/09/23/rake-dotnet-0-1-15/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>rake-dotnet Skillsmatter talk &#8211; the podcast</title>
		<link>http://blog.neverrunwithscissors.com/2009/07/21/rake-dotnet-skillsmatter-talk-the-podcast/</link>
		<comments>http://blog.neverrunwithscissors.com/2009/07/21/rake-dotnet-skillsmatter-talk-the-podcast/#comments</comments>
		<pubDate>Tue, 21 Jul 2009 08:53:20 +0000</pubDate>
		<dc:creator>Pete</dc:creator>
				<category><![CDATA[development]]></category>
		<category><![CDATA[tools]]></category>
		<category><![CDATA[automation]]></category>
		<category><![CDATA[build]]></category>
		<category><![CDATA[continuous-integration]]></category>
		<category><![CDATA[rake]]></category>
		<category><![CDATA[rake-dotnet]]></category>

		<guid isPermaLink="false">http://blog.neverrunwithscissors.com/?p=240</guid>
		<description><![CDATA[I forgot to post, but the recording of my talk at Skillsmatter about rake-dotnet is available online.]]></description>
			<content:encoded><![CDATA[<p>I forgot to post, but the <a href="http://skillsmatter.com/podcast/open-source-dot-net/rakedot-net">recording of my talk at Skillsmatter about rake-dotnet</a> is available online.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.neverrunwithscissors.com/2009/07/21/rake-dotnet-skillsmatter-talk-the-podcast/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>rake-dotnet 0.1.9</title>
		<link>http://blog.neverrunwithscissors.com/2009/07/07/rake-dotnet-0-1-9/</link>
		<comments>http://blog.neverrunwithscissors.com/2009/07/07/rake-dotnet-0-1-9/#comments</comments>
		<pubDate>Tue, 07 Jul 2009 17:08:59 +0000</pubDate>
		<dc:creator>Pete</dc:creator>
				<category><![CDATA[development]]></category>
		<category><![CDATA[tools]]></category>
		<category><![CDATA[automation]]></category>
		<category><![CDATA[build]]></category>
		<category><![CDATA[continuous-integration]]></category>
		<category><![CDATA[rake]]></category>
		<category><![CDATA[rake-dotnet]]></category>

		<guid isPermaLink="false">http://blog.neverrunwithscissors.com/?p=238</guid>
		<description><![CDATA[I&#8217;ve done a bit of work on rake-dotnet since the last release I blogged about (which was 0.0.8); the latest release is v0.1.9 and includes: NEW: MsBuild: Can now take arbitrary properties list NEW: MsBuild: Default to treating warnings as errors, as stringently as possible NEW: MSBuild &#8211; support for building VB.NET and WiX projects [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve done a bit of work on rake-dotnet since the last release I blogged about (<a href="http://blog.neverrunwithscissors.com/2009/04/15/rake-dotnet-release-v007/">which was 0.0.8</a>); the latest release is v0.1.9 and includes:</p>
<ul>
<li>NEW: MsBuild: Can now take arbitrary properties list</li>
<li>NEW: MsBuild: Default to treating warnings as errors, as stringently as possible</li>
<li>NEW: MSBuild &#8211; support for building VB.NET and WiX projects</li>
<li>NEW: AssemblyInfo &#8211; support for generating AssemblyInfo.vb into {project}/My Project/ (which I hope is the by-convention place)</li>
<li>NEW: RDNPackageTask &#8211; generate a named task per package so they can be built individually</li>
<li>NEW: SevenZip &#8211; wrapper for extracting an archive</li>
<li>NEW: NCover: Generate the full-coverage report</li>
<li>NEW: Add the ability for ncover.reporting to generate more than one report at a time</li>
<li>NEW: Add FxCop -&gt; TeamCity code-inspections reporting via TeamCity&#8217;s service-messages feature</li>
<li>NEW: If VERBOSE=true is passed on the command line, command-line calls will get echoed before they&#8217;re run (otherwise, they get ellipsis&#8217;d by rake&#8217;s error tracing, which doesn&#8217;t let one see the arguments)</li>
<li>NEW: clobber_fxcop will kill off the fxcop report in isolation</li>
<li>CHANGE: SevenZip &#8211; wrapper is more useful ;-)</li>
<li>CHANGE: MsBuild; use constants rather than hard-codings for verbosity of output and source-directory</li>
<li>CHANGE: Harvesters &#8211; harvest dumps output into a config-version named directory now</li>
<li>CHANGE: NCover: Ignore ISymWrapper assembly by default; seems to be an NCover artefact</li>
<li>FIX: When TeamCity build-configs are out-of-sync, number-wise, we cannot rely on RDNVERSION to be a sensible default.</li>
<li>FIX: Initialise bin_dir to correct defaults</li>
<li>FIX: FxCop &#8211; support for running against .exe files instead of just DLLs.  Exclude *.vshost.exe by default</li>
<li>FIX: NCover: Exclude-assemblies can be an array</li>
<li>FIX: NCover: Implement working-directory on ncover so it executes from the same location as the DLLs it&#8217;s using a tool to profile</li>
<li>FIX: If BUILD_NUMBER environment variable is not a number, use 0 (since only numbers are valid to the AssemblyFileVersion and AssemblyVersion attributes)</li>
<li>FIX: Automatically create {project}/Properties directories when generating AssemblyInfo.cs files (git does not version empty directories)</li>
<li>FIX: Detect processor architecture from environment variable rather than require user to figure it out and pass it in.</li>
<li>FIX: make get_tools_dir correctly return the path instead of just think about it.</li>
</ul>
<p>There&#8217;s currently one known bug; the fact that output is put into non-friendly-to-type paths (this doesn&#8217;t interact with CI well).</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.neverrunwithscissors.com/2009/07/07/rake-dotnet-0-1-9/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Dear JetBrains &#8211; please implement a ReSharper lightbulb for &#8220;fix breaking changes between vX and vY of dependency&#8221;</title>
		<link>http://blog.neverrunwithscissors.com/2009/06/21/dear-jetbrains-please-implement-a-resharper-lightbulb-for-fix-breaking-changes-between-vx-and-vy-of-dependency/</link>
		<comments>http://blog.neverrunwithscissors.com/2009/06/21/dear-jetbrains-please-implement-a-resharper-lightbulb-for-fix-breaking-changes-between-vx-and-vy-of-dependency/#comments</comments>
		<pubDate>Sun, 21 Jun 2009 20:14:48 +0000</pubDate>
		<dc:creator>Pete</dc:creator>
				<category><![CDATA[development]]></category>
		<category><![CDATA[tools]]></category>
		<category><![CDATA[jetbrains]]></category>
		<category><![CDATA[resharper]]></category>

		<guid isPermaLink="false">http://blog.neverrunwithscissors.com/?p=221</guid>
		<description><![CDATA[Open-source libraries tend to move quicker than commercially-developed ones.  Microsoft seems to have a policy of preferring to maintain backwards compatibility where the choice is between that and breaking a consumer&#8217;s code (whether it&#8217;s good code or workaround for a problem in a library). Perhaps this is the beginnings of an answer&#8230;?  I doubt it, [...]]]></description>
			<content:encoded><![CDATA[<p>Open-source libraries tend to move quicker than commercially-developed ones.  Microsoft seems to have a policy of preferring to maintain backwards compatibility where the choice is between that and breaking a consumer&#8217;s code (whether it&#8217;s good code or workaround for a problem in a library).</p>
<p>Perhaps <a href="http://www.jetbrains.net/jira/browse/RSRP-109851">this is the beginnings of an answer</a>&#8230;?  I doubt it, but I still think it&#8217;s a cool feature-request ;-)</p>
<p>While we&#8217;re on the subject of Dear-JetBrains-Please-Fix, how about any of the following&#8230;?</p>
<ul>
<li><a href="http://www.jetbrains.net/jira/browse/RSRP-88220">Formatting fluent-interface &amp; lambda C#</a></li>
<li><a href="http://www.jetbrains.net/jira/browse/RSRP-46598">Don&#8217;t overwrite user-settings when more than one Visual Studio is opened then closed</a></li>
<li><a href="http://www.jetbrains.net/jira/browse/RSRP-108110">Naming conventions different for tests</a></li>
<li><a href="http://www.jetbrains.net/jira/browse/RSRP-40844">Make camel-humps work in dialog windows</a></li>
<li><a href="http://www.jetbrains.net/jira/browse/RSRP-38269">Don&#8217;t allow fonts/colors settings to change and the color-classes disappear</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://blog.neverrunwithscissors.com/2009/06/21/dear-jetbrains-please-implement-a-resharper-lightbulb-for-fix-breaking-changes-between-vx-and-vy-of-dependency/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Improving front-end website performance in ASP.NET MVC</title>
		<link>http://blog.neverrunwithscissors.com/2009/04/18/improving-front-end-website-performance-in-aspnet-mvc/</link>
		<comments>http://blog.neverrunwithscissors.com/2009/04/18/improving-front-end-website-performance-in-aspnet-mvc/#comments</comments>
		<pubDate>Sat, 18 Apr 2009 00:20:14 +0000</pubDate>
		<dc:creator>Pete</dc:creator>
				<category><![CDATA[development]]></category>
		<category><![CDATA[aspnet-mvc]]></category>
		<category><![CDATA[include-combiner]]></category>
		<category><![CDATA[performance]]></category>

		<guid isPermaLink="false">http://blog.neverrunwithscissors.com/?p=166</guid>
		<description><![CDATA[Load times, according to people like google, are important.  I kinda see it as basic politeness; wasting a user&#8217;s (or worse, a customer&#8217;s) time making him wait for my site to become active is a bit rude.  According to YSlow! (a Firebug plugin within Firefox), one should: Reduce the number of external requests (or; make [...]]]></description>
			<content:encoded><![CDATA[<p>Load times, according to <a href="http://ajaxian.com/archives/ajax-experience-videos-performance-and-security">people</a> like <a href="http://www.die.net/musings/page_load_time/">google</a>, are important.  I kinda see it as basic politeness; wasting a user&#8217;s (or worse, a customer&#8217;s) time making him wait for my site to become active is a bit rude.  According to <a href="http://developer.yahoo.com/yslow/">YSlow!</a> (a <a href="http://getfirebug.com">Firebug</a> plugin within <a href="http://getfirefox.com">Firefox</a>), one should:</p>
<ul>
<li>Reduce the number of external requests (or; make one big Javascript/CSS request instead of many little ones) &#8211; browsers typically will only hold two open connections per domain, and scripts load sequentially (I gather because of the possibility of document.write calls modifying the DOM, which would be a shared resource if they were allowed to load and execute in parallel).</li>
<li>Reduce the size of external requests (less on-the-wire weight is better; remove comments and white-space).</li>
<li>Compress external requests where possible (gzip/deflate compression will trade CPU cycles per request to gain better on-the-wire weight).</li>
<li>Use a far-future cache-header for assets that won&#8217;t change often (so that clients don&#8217;t need to receive a new copy on each visit).</li>
<li>Move scripts to the end of the document so the content loads first &#8211; the user has stuff to look at while scripts arrive.</li>
</ul>
<p>Happily, all achievable with only a modicum of effort.  Yahoo has released its <a href="http://developer.yahoo.com/yui/compressor/">YUICompressor</a> component to open-source, and there&#8217;s a <a href="http://www.codeplex.com/YUICompressor">.NET version available from codeplex</a> &#8211; this takes care of minifying Javascript and CSS.  So, all we need to do is glue the files together and push that glob to the compressor.  Right?  Well, we also have to tell our component which things to work on.  This set will vary, usually, per page (ideally, we will offload <em>all</em> script/style to separately-loaded assets, since we can cache those and slim down our actual document at the same time by doing so).  It&#8217;s more pleasant to develop within individual files; one file per class/feature/whatever; given that we&#8217;re not perfect, it would also be invaluable to be able to turn on a debug-mode so we can debug through readable code.  </p>
<p>Lastly, do this stuff at run-time, because maintaining config or build-automation to do it would save some CPU cycles at the expense of developer time (can you spot someone that&#8217;s been burned by that kind of thing&#8230;? :-P ).</p>
<p>I&#8217;m going to be doing this within the context of ASP.NET MVC (and maybe fiddle with Spark&#8217;s modularity feature once it&#8217;s done).  My list of features:</p>
<ul>
<li>Register an include (from both the master-page and the views).</li>
<li>Write out the include-combination (or, in debug mode, write out each include separately, raw and untouched).</li>
<li>Combine the includes within the set that is registered (glue the files together &#8211; and, necessarily, read the files from where-ever they live!).</li>
<li>Make it possible to link to the combination (a controller with actions to respond with the combination when tickled via an appropriate GET)</li>
<li><a href="http://en.wikipedia.org/wiki/Minify">Minify</a> the combination.</li>
<li>Compress the combination (gzip/deflate &#8211; and detect which browsers we shouldn&#8217;t do this for &#8211; I&#8217;m looking at you, IE&lt;=6, you lying so-and-so&#8230;).</li>
<li>Cache the combination with a far-future expiry (and therefore also use a URL amenable to browsers caching it).</li>
<li>Generate an <a href="http://en.wikipedia.org/wiki/HTTP_ETag">ETag</a>.</li>
<li>Support a debug-mode where the includes are written out one-by-one and raw.</li>
<li>Be trivial to understand and add to your own application :-)</li>
</ul>
<p>I&#8217;ll host the source in <a href="http://github.com/petemounce/includecombiner">github</a>, and blog as I go.</p>
<p>Some more references for front-end performance:</p>
<ul>
<li>CSS @import considered harmful: <a href="http://www.stevesouders.com/blog/2009/04/09/dont-use-import/">http://www.stevesouders.com/blog/2009/04/09/dont-use-import/</a></li>
<li>Hammerhead (another Firefox extension): <a href="http://www.stevesouders.com/blog/2008/09/30/hammerhead-moving-performance-testing-upstream/">http://www.stevesouders.com/blog/2008/09/30/hammerhead-moving-performance-testing-upstream/</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://blog.neverrunwithscissors.com/2009/04/18/improving-front-end-website-performance-in-aspnet-mvc/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>rake-dotnet release v0.0.8</title>
		<link>http://blog.neverrunwithscissors.com/2009/04/15/rake-dotnet-release-v007/</link>
		<comments>http://blog.neverrunwithscissors.com/2009/04/15/rake-dotnet-release-v007/#comments</comments>
		<pubDate>Wed, 15 Apr 2009 15:18:44 +0000</pubDate>
		<dc:creator>Pete</dc:creator>
				<category><![CDATA[development]]></category>
		<category><![CDATA[tools]]></category>
		<category><![CDATA[automation]]></category>
		<category><![CDATA[build]]></category>
		<category><![CDATA[continuous-integration]]></category>
		<category><![CDATA[rake]]></category>
		<category><![CDATA[rake-dotnet]]></category>

		<guid isPermaLink="false">http://blog.neverrunwithscissors.com/?p=205</guid>
		<description><![CDATA[Just a smattering of small changes and bug-fixes; here&#8217;s the change-log: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 === 0.0.8 / 2009-? &#160; * CHANGE: Eliminate the need to pass stuff to AssemblyInfoTask when it can just use the defaults ... by default. * FIX: [...]]]></description>
			<content:encoded><![CDATA[<p>Just a smattering of small changes and bug-fixes; here&#8217;s the change-log:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
</pre></td><td class="code"><pre class="txt" style="font-family:monospace;">=== 0.0.8 / 2009-?
&nbsp;
* CHANGE: Eliminate the need to pass stuff to AssemblyInfoTask when it can just use the defaults ... by default.
* FIX: Bug with harvesting when output contains directories
* FIX: Test-runner now executes from within the same directory as the DLL(s) containing tests that it's running through.
&nbsp;
=== 0.0.7 / 2009-04-15
&nbsp;
* CHANGE: Adjust TOOLS_DIR initialisation so it looks for a shared 3rdparty folder at the same level as the product folder first, then it looks for a 3rdparty folder inside of the product folder.
* CHANGE: Adjust the Demo's Rakefile to make FxCop ignore assemblies with &quot;Tests&quot; in their filename.
&nbsp;
=== 0.0.6 / 2009-04-06
&nbsp;
* Move source control to github at http://github.com/petemounce/rake-dotnet
* Change format of readme to markdown for prettiness on the repo homepage
* FIX: YYYYMMDD is invalid for file/assembly-version attribute; use '0' instead in non-svn source-control case.
* FIX: Fix harvesting a web-application when it's not under svn source-control</pre></td></tr></table></div>

<p>What&#8217;s next?  The nice people at <a href="http://www.ncover.com">NCover</a> have granted me a free license to their code-coverage tool; I&#8217;ll be wrapping that in the next major release.  I also plan to implement tasks for <a href="http://www.nunit.org">NUnit</a> and <a href="http://www.gallio.org">Gallio</a>.  That should do for planning, for the time being&#8230;</p>
<p>Oh &#8211; it occurs to me that I&#8217;ve talked about it, but not really shown what it allows (though there is a demo inside of <a href="http://github.com/petemounce/rake-dotnet">source-control</a> -&gt; DemoRoot).  So, here&#8217;s the ~35 line Rakefile that gets you:</p>
<ul>
<li>AssemblyInfo watermarking</li>
<li>compilation</li>
<li>XUnit.NET testing/reporting</li>
<li>FxCop reporting</li>
<li>simple NCover reporting (as in, only one report choice at the moment)</li>
<li>harvesting-to-one-place for publishing to CI artifacts</li>
<li>packaging output into zip files for xcopy-deployment (even if xcopy is so &#8230; DOS&#8230; ;-) )</li>
</ul>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
</pre></td><td class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#008000; font-style:italic;"># Documentation: http://rake.rubyforge.org/ -&gt; Files/doc/rakefile.rdoc</span>
<span style="color:#CC0066; font-weight:bold;">require</span> <span style="color:#996600;">'rake'</span>
<span style="color:#CC0066; font-weight:bold;">require</span> <span style="color:#996600;">'rake/tasklib'</span>
<span style="color:#CC0066; font-weight:bold;">require</span> <span style="color:#996600;">'rake_dotnet'</span>
&nbsp;
PRODUCT_NAME = ENV<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#996600;">'PRODUCT_NAME'</span><span style="color:#006600; font-weight:bold;">&#93;</span> ? ENV<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#996600;">'PRODUCT_NAME'</span><span style="color:#006600; font-weight:bold;">&#93;</span> : <span style="color:#996600;">'IncludeCombiner'</span>
COMPANY = ENV<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#996600;">'COMPANY'</span><span style="color:#006600; font-weight:bold;">&#93;</span> ? ENV<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#996600;">'COMPANY'</span><span style="color:#006600; font-weight:bold;">&#93;</span> : <span style="color:#996600;">'NeverRunWithScissors.com'</span>
RDNVERSION = Versioner.<span style="color:#9900CC;">new</span>.<span style="color:#9900CC;">get</span>
&nbsp;
<span style="color:#6666ff; font-weight:bold;">Rake::AssemblyInfoTask</span>.<span style="color:#9900CC;">new</span>
bin_out = <span style="color:#CC00FF; font-weight:bold;">File</span>.<span style="color:#9900CC;">join</span><span style="color:#006600; font-weight:bold;">&#40;</span>OUT_DIR, <span style="color:#996600;">'bin'</span><span style="color:#006600; font-weight:bold;">&#41;</span>
<span style="color:#6666ff; font-weight:bold;">Rake::MsBuildTask</span>.<span style="color:#9900CC;">new</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006600; font-weight:bold;">&#123;</span>:verbosity<span style="color:#006600; font-weight:bold;">=&gt;</span>MSBUILD_VERBOSITY, <span style="color:#ff3333; font-weight:bold;">:deps</span><span style="color:#006600; font-weight:bold;">=&gt;</span><span style="color:#006600; font-weight:bold;">&#91;</span>bin_out, <span style="color:#ff3333; font-weight:bold;">:assembly_info</span><span style="color:#006600; font-weight:bold;">&#93;</span><span style="color:#006600; font-weight:bold;">&#125;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
&nbsp;
<span style="color:#6666ff; font-weight:bold;">Rake::HarvestOutputTask</span>.<span style="color:#9900CC;">new</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006600; font-weight:bold;">&#123;</span>:deps <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:compile</span><span style="color:#006600; font-weight:bold;">&#93;</span><span style="color:#006600; font-weight:bold;">&#125;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
&nbsp;
<span style="color:#6666ff; font-weight:bold;">Rake::XUnitTask</span>.<span style="color:#9900CC;">new</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006600; font-weight:bold;">&#123;</span>:options<span style="color:#006600; font-weight:bold;">=&gt;</span><span style="color:#006600; font-weight:bold;">&#123;</span>:html<span style="color:#006600; font-weight:bold;">=&gt;</span>true,:xml<span style="color:#006600; font-weight:bold;">=&gt;</span>true<span style="color:#006600; font-weight:bold;">&#125;</span>, <span style="color:#ff3333; font-weight:bold;">:deps</span><span style="color:#006600; font-weight:bold;">=&gt;</span><span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:compile</span>, <span style="color:#ff3333; font-weight:bold;">:harvest_output</span><span style="color:#006600; font-weight:bold;">&#93;</span><span style="color:#006600; font-weight:bold;">&#125;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
<span style="color:#6666ff; font-weight:bold;">Rake::FxCopTask</span>.<span style="color:#9900CC;">new</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006600; font-weight:bold;">&#123;</span>:deps<span style="color:#006600; font-weight:bold;">=&gt;</span><span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:compile</span>, <span style="color:#ff3333; font-weight:bold;">:harvest_output</span><span style="color:#006600; font-weight:bold;">&#93;</span><span style="color:#006600; font-weight:bold;">&#125;</span><span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>fxc<span style="color:#006600; font-weight:bold;">|</span>
	fxc.<span style="color:#9900CC;">dll_list</span>.<span style="color:#9900CC;">exclude</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">&quot;#{@suites_dir}/**/*Tests*.dll&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
<span style="color:#6666ff; font-weight:bold;">Rake::NCoverTask</span>.<span style="color:#9900CC;">new</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006600; font-weight:bold;">&#123;</span>:deps<span style="color:#006600; font-weight:bold;">=&gt;</span><span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:compile</span>, <span style="color:#ff3333; font-weight:bold;">:harvest_output</span><span style="color:#006600; font-weight:bold;">&#93;</span>, <span style="color:#ff3333; font-weight:bold;">:ncover_options</span><span style="color:#006600; font-weight:bold;">=&gt;</span><span style="color:#006600; font-weight:bold;">&#123;</span>:arch<span style="color:#006600; font-weight:bold;">=&gt;</span><span style="color:#996600;">'amd64'</span><span style="color:#006600; font-weight:bold;">&#125;</span>, <span style="color:#ff3333; font-weight:bold;">:ncover_reporting_options</span><span style="color:#006600; font-weight:bold;">=&gt;</span><span style="color:#006600; font-weight:bold;">&#123;</span>:arch<span style="color:#006600; font-weight:bold;">=&gt;</span><span style="color:#996600;">'amd64'</span><span style="color:#006600; font-weight:bold;">&#125;</span><span style="color:#006600; font-weight:bold;">&#125;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
&nbsp;
demo_site = <span style="color:#CC00FF; font-weight:bold;">File</span>.<span style="color:#9900CC;">join</span><span style="color:#006600; font-weight:bold;">&#40;</span>OUT_DIR, <span style="color:#996600;">'Demo.Site'</span><span style="color:#006600; font-weight:bold;">&#41;</span>
<span style="color:#6666ff; font-weight:bold;">Rake::HarvestWebApplicationTask</span>.<span style="color:#9900CC;">new</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006600; font-weight:bold;">&#123;</span>:deps<span style="color:#006600; font-weight:bold;">=&gt;</span><span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:compile</span><span style="color:#006600; font-weight:bold;">&#93;</span><span style="color:#006600; font-weight:bold;">&#125;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
&nbsp;
<span style="color:#6666ff; font-weight:bold;">Rake::RDNPackageTask</span>.<span style="color:#9900CC;">new</span><span style="color:#006600; font-weight:bold;">&#40;</span>name=<span style="color:#996600;">'bin'</span>, version=RDNVERSION, <span style="color:#006600; font-weight:bold;">&#123;</span>:deps<span style="color:#006600; font-weight:bold;">=&gt;</span><span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:harvest_output</span>, <span style="color:#ff3333; font-weight:bold;">:xunit</span><span style="color:#006600; font-weight:bold;">&#93;</span><span style="color:#006600; font-weight:bold;">&#125;</span><span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>p<span style="color:#006600; font-weight:bold;">|</span>
	<span style="color:#CC0066; font-weight:bold;">p</span>.<span style="color:#9900CC;">targets</span>.<span style="color:#9966CC; font-weight:bold;">include</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">&quot;#{bin_out}/*&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
<span style="color:#6666ff; font-weight:bold;">Rake::RDNPackageTask</span>.<span style="color:#9900CC;">new</span><span style="color:#006600; font-weight:bold;">&#40;</span>name=<span style="color:#996600;">'Demo.Site'</span>, version=RDNVERSION, <span style="color:#006600; font-weight:bold;">&#123;</span>:deps<span style="color:#006600; font-weight:bold;">=&gt;</span><span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:harvest_webapps</span>, <span style="color:#ff3333; font-weight:bold;">:xunit</span><span style="color:#006600; font-weight:bold;">&#93;</span><span style="color:#006600; font-weight:bold;">&#125;</span><span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>p<span style="color:#006600; font-weight:bold;">|</span>
	<span style="color:#CC0066; font-weight:bold;">p</span>.<span style="color:#9900CC;">targets</span>.<span style="color:#9966CC; font-weight:bold;">include</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">&quot;#{demo_site}/*&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
task <span style="color:#ff3333; font-weight:bold;">:default</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:compile</span>, <span style="color:#ff3333; font-weight:bold;">:harvest_output</span>, <span style="color:#ff3333; font-weight:bold;">:xunit</span>, <span style="color:#ff3333; font-weight:bold;">:package</span><span style="color:#006600; font-weight:bold;">&#93;</span></pre></td></tr></table></div>

<p>The Rakefile is from the other thing I&#8217;m working on at the moment while I&#8217;m at a loose end.  Watch this space&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.neverrunwithscissors.com/2009/04/15/rake-dotnet-release-v007/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>TeamCity 4.0.2 + rake-dotnet == parallelisation in the build cloud</title>
		<link>http://blog.neverrunwithscissors.com/2009/04/09/teamcity-402-rake-dotnet-parallelisation-in-the-build-cloud/</link>
		<comments>http://blog.neverrunwithscissors.com/2009/04/09/teamcity-402-rake-dotnet-parallelisation-in-the-build-cloud/#comments</comments>
		<pubDate>Thu, 09 Apr 2009 16:17:02 +0000</pubDate>
		<dc:creator>Pete</dc:creator>
				<category><![CDATA[development]]></category>
		<category><![CDATA[tools]]></category>
		<category><![CDATA[automation]]></category>
		<category><![CDATA[build]]></category>
		<category><![CDATA[continuous-integration]]></category>
		<category><![CDATA[rake]]></category>
		<category><![CDATA[rake-dotnet]]></category>
		<category><![CDATA[teamcity]]></category>

		<guid isPermaLink="false">http://blog.neverrunwithscissors.com/?p=187</guid>
		<description><![CDATA[I&#8217;ve said before; I&#8217;m kinda the tools-guy at work. Never get a human to do a computer&#8217;s job, you know? With that in mind, I&#8217;m working on a library of custom rake tasks for making a build automation dev&#8217;s life easier. That&#8217;s only half the story, though &#8211; the ability to make a build in [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve said before; I&#8217;m kinda the tools-guy at work.  <q>Never get a human to do a computer&#8217;s job</q>, you know?  With that in mind, I&#8217;m working on a library of custom <a href="http://rake.rubyforge.org">rake</a> tasks for <a href="http://blog.neverrunwithscissors.com/2009/04/03/raking-it-in-rake-dotnet-hello-world-release-v005/">making a build automation dev&#8217;s life easier</a>.  That&#8217;s only half the story, though &#8211; the ability to make a build in one click is useful, and all, but it&#8217;s far more useful when there&#8217;s a continuous integration process doing it for you.  Checking out the latest code, building it, running tests against it, packaging it, <a href="http://www.capify.org">deploying</a> <a href="http://rubyhitsquad.com/Vlad_the_Deployer.html">it</a> (I was particularly inspired when I read <a href="http://timothyfitz.wordpress.com/2009/02/10/continuous-deployment-at-imvu-doing-the-impossible-fifty-times-a-day/">IMVU&#8217;s doing the impossible 50 times a day</a>&#8230;!) &#8211; all of that good stuff that, without computers, would fail miserably because humans just aren&#8217;t good at doing mind-numbingly repetitive tasks from checklists consistently well.</p>
<p>So I&#8217;ll explain a few of the design decisions I made when working on rake-dotnet.</p>
<p>Firstly, hopefully the aim to keep the Rakefile as short as possible is understood and well-received.  I wanted it to be as by-convention as possible, because honestly, writing a build-script for the 80% case is surely pretty much a solved problem by now; conceptually, at least.  It&#8217;s often making time to do it that&#8217;s the hard part, right?</p>
<p>Secondly: <em>Why isn&#8217;t the Rakefile in the root, next to the solution file, so I can just type <code>rake</code> and have stuff happen?  I need to <code>cd build; rake</code> before I see stuff!</em> I did this because of the way TeamCity (TC) and subversion (svn) work together.  In TeamCity you set up a Version Control System (VCS) root.  The simplest thing is one pointed at the trunk of your codebase, so it gets everything.  You can customise the VCS roots by telling TC to only check out paths matching some rules you tell it, or omit externals, and some other tricks.  However, it doesn&#8217;t check out lazily, it checks out greedily (as at 4.0.2 anyhow).  Say you set up the VCS root <code>{svn}/trunk</code> and a checkout rule to skip <code>{svn}/trunk/foo</code> &#8211; it&#8217;ll check out everything from <code>{svn}/trunk</code> and then, afterwards, delete the <code>foo</code> directory.  This takes time &#8211; at my place, we&#8217;ve got a modest project, but sadly a slow svn server &#8211; the checkout takes more time than the do-work part of the build.</p>
<p>A bit of background.  For this project, we have one svn repo for the code that we write, and one for the 3rd-party libraries, tools, code, and other artifacts that we depend on to produce a build.  This keeps the size of checkouts smaller for remote staff over the VPN (which is also not the most robust), and backups quicker (since we make fewer changes to the 3rdparty repo, we back it up less frequently, especially since it&#8217;s not complicated to reconstruct because we&#8217;ve got commit emails of what changes happened to it).  We also only have the one NCover license, which is installed on just one TC build-agent &#8211; this means our setup can&#8217;t just run all the build-tasks from beginning to end, since the other two agents don&#8217;t have an NCover license.  So, TeamCity isn&#8217;t set up in the simplest-way-that-works.  A build project has a number of build configs:</p>
<ul>
<li>Continuous (in Debug configuration) (this will generate AssemblyInfo.cs files, compile, run unit-tests, harvest the artifacts, and publish them to the CI server for later configs&#8217; use)</li>
<li>Coverage</li>
<li>FxCop</li>
<li>TeamCity Duplicate Finder</li>
<li>Continuous (in Release configuration)</li>
</ul>
<p>It would be easy to see that later we&#8217;d also want:</p>
<ul>
<li>Integration Tests</li>
<li>NDepend</li>
<li>Deploy to test environment</li>
<li>UI Test</li>
<li>Deploy to production</li>
<li>Notify clients of new functionality drop :-)</li>
<li>etc</li>
</ul>
<p>As I say, running end-to-end in each build-configuration on each agent is not only not possible, it&#8217;s wasteful.  It&#8217;s also wasteful to hammer our feeble little svn server for a full checkout of stuff we don&#8217;t need during subsequent stages (we don&#8217;t need the source-code if we&#8217;ve got a convenient zip file of all the build output already, right?).  Fail fast.  So, how?  VCS roots.  The table below describes how I&#8217;d set up the rake-dotnet Demo product in TeamCity (assuming the rdn FxCop task didn&#8217;t have a bug in it that I need to fix ;-)  ).</p>
<p><a href="http://blog.neverrunwithscissors.com/wp-content/uploads/2009/04/demobuildconfigs.png"><img class="aligncenter size-medium wp-image-196" title="Demo TeamCity build-configs" src="http://blog.neverrunwithscissors.com/wp-content/uploads/2009/04/demobuildconfigs-300x88.png" alt="Demo TeamCity build-configs" width="300" height="88" /></a></p>
<p>(or as HTML: [download id="3"])</p>
<p>What all of this effort lets us have is a config up front that does the basics (compile, unit-tests-that-are-fast, package, etc), then pushes that up to the CI server; the process then branches out into parallel-building by taking advantage of the fact that TeamCity gives you 3 agents for free.  Each config pulls down the DLLs etc that the first one generated, and runs off them.  The subsequent configs will run in parallel, then the Continuous-Release one will run if all three of the Order-2 ones pass.</p>
<p>Now, if only I could get the <a href="https://github.com/jlewallen/git-teamcity/tree">git plugin</a> to work.  No joy, so far.  Git renders some of this irrelevant, because its checkout speed is so much faster that svn&#8217;s (in our environment, at any rate).  Another day&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.neverrunwithscissors.com/2009/04/09/teamcity-402-rake-dotnet-parallelisation-in-the-build-cloud/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
