<?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; tools</title>
	<atom:link href="http://blog.neverrunwithscissors.com/category/tools/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>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>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>
		<item>
		<title>rake-dotnet &#8211; source moved to github.com</title>
		<link>http://blog.neverrunwithscissors.com/2009/04/09/rake-dotnet-source-moved-to-githubcom/</link>
		<comments>http://blog.neverrunwithscissors.com/2009/04/09/rake-dotnet-source-moved-to-githubcom/#comments</comments>
		<pubDate>Thu, 09 Apr 2009 14:14:02 +0000</pubDate>
		<dc:creator>Pete</dc:creator>
				<category><![CDATA[development]]></category>
		<category><![CDATA[tools]]></category>
		<category><![CDATA[git]]></category>
		<category><![CDATA[rake]]></category>
		<category><![CDATA[rake-dotnet]]></category>

		<guid isPermaLink="false">http://blog.neverrunwithscissors.com/?p=189</guid>
		<description><![CDATA[I&#8217;ve jumped onto the git bandwagon and discovered github.com &#8211; I&#8217;ve moved the rake-dotnet source-code to a new git repository there.  Now if only I could break the habit of pushing on every commit&#8230;  Thanks to Aaron for a helpful guide on migrating, and myriad others for other guides and tools (I was particularly enthused [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve jumped onto the <a href="http://git-scm.com">git</a> bandwagon and discovered <a href="http://github.com">github.com</a> &#8211; I&#8217;ve moved the <a href="http://blog.neverrunwithscissors.com/tag/rake-dotnet">rake-dotnet</a> source-code to <a href="http://github.com/petemounce/rake-dotnet">a new git repository there</a>.  Now if only I could break the habit of pushing on every commit&#8230;  Thanks to <a href="http://codebetter.com/blogs/aaron.jensen/">Aaron</a> for a <a href="http://codebetter.com/blogs/aaron.jensen/archive/2009/03/12/hosting-your-oss-project-on-github.aspx">helpful guide on migrating</a>, and myriad others for other guides and tools (I was particularly enthused when I saw how quickly <a href="http://code.google.com/p/tortoisegit/">TortoiseGit</a> has become featureful!).</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.neverrunwithscissors.com/2009/04/09/rake-dotnet-source-moved-to-githubcom/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Raking it in; rake-dotnet &#8220;Hello World!&#8221; release v0.0.5</title>
		<link>http://blog.neverrunwithscissors.com/2009/04/03/raking-it-in-rake-dotnet-hello-world-release-v005/</link>
		<comments>http://blog.neverrunwithscissors.com/2009/04/03/raking-it-in-rake-dotnet-hello-world-release-v005/#comments</comments>
		<pubDate>Fri, 03 Apr 2009 13:06:38 +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[rake]]></category>
		<category><![CDATA[rake-dotnet]]></category>

		<guid isPermaLink="false">http://blog.neverrunwithscissors.com//?p=157</guid>
		<description><![CDATA[It&#8217;s been quite a while since I said I was going to publish rake-dotnet.  In that time, I&#8217;ve learned more about making custom tasks for rake, and how to publish a ruby gem (which is ruby&#8217;s packaging mechanism).  I&#8217;ve also implemented some features: AssemblyInfo generation &#8211; generate assembly-info files that pull in: product name company [...]]]></description>
			<content:encoded><![CDATA[<p>It&#8217;s been quite a while since I said I was going to publish <a href="http://rubyforge.org/projects/rake-dotnet/">rake-dotnet</a>.  In that time, I&#8217;ve learned more about making custom tasks for rake, and how to publish a ruby gem (which is ruby&#8217;s packaging mechanism).  I&#8217;ve also implemented some features:</p>
<ul>
<li>AssemblyInfo generation &#8211; generate assembly-info files that pull in:
<ul>
<li>product name</li>
<li>company name</li>
<li>build configuration</li>
<li>build date</li>
<li>version number (major.minor from a text file; build from an environment variable (or 0 if not build with CI), revision from svn working copy).</li>
</ul>
<p>This task will overwrite <code>Properties/AssemblyInfo.cs</code> in each project within the source directory, either from a template side-by-side to it, or from the common template in the source directory.  If source-control is other than Subversion, revision number is replaced as YYYYMMDD of the current date.  If the script is run locally, build-number will not be set (since this environment variable comes from TeamCity, or another build-server).</li>
<li>MsBuild compilation &#8211; compile projects using MsBuild.  Vary the output verbosity and the configuration.</li>
<li>Harvest the output to an all-in-one directory, for later packaging for convenience of artifact-publishing to a build server like <a href="http://www.jetbrains.com/teamcity/index.html">TeamCity</a>.  This enables parallelisation, because we can push out the artifacts to other agents to process their own tasks against (farming out separate test suites or coverage processing, for example).</li>
<li>Harvest web-applications to a directory each for later packaging for deployment convenience.</li>
<li>Run <a href="http://www.codeplex.com/xunit">XUnit.NET</a> fixtures and generate reports</li>
<li>Run <a href="http://www.pnpguidance.net/post/DownloadFxCop136NETCodeAnalysisTool.aspx">FxCop</a> and generate a report</li>
<li>Run <a href="http://www.ncover.com">NCover</a> to generate coverage data, and run NCover.Reporting to generate reports off that data (currently, just one report type of <em>many</em> in v3)</li>
<li>Package up output for publishing to build-server artifacts.  The conventions are set up with a build-server distributed build in mind.</li>
<li>All of that in a Rakefile that is currently less than 40 lines long :-)</li>
</ul>
<p>So; I&#8217;ve wrapped up what I&#8217;ve done in a ruby gem; you can install it:</p>
<ul>
<li>First get ruby; running the <a href="rubyforge.org/projects/rubyinstaller/">installer</a> with defaults is fine</li>
<li>At a command-line: <code>gem install rake-dotnet --include-dependencies</code> (prepend &#8216;sudo&#8217; if you&#8217;re not on Windows).</li>
<li>Get a whole bunch of tools &#8211; see the gem&#8217;s README.txt for details (gems are installed under <code>{ruby}/lib/ruby/gems/{ruby version}/gems/</code>.</li>
<li><code>svn checkout http://my-svn.assembla.com/svn/nrws/trunk/rake_dotnet/lib/DemoRoot</code> to see the demo project.</li>
<li>Populate the 3rdparty tools directory (inside DemoRoot) according to the readme.txt within (I plan to make this easier&#8230;).</li>
<li>Try out the demo by changing into its build directory and running <code>rake</code> from the command-line.  <code>rake -T</code> will give you a breakdown of available tasks.</li>
</ul>
<p>The tasks assume conventions for things like tools-location and solution layout.  So until I document those properly with rdoc (on my list of things to learn, right after unit-tests in ruby!), here they are:</p>
<ul>
<li><code>PRODUCT_ROOT</code> defaults to <code>..</code> &#8211; rake&#8217;s working directory is <code>build/</code>, where Rakefile.rb is used.  All paths are relative to the rake working directory.</li>
<li><code>OUT_DIR</code> defaults to <code>out</code>, hence equivalent to <code>#{PRODUCT_ROOT}/build/out</code> &#8211; build-output gets squirted here.</li>
<li><code>SRC_DIR</code> defaults to <code>#{PRODUCT_ROOT}/src</code> &#8211;  buildable projects should live here (this includes test projects).  One directory per project, directory-name matches project-filename matches generated assembly-name.</li>
<li><code>TOOLS_DIR</code> defaults to <code>#{PRODUCT_ROOT}/../3rdparty</code> &#8211; intentionally, tools are kept outside of the source tree.  This allows for efficient xcopy deployment, or a source-control symbolic link arrangement (svn:externals works well).</li>
<li>test projects should have &#8220;Tests&#8221; somewhere in their project-name.</li>
<li>web-application projects should have &#8220;Site&#8221; somewhere in their project-name.</li>
<li>msbuild is assumed to follow its defaults and output into {project-being-built}/bin/{configuration} for class libraries and so forth.</li>
<li>Each project directory within <code>SRC_DIR</code> is assumed to have a <code>Properties</code> directory where AssemblyInfo.cs in generated.  The template for this file is taken either from a side-by-side <code>AssemblyInfo.cs.template</code> file, or <code>#{SRC_DIR}/AssemblyInfo.cs.template</code></li>
</ul>
<p>The Demo solution is set up with these in mind, obviously.  They are possible to override to some extent by passing constants via the command-line like <code>rake MSBUILD_VERBOSITY=n CONFIGURATION=Release TOOLS_DIR=../tools</code>.</p>
<p><a href="http://my-svn.assembla.com/svn/nrws/trunk/rake_dotnet/">Source code</a> is available, of course.  I have yet to figure out <a href="http://www.rubyforge.org">rubyforge</a> for a <a href="http://www.rubyforge.org/projects/rake-dotnet">project home-page</a> and announcements, rdoc for documentation, and ruby unit-tests for ensuring quality.  There&#8217;s a roadmap in the readme; next major release will be 0.1.0 and will see more in the way of test coverage, <a href="http://www.nunit.org/">nunit</a> support, and more ncover reports (I have to do these within the 21-day trial license, I think&#8230;).  I am also likely to move the source control to <a href="http://www.github.com">github</a>, since I&#8217;ve been wanting to learn <a href="http://git-scm.com/">git</a>, too&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.neverrunwithscissors.com/2009/04/03/raking-it-in-rake-dotnet-hello-world-release-v005/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>So obvious it hurts to see</title>
		<link>http://blog.neverrunwithscissors.com/2009/03/05/so-obvious-it-hurts-to-see/</link>
		<comments>http://blog.neverrunwithscissors.com/2009/03/05/so-obvious-it-hurts-to-see/#comments</comments>
		<pubDate>Thu, 05 Mar 2009 17:07:33 +0000</pubDate>
		<dc:creator>Pete</dc:creator>
				<category><![CDATA[personal]]></category>
		<category><![CDATA[tools]]></category>
		<category><![CDATA[mac]]></category>

		<guid isPermaLink="false">http://blog.neverrunwithscissors.com//?p=158</guid>
		<description><![CDATA[I have a Mac.  Up until a year or so ago, I was an entirely PC/Windows person.  Then I started doing some Silverlight development at Narrowstep, and needed to start using a Mac to test out the cross-platform feature.  It grew on me, and I bought one.  Frankly, I love it.  I&#8217;ve entirely moved over [...]]]></description>
			<content:encoded><![CDATA[<p>I have a Mac.  Up until a year or so ago, I was an entirely PC/Windows person.  Then I started doing some Silverlight development at Narrowstep, and needed to start using a Mac to test out the cross-platform feature.  It grew on me, and I bought one.  Frankly, I love it.  I&#8217;ve entirely moved over to it, except for .NET development (which I do inside a VM running on it).</p>
<p>There&#8217;s a whole different mindset to using a Mac.  I know, I know; &#8220;It just works&#8221; has surely been beaten to death (even though it&#8217;s pretty accurate).  The best way that I can articulate it is, well, you need to unlearn thinking complicatedly.  </p>
<p>Case in point &#8211; I inserted a DVD into the front of my MacBook Pro.  There&#8217;s no obvious way to eject it (having been conditioned to expect a little plastic eject button next to the slot, like on a PC), when it doesn&#8217;t mount (normally, it auto-mounts, and you special-click on the icon and click eject).  So, off to google &#8211; &#8220;how to eject dvd from macbook pro&#8221; &#8211; I plaintively type.  Several answers:</p>
<ul>
<li>Hold down the trackpad button during bootup (I don&#8217;t want to reboot right now!  How insane!)</li>
<li>Power up the Mac and leave it alone for 10min (again.  And, how does it decide it should eject the DVD?)</li>
<li>&#8230; press the eject key on the keyboard</li>
</ul>
<p>Um.  Right.</p>
<p>It turns out &#8220;simplest thing that could possibly work&#8221; is still just not inside my tunnel vision, sometimes&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.neverrunwithscissors.com/2009/03/05/so-obvious-it-hurts-to-see/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
