<?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>Beige Sunshine &#187; .Net</title>
	<atom:link href="http://blog.beigesunshine.com/category/net/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.beigesunshine.com</link>
	<description>Welcome to your head.</description>
	<lastBuildDate>Fri, 06 May 2011 20:59:30 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>On a more positive note</title>
		<link>http://blog.beigesunshine.com/2010/07/09/on-a-more-positive-note/</link>
		<comments>http://blog.beigesunshine.com/2010/07/09/on-a-more-positive-note/#comments</comments>
		<pubDate>Fri, 09 Jul 2010 14:14:10 +0000</pubDate>
		<dc:creator>mendicant</dc:creator>
				<category><![CDATA[.Net]]></category>
		<category><![CDATA[General]]></category>
		<category><![CDATA[OffTopic]]></category>

		<guid isPermaLink="false">http://blog.beigesunshine.com/2010/07/09/on-a-more-positive-note/</guid>
		<description><![CDATA[I went on a bit of a tangent in my last post. I focused more on negative things than what it was I was really trying to get across. So today, let’s take a look at &#8230; <a class="more-link" href="http://blog.beigesunshine.com/2010/07/09/on-a-more-positive-note/">More<span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>I went on a bit of a tangent in my last <a href="http://blog.beigesunshine.com/2010/07/04/look-who-finally-showed-up-an-ode-to-microsoft/">post</a>. I focused more on negative things than what it was I was really trying to get across. So today, let’s take a look at some of the good moves they’ve made in the last couple of years.</p>
<p>&#160;</p>
<h2></h2>
<h2>Powershell</h2>
<p>Yes, I know I whine about it a lot. But it is a step in the right direction. From a technical standpoint, it is exactly what users in the Microsoft world needed. The main reason I complain is because I like the way that unix shells work in general compared to the way windows shells do. It’s a cultural/ease of use thing. It was a welcome, though <strong>LONG OVERDUE</strong> tool.</p>
<h2>Asp.Net MVC</h2>
<p>Once again, a very welcome release. As I said in the last post, it still lacks compared to other MVC frameworks, but it is absolutely a <strong>step in the right direction</strong>. Maybe you will never even convince WebForms guys to use it, but at least it’s there and it seems to be taking off. You’ll never get rid of webforms from the standpoint of legacy apps that are too big/expensive to rewrite, but going forward we’ve at least got a choice.</p>
<p>My biggest concern with this one is that they shipped MVC2 with Visual Studio 2010. _If_ this means that ASP.Net MVC releases are going to be tied to the Visual Studio releases, they’ve just shot themselves in the foot big time.</p>
<h2>The Big One – JQuery</h2>
<p>Let’s face it, <a href="http://weblogs.asp.net/scottgu/archive/2008/09/28/jquery-and-microsoft.aspx">this</a> was probably one of the biggest announcements MS has ever made. It (could possibly) signify a shift in MS’s stance on open source and community projects. Instead of going out and writing yet another half baked framework, they went out and found a way to package (arguably) the best one with their framework. I understand there are other frameworks out there (and have even used them), but none seems to be nearly as popular as JQuery. In fact, JQuery has basically become the Kleenex of Javascript. Often time’s we on our team will say “I’m gonna JQuery that up” or “Throw some JQuery there”. It’s a noun, a verb… whatever it needs to be for us to say “Use Javascript”.</p>
<p>In fact, I don’t think there would be very many open source libraries with more acceptance and use than JQuery.</p>
<h2>Razor</h2>
<p>Okay, so maybe I don’t get it, but it does seem a lot better than webforms. But why release it just to throw into webmatrix? Unless I’m missing something here and it’s going to be in ASP.Net MVC next week, or V3.0 (when will that get released?) then it’s ridiculous that it isn’t integrated already.</p>
<h2>The big picture</h2>
<p>So, though I may not exactly like all the techs I’m about to list, let’s look at them from a high level. MS now has it set up that they can offer an MVC Stack (ASP.Net MVC), a great Javascript Library (JQuery), an IoC container (Unity), an ORM (Entity Framework) and a decent command line environment to deploy it with (using <a href="http://github.com/JamesKovacs/psake">psake</a> and <a href="http://twitter.com/ehexter/statuses/14016233788">Pstrami</a> if it ever comes out <img src='http://blog.beigesunshine.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> . Again very positive.</p>
<h2>So why the big rant?</h2>
<p>My biggest point in my last post was “What took so long?” I’ve heard two stories regarding why MVC came to fruition. One is that they were worried about all the MVC frameworks and finally decided to build their own. The other (way cooler) one is that the Gu was given a demo of rails at a conference and loved it so much that he wrote the humble beginnings of ASP.Net on the plane ride home.</p>
<p>Either way, imagine if, instead of a reactive release in 2009 we had gotten a more proactive release even in 2006? Imagine if RIGHT NOW we had in our hands what ASP.Net MVC is going to look like in 2013. Look at the other frameworks. Whenever someone gets something right, they copy it almost immediately. Imagine we had a framework like that.</p>
<p>Or what about entity framework. I haven’t used it yet. I don’t have a need. But in talking to people I have found that EF4 is a huge step forward. Not great yet, but not bad either. It works, but still has shortcomings. Once again, imagine if instead of a 2008 release we had something more along the lines of, i don’t know, 2006? Imagine if EF were nearly as mature as NHibernate. </p>
<p>All I’ve been trying to say is that MS is always late to the party and then tries to get people to push these tools when they know there are better ones out there. There may come a day when an MVP who knows both EF and NHibernate will push&#160; EF before NHibernate (it may even happen already) but it will not be common for a few more releases of EF.</p>
<h2>But once again the positive</h2>
<p>All these releases seem to be coming closer and closer together now. The IIS Express, Sql Server Compact Edition, Razor announcements recently are examples of that. It <strong>seems</strong> as though MS is paying attention to the developers and seemingly even <strong>other developer communities</strong> again. If they can continue to do that and continue shoving resources towards improving the development story on Windows, things are bound to improve. Hopefully quickly.</p>
<p>Let’s face it, outside Visual Studio, windows development is second rate compared to everything else, and I hope they change that because I don’t want to be second rate.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.beigesunshine.com/2010/07/09/on-a-more-positive-note/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Look who finally showed up! &#8212; An Ode to Microsoft</title>
		<link>http://blog.beigesunshine.com/2010/07/04/look-who-finally-showed-up-an-ode-to-microsoft/</link>
		<comments>http://blog.beigesunshine.com/2010/07/04/look-who-finally-showed-up-an-ode-to-microsoft/#comments</comments>
		<pubDate>Sun, 04 Jul 2010 14:41:17 +0000</pubDate>
		<dc:creator>mendicant</dc:creator>
				<category><![CDATA[.Net]]></category>
		<category><![CDATA[General]]></category>
		<category><![CDATA[OffTopic]]></category>
		<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://blog.beigesunshine.com/2010/07/04/look-who-finally-showed-up-an-ode-to-microsoft/</guid>
		<description><![CDATA[&#160; I’m going to start by saying that the first part (and majority) of this post will be negative. Not the whole thing, but you’ve been warned. With the introduction of the Razor view engine today &#8230; <a class="more-link" href="http://blog.beigesunshine.com/2010/07/04/look-who-finally-showed-up-an-ode-to-microsoft/">More<span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>&#160;</p>
<p>I’m going to start by saying that the first part (and majority) of this post will be negative. Not the whole thing, but you’ve been warned.</p>
<p>With the introduction of the <a href="http://weblogs.asp.net/scottgu/archive/2010/07/02/introducing-razor.aspx">Razor</a> view engine today and the subsequent <a href="https://twitter.com/bsimser/status/17666591357">very</a>&#160;<a href="http://twitter.com/jeremydmiller/status/17660673077">expected</a> <a href="http://twitter.com/karlseguin/status/17678315192">questioning</a> and <a href="http://weblogs.asp.net/scottgu/archive/2010/07/02/introducing-razor.aspx#7553058">praise</a>, I&#8217;m feeling the same way I do about so many releases that Microsoft has made since I&#8217;ve been a .Net developer:</p>
<p>At best, a little pissed off. But let’s get to that later.</p>
<p>Let’s start with Razor. High level, is it:</p>
<ul>
<li>New? Check. </li>
<li>Different? A little bit. </li>
<li>Ground breaking? <strong>No.</strong> </li>
<li>Revolutionary? <strong>Not even close.</strong> </li>
</ul>
<p>If you take a look at the example’s in Scott Gu’s introductory post and the examples for the <a href="http://sparkviewengine.com/">Spark</a> View Engine, you’ll see why people are commenting about the <a href="http://twitter.com/robconery/status/17658632556">similarity</a>.</p>
<p>The fact of the matter is, it’s <a href="http://sparkviewengine.com/">been</a>&#160;<a href="http://github.com/NHaml/NHaml">done</a>. So really, why be upset when people question the use of it? It’s this attitude that starts me on my rant.</p>
<h2>ASP.Net</h2>
<h2></h2>
<h2></h2>
<p>Let’s start way back on January 5, 2002. Love it or hate it, Microsoft introduced <a href="http://www.asp.net/web-forms">ASP.Net Webforms</a>. Whether you agree with it’s methodology or not, you can’t deny that it was:</p>
<li>New. </li>
<li>Different. </li>
<li>Ground breaking. </li>
<li>Revolutionary. </li>
<p>&#160;</p>
<p>In fact, it was so revolutionary, that it took until <a href="http://en.wikipedia.org/wiki/ASP.NET_MVC_Framework#Release_history">March 17, 2009</a> before they even released the <a href="http://www.asp.net/mvc">ASP.Net MVC</a> framework that acknowledged there was another point of view on web development. Now was ASP.Net MVC:</p>
<li>New? <a href="http://cakephp.org/">That’s</a> a <a href="http://struts.apache.org/">big</a>&#160;<a href="http://www.djangoproject.com/">fat</a>&#160;<a href="http://rubyonrails.org/">no</a>. </li>
<li>Different? Maybe to webforms developers. </li>
<li>Ground breaking? Far from it. </li>
<li>Revolutionary? Way too late for that. </li>
<p>&#160;</p>
<p>Yet there <strike>everyone</strike> the pure MS developers were finally being enlightened on what web development could be like. And we were supposed to be grateful. Grateful that literally years after other developers figured it out, MS did. Java got struts in 2000. Ruby got Rails in 2005. There’s numerous others, but to finally get to the subject of my annoyance:</p>
<p>&#160;</p>
<p><strong>WHAT IN THE F@%&amp; TOOK MICROSOFT SO LONG?</strong></p>
<p>&#160;</p>
<h2>Powershell</h2>
<p>Yet another leap forward…. at least for the Microsoft world. How does it stack up:</p>
<ul>
<li>New? Nope.</li>
<li>Different? A little.</li>
<li>Ground Breaking? Maybe if you include the .Net Integration.</li>
<li>Revolutionary? Not at all.</li>
</ul>
<p>There’s <a href="http://en.wikipedia.org/wiki/Bash_(Unix_shell)">literally</a>&#160;<a href="http://en.wikipedia.org/wiki/C_shell">hundreds</a>&#160;<a href="http://en.wikipedia.org/wiki/Friendly_interactive_shell">of</a>&#160;<a href="http://en.wikipedia.org/wiki/Z_shell">shells</a>. Microsoft finally got up to creating a real one. Reaching at least as far back as <a href="http://en.wikipedia.org/wiki/Thompson_shell">1971</a>, shells have a long and storied history. Probably the most celebrated of the shells, the <a href="http://en.wikipedia.org/wiki/Bash_(Unix_shell)">Bourne Again Shell</a> (bash) was first released in 1987, and was blowing the Microsoft world out of the water in terms of usability, capability and power from even back in the days of DOS. So why is it that it took until 2006 for Microsoft to take the next step?</p>
<p>The obvious omissions for me are: a real history search and a preserved history. Two of the most beneficial tools in a bash user’s aresenal. Credit where credit is due though: The .Net integration story in powershell is immensely intriguing.</p>
<h2>Are you seri-OSS?</h2>
<p>Bad pun, I know. But the problem is so bad that the developer community has had to take it upon themselves to solve these problems and innovate themselves. There is too many for me to go into each one so I’m going to short list it:</p>
<ul>
<li><a href="http://msdn.microsoft.com/en-us/library/bb399572.aspx">Entity Framework</a> vs <a href="http://nhforge.org/Default.aspx">NHibernate</a></li>
<li><a href="http://msdn.microsoft.com/en-us/library/ms182489(VS.80).aspx">MSTest</a> vs <a href="http://www.nunit.org/">NUnit</a>, <a href="http://www.mbunit.com/">MBUnit</a> and others</li>
<li><a href="http://unity.codeplex.com/">Unity</a> vs <a href="http://structuremap.github.com/structuremap/index.html">Structure Map</a>, <a href="http://www.castleproject.org/container/">Castle Windsor</a></li>
<li><a href="http://msdn.microsoft.com/en-us/library/wea2sca5(VS.80).aspx">MSBuild</a> vs <a href="http://nant.sourceforge.net/">NAnt</a></li>
<li><a href="http://weblogs.asp.net/scottgu/archive/2010/06/28/introducing-iis-express.aspx">IIS Express</a> vs <a href="http://en.wikipedia.org/wiki/WEBrick">WEBrick</a> and <a href="http://en.wikipedia.org/wiki/Mongrel_(web_server)">Mongrel</a> and the like</li>
</ul>
<p>And the four point system of New, Different, Ground Breaking and Revolutionary is going to look the same for all these. Even the aforementioned items had OSS precursors (MonoRail vs MVC and cygwin/bash vs Powershell).</p>
<h2>So why all the acclaim?</h2>
<p>Instead of looking from the outside in, let’s take a look at these from the average Microsoft Developer who never strays from the walled garden. Every single technology mentioned would answer something like:</p>
<ul>
<li>New? And shiny too!</li>
<li>Different? Mind bendingly so.</li>
<li>Ground Breaking? I’ve never seen anything like it!</li>
<li>Revolutionary? Unbelievably so!</li>
</ul>
<p>I’ve been an avid *nix user and had at least one or more *nix based systems in my house for 10+ years. I’ve been working (very casually) on a Rails site since 2006. I was a Java developer before I was a .Net developer. To me it always feel like we finally are arriving at the party, years after everyone else.</p>
<h2>Better late than never</h2>
<p>Truth be told, there _is_ a bright side to all this. Microsoft is finally starting to provide their developers with tools that other platforms have had for <strong>decades</strong>. Is there a push to be more developer friendly again? I’m not sure. All I know is that finally, they are attempting to move in the right direction. This is very positive. They aren’t there yet.</p>
<p>In fact, currently Microsoft is playing catch up. But it seems like once you awaken the sleeping Beast of Redmond that things start to get done. </p>
<h2></h2>
<h2></h2>
<h2>It’s not all a miss</h2>
<p>I’ve personally used some Microsoft Techs with great success in projects. The ones that come to mind immediately to mind are Prism and WPF. Though both could be improved (we rolled our own Event Aggregator in Prism) and WPF’s INotifyPropertyChanged is frustrating, both are a great step over what we previously had.</p>
<p>In fact, I think that the Framework itself is, overally, extremely impressive. I <strong>love</strong> C# as a language. I enjoy it and enjoy using it. It’s in many ways, far ahead of most other static languages, combined with VS and <a href="http://www.jetbrains.com/resharper/">R#</a> it’s a dream to use too.</p>
</p>
<h2>But…</h2>
<p>What happens if tomorrow the python devs make some huge leap forward that no other platform has? I would put money on the Java/Ruby/etc communities to mimic it almost immediately. Probably even the .Net OSS community will get something out. But will Microsoft have to wait for “the next release cycle”?</p>
<h2>Grateful?</h2>
<p>I’m going to be honest, I’m not happy with being second rate. In fact, I’m downright insulted that second rate is shoved in our faces and we’re expected to act like it’s the greatest thing ever. Yes new framework X <strong>IS</strong> much better than what we’ve got, but it’s still years behind what the other guys have. It’s a classic grass is greener situation, except for that the grass is measurably greener. You want to know why so many leaders are leaving .Net? It’s because Microsoft is behind the times and seemingly refuses to outright acknowledge it until people whine, bitch and complain for <strong>YEARS</strong>. </p>
<h2>Here’s an idea</h2>
<p>Wow me. Let’s go back to 2002. Do something. ANYTHING. Don’t just play catch up. Take it to the next level. Be the innovator. Beat the OSS community to the punch. If nothing else, Microsoft is putting itself in the position to do so. But intentions don’t keep developers on your platform. </p>
<p>I’ve been saying it for the last few years: .Net is in many ways stagnant, old and behind the times. </p>
<p>But I couldn’t be happier if they just came out and <strong>PROVED ME WRONG</strong>.</p>
<p>So prove me wrong. <strong>PLEASE</strong>.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.beigesunshine.com/2010/07/04/look-who-finally-showed-up-an-ode-to-microsoft/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>Rubicant&#8217;s first real build</title>
		<link>http://blog.beigesunshine.com/2009/09/13/rubicants-first-real-build/</link>
		<comments>http://blog.beigesunshine.com/2009/09/13/rubicants-first-real-build/#comments</comments>
		<pubDate>Mon, 14 Sep 2009 03:34:46 +0000</pubDate>
		<dc:creator>mendicant</dc:creator>
				<category><![CDATA[.Net]]></category>
		<category><![CDATA[Build]]></category>
		<category><![CDATA[Rake]]></category>
		<category><![CDATA[rubicant]]></category>
		<category><![CDATA[Ruby]]></category>

		<guid isPermaLink="false">http://blog.beigesunshine.com/?p=98</guid>
		<description><![CDATA[So I’ve been using rubicant for a while personally, but never on anything beyond my own projects and not for anything big. After reading Ayende&#8217;s post about building Rhino Mocks with PSake, I wondered if rubicant &#8230; <a class="more-link" href="http://blog.beigesunshine.com/2009/09/13/rubicants-first-real-build/">More<span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>So I’ve been using <a href="http://github.com/mendicantx/rubicant">rubicant</a> for a while personally, but never on anything beyond my own projects and not for anything big. After reading <a href="http://ayende.com/Blog/" target="_blank">Ayende&#8217;s</a> post about <a href="http://ayende.com/Blog/archive/2009/08/30/on-psake.aspx" target="_blank">building Rhino Mocks with PSake</a>, I wondered if rubicant could so something similar, so I decided to port his build script.</p>
<p>Of course, I didn’t have a generate assembly info method, so I basically took Oren’s and ported it as well (sorry Oren, I’ll take it out if you want). At the same time, I took the opportunity to remove the dependency on configatron from rubicant as well. It just seemed like overkill to require configatron when it really wasn’t buying me much. </p>
<p>In the end, I came up with this, which on the whole I don’t think looks too bad. I personally like it better, but I’ve been on a bit of a vendetta against PowerShell scripts since I wrote my first one some time ago. I don’t know why, but the friction it gave me over writing ruby scripts just always rubbed me the wrong way.</p>
<p>&#160;</p>
<pre style="width: 805px; height: 1995px">require 'fileutils'
require 'rake'
require 'rubicant'
include Rubicant

base_dir  = File.expand_path(&quot;.&quot;)
lib_dir = &quot;#{base_dir}\\SharedLibs&quot;
build_dir = &quot;#{base_dir}\\build&quot;
buildartifacts_dir = &quot;#{build_dir}\\&quot;
sln_file = &quot;#{base_dir}\\Rhino.Mocks-vs2008.sln&quot;
version = &quot;3.6.0.0&quot;
human_readable_version = &quot;3.6&quot;
tools_dir = &quot;#{base_dir}\\Tools&quot;
release_dir = &quot;#{base_dir}\\Release&quot;
upload_category = &quot;Rhino-Mocks&quot;
upload_script = &quot;C:\\Builds\\Upload\\PublishBuild.build&quot;
mbunit_dir = &quot;#{tools_dir}\\MbUnit&quot;

task :default =&gt; :release do
end

task :clean do
  rm_rf buildartifacts_dir
  rm_rf release_dir
end

task :init =&gt; :clean do

	generate_assembly_info({
		:path =&gt; &quot;#{base_dir}\\Rhino.Mocks\\Properties&quot;,
		:title =&gt; &quot;Rhino Mocks #{version}&quot;,
		:description =&gt; &quot;Mocking Framework for .NET&quot;,
		:company =&gt; &quot;Hibernating Rhinos&quot;,
		:product =&gt; &quot;Rhino Mocks #{version}&quot;,
		:version =&gt; version,
		:cls_compliant =&gt; false,
		:copyright =&gt; &quot;Hibernating Rhinos &amp; Ayende Rahien 2004 - 2009&quot;})

	generate_assembly_info({
		:path =&gt; &quot;#{base_dir}\\Rhino.Mocks.Tests\\Properties&quot;,
		:title =&gt; &quot;Rhino Mocks Tests #{version}&quot;,
		:description =&gt; &quot;Mocking Framework for .NET&quot;,
		:company =&gt; &quot;Hibernating Rhinos&quot;,
		:product =&gt; &quot;Rhino Mocks Test #{version}&quot;,
		:version =&gt; version,
		:cls_compliant =&gt; false,
		:copyright =&gt; &quot;Hibernating Rhinos &amp; Ayende Rahien 2004 - 2009&quot;})

	generate_assembly_info({
		:path =&gt; &quot;#{base_dir}\\Rhino.Mocks.Tests.Model\\Properties&quot;,
		:title =&gt; &quot;Rhino Mocks Tests #{version}&quot;,
		:description =&gt; &quot;Mocking Framework for .NET&quot;,
		:company =&gt; &quot;Hibernating Rhinos&quot;,
		:product =&gt; &quot;Rhino Mocks Test Model #{version}&quot;,
		:version =&gt; version,
		:cls_compliant =&gt; false,
		:copyright =&gt; &quot;Hibernating Rhinos &amp; Ayende Rahien 2004 - 2009&quot;})

	mkdir release_dir
	mkdir buildartifacts_dir

	cp_r &quot;#{mbunit_dir}\\.&quot;, build_dir
end

task :compile =&gt; :init do
	MsBuildRunner.new(:properties =&gt; { :OutDir =&gt; buildartifacts_dir },
					  :project_file =&gt; sln_file).run
end

task :test =&gt; :compile do
	begin
		MbUnitRunner.new(:mbunit_dir =&gt; build_dir,
					 :test_files =&gt; [&quot;Rhino.Mocks.Tests.dll&quot;],
					 :report_type =&gt; 'Html').run
	rescue
		fail 'Error: Failed to execute tests'
	end
end

task :merge do
	begin
		rm_f &quot;#{build_dir}\\Rhino.Mocks.Partial.dll&quot;
		mv &quot;#{build_dir}\\Rhino.Mocks.dll&quot;, &quot;#{build_dir}\\Rhino.Mocks.Partial.dll&quot;

		sh &quot;#{tools_dir}\\IlMerge.exe &quot; +
			&quot;#{build_dir}\\Rhino.Mocks.Partial.dll &quot; +
			&quot;#{build_dir}\\Castle.DynamicProxy2.dll &quot; +
			&quot;#{build_dir}\\Castle.Core.dll &quot; +
			&quot;/out:#{build_dir}\\Rhino.Mocks.dll &quot;+
			&quot;/t:library &quot;+
			&quot;/keyfile:#{base_dir}\\ayende-open-source.snk &quot; +
			&quot;/internalize:#{base_dir}\\ilmerge.exclude&quot;

	rescue
        fail 'Error: Failed to merge assemblies!'
	end

	puts &quot;done merge&quot;
end

task :release =&gt; [:test, :merge] do
	begin
		puts &quot;Zipping files&quot;
		sh &quot;#{tools_dir}\\zip.exe -9 -A -j &quot; +
			&quot;#{release_dir}\\Rhino.Mocks-#{human_readable_version}-Build-#{ENV['ccnetnumericlabel']}.zip &quot; +
			&quot;#{build_dir}\\Rhino.Mocks.dll &quot; +
			&quot;#{build_dir}\\Rhino.Mocks.xml &quot; +
			&quot;license.txt &quot; +
			&quot;acknowledgements.txt&quot;

	rescue
        fail 'Error: Failed to execute ZIP command'
	end
end

task :upload =&gt; :release do
	if (File.exists?(upload_script) )
		begin
			log = sh 'git log -n 1 --oneline'
			MsBuildRunner.new({:properties =&gt; { :Category =&gt; upload_category,
											   :Comment =&gt; log,
											   :File =&gt; &quot;#{release_dir}\\Rhino.Mocks-#{human_readable_version}-Build-#{ENV['ccnetnumericlabel']}.zip&quot; },
							   :project_file =&gt; upload_script }).run

		rescue
			fail &quot;Error: Failed to publish build&quot;
		end
	else
		puts &quot;could not find upload script #{upload_script}, skipping upload&quot;
	end
end</pre>
<p>If you want to give this script a try (I’ve tried everything but the upload piece, which for obvious reasons I couldn’t test) just follow these steps:</p>
<ol>
<li>Get a copy of the <a href="http://github.com/ayende/rhino-mocks" target="_blank">rhino mocks source</a>.</li>
<li>Make sure you’ve got <a href="http://rubyforge.org/projects/rubyinstaller/" target="_blank">ruby installed</a>.</li>
<li>Make sure gem is up to date: “gem update –system”</li>
<li>Add github to your gem sources: “gem sources -a <a href="http://gems.github.com">http://gems.github.com</a>”</li>
<li>Install rubicant: “gem install mendicantx-rubicant”</li>
<li>Copy the above script into a file named rakefile.rb in the rhino mocks directory.</li>
<li>Run it: “rake release”</li>
</ol>
<p>God willing, this will work. I’ve tried it on a couple of fresh systems, but have no good way of knowing if it works beyond my machines. If you do on the offhand decide to try it, please let me know below!</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.beigesunshine.com/2009/09/13/rubicants-first-real-build/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>rubicant &#8211; MsBuild Task added</title>
		<link>http://blog.beigesunshine.com/2009/01/30/rubicant-msbuild-task-added/</link>
		<comments>http://blog.beigesunshine.com/2009/01/30/rubicant-msbuild-task-added/#comments</comments>
		<pubDate>Sat, 31 Jan 2009 06:38:14 +0000</pubDate>
		<dc:creator>mendicant</dc:creator>
				<category><![CDATA[.Net]]></category>
		<category><![CDATA[Build]]></category>
		<category><![CDATA[Rake]]></category>
		<category><![CDATA[rubicant]]></category>

		<guid isPermaLink="false">http://blog.beigesunshine.com/2009/01/30/rubicant-msbuild-task-added/</guid>
		<description><![CDATA[I just added an MsBuild task for rubicant tonight. I&#8217;m not very familiar with the command line options for MsBuild so some of these could probably be improved a bit, but until I know more I &#8230; <a class="more-link" href="http://blog.beigesunshine.com/2009/01/30/rubicant-msbuild-task-added/">More<span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>I just added an <a href="http://msdn.microsoft.com/en-us/library/0k6kkbsd.aspx">MsBuild</a> task for <a href="http://github.com/mendicantx/rubicant">rubicant</a> tonight. I&#8217;m not very familiar with the command line options for MsBuild so some of these could probably be improved a bit, but until I know more I will leave them as they are.</p>
<p>The MsBuild Task is used to create tasks which will use MsBuild. This should help with people who need to build WPF applications (since MsBuild is the only way right now), or (fingers crossed) migrate from MsBuild. </p>
<p>The MsBuild Task is used as follows: </p>
<div style="border-right: gray 1px solid; padding-right: 4px; border-top: gray 1px solid; padding-left: 4px; font-size: 8pt; padding-bottom: 4px; margin: 20px 0px 10px; overflow: auto; border-left: gray 1px solid; width: 97.5%; cursor: text; max-height: 200px; line-height: 12pt; padding-top: 4px; border-bottom: gray 1px solid; font-family: consolas, &#39;Courier New&#39;, courier, monospace; height: 260px; background-color: #f4f4f4">
<div style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"><span style="color: #606060">   1:</span> MsBuildTask.<span style="color: #0000ff">new</span>(:task_name =&gt; :dependencies) <span style="color: #0000ff">do</span> |msb|</pre>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"><span style="color: #606060">   2:</span>   msb.no_autoresponse</pre>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"><span style="color: #606060">   3:</span>   msb.target</pre>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"><span style="color: #606060">   4:</span>   msb.logger</pre>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"><span style="color: #606060">   5:</span>   msb.distributed_logger</pre>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"><span style="color: #606060">   6:</span>   msb.console_logger_parameters</pre>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"><span style="color: #606060">   7:</span>   msb.validate</pre>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"><span style="color: #606060">   8:</span>   msb.verbosity</pre>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"><span style="color: #606060">   9:</span>   msb.no_console_logger</pre>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"><span style="color: #606060">  10:</span>   msb.max_cpu_count</pre>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"><span style="color: #606060">  11:</span>   msb.ignore_project_extensions</pre>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"><span style="color: #606060">  12:</span>   msb.file_logger</pre>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"><span style="color: #606060">  13:</span>   msb.distributed_file_logger</pre>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"><span style="color: #606060">  14:</span>   msb.node_reuse</pre>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"><span style="color: #606060">  15:</span>   msb.properties</pre>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"><span style="color: #606060">  16:</span>   msb.file_logger_parameters</pre>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"><span style="color: #606060">  17:</span>   msb.project_file</pre>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"><span style="color: #606060">  18:</span> end</pre>
</p></div>
</div>
<p>Each of setters matches a command line option for MsBuild. For more information on what each one does, please view the documentation at <a href="http://msdn.microsoft.com/en-us/library/ms164311.aspx">http://msdn.microsoft.com/en-us/library/ms164311.aspx</a>. </p>
<p>Values that can only be set (for example, /noautoresponse) can be set to true (set) or nil (unset). </p>
<p>Values, such as /property that take a list of option settings, must be passed a hash where the keys are the options and the values are the option values. For example, to set the output directory and Warning Level for a csproj compile, you could use: </p>
<div style="border-right: gray 1px solid; padding-right: 4px; border-top: gray 1px solid; padding-left: 4px; font-size: 8pt; padding-bottom: 4px; margin: 20px 0px 10px; overflow: auto; border-left: gray 1px solid; width: 97.5%; cursor: text; max-height: 200px; line-height: 12pt; padding-top: 4px; border-bottom: gray 1px solid; font-family: consolas, &#39;Courier New&#39;, courier, monospace; background-color: #f4f4f4">
<div style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"><span style="color: #606060">   1:</span> MsBuildTask.<span style="color: #0000ff">new</span>(:compile) <span style="color: #0000ff">do</span> |msb|</pre>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"><span style="color: #606060">   2:</span>   msb.properties = { :OutputDir =&gt; <span style="color: #006080">&quot;.\\Output&quot;</span>, :WarningLevel =&gt; 2 }</pre>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"><span style="color: #606060">   3:</span>   msb.project_file = <span style="color: #006080">&quot;.\\Project1\\project.csproj&quot;</span></pre>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"><span style="color: #606060">   4:</span> end</pre>
</p></div>
</div>
<p>As of yet, I haven&#8217;t added an MsBuild helper to help create this function. I will probably get this done fairly shortly.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.beigesunshine.com/2009/01/30/rubicant-msbuild-task-added/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>rubicant update &#8211; Easy installation via gem</title>
		<link>http://blog.beigesunshine.com/2009/01/25/rubicant-update-easy-installation-via-gem/</link>
		<comments>http://blog.beigesunshine.com/2009/01/25/rubicant-update-easy-installation-via-gem/#comments</comments>
		<pubDate>Sun, 25 Jan 2009 15:43:53 +0000</pubDate>
		<dc:creator>mendicant</dc:creator>
				<category><![CDATA[.Net]]></category>
		<category><![CDATA[Build]]></category>
		<category><![CDATA[Rake]]></category>
		<category><![CDATA[rubicant]]></category>
		<category><![CDATA[Ruby]]></category>

		<guid isPermaLink="false">http://blog.beigesunshine.com/2009/01/25/rubicant-update-easy-installation-via-gem/</guid>
		<description><![CDATA[Since I already had rubicant building as a gem, it made sense to make it available as a gem. I have moved the project to github and it is now located at: http://github.com/mendicantx/rubicant/ In addition, you &#8230; <a class="more-link" href="http://blog.beigesunshine.com/2009/01/25/rubicant-update-easy-installation-via-gem/">More<span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Since I already had rubicant building as a gem, it made sense to make it available as a gem. I have moved the project to <a href="http://github.com">github</a> and it is now located at: <a title="http://github.com/mendicantx/rubicant/" href="http://github.com/mendicantx/rubicant/">http://github.com/mendicantx/rubicant/</a></p>
<p>In addition, you can also install rubicant via gem:</p>
<div style="border-right: gray 1px solid; padding-right: 4px; border-top: gray 1px solid; padding-left: 4px; font-size: 8pt; padding-bottom: 4px; margin: 20px 0px 10px; overflow: auto; border-left: gray 1px solid; width: 97.5%; cursor: text; max-height: 200px; line-height: 12pt; padding-top: 4px; border-bottom: gray 1px solid; font-family: consolas, &#39;Courier New&#39;, courier, monospace; background-color: #f4f4f4">
<div style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"><span style="color: #606060">   1:</span> gem sources -a http:<span style="color: #008000">//gems.github.com</span></pre>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"><span style="color: #606060">   2:</span> sudo gem install mendicantx-rubicant</pre>
</p></div>
</div>
<p>You should only ever have to run the gem sources command once. This adds github to your sources of remote gems. From what I understand, there&#8217;s a ton of great projects there.</p>
<p>Now you don&#8217;t have an excuse to try it out!</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.beigesunshine.com/2009/01/25/rubicant-update-easy-installation-via-gem/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Introducing Rubicant &#8211; Part 3 &#8211; The inner workings</title>
		<link>http://blog.beigesunshine.com/2009/01/22/introducing-rubicant-part-3-the-inner-workings/</link>
		<comments>http://blog.beigesunshine.com/2009/01/22/introducing-rubicant-part-3-the-inner-workings/#comments</comments>
		<pubDate>Fri, 23 Jan 2009 03:59:08 +0000</pubDate>
		<dc:creator>mendicant</dc:creator>
				<category><![CDATA[.Net]]></category>
		<category><![CDATA[Build]]></category>
		<category><![CDATA[NAnt]]></category>
		<category><![CDATA[Rake]]></category>
		<category><![CDATA[Ruby]]></category>

		<guid isPermaLink="false">http://blog.beigesunshine.com/2009/01/22/introducing-rubicant-part-3-the-inner-workings/</guid>
		<description><![CDATA[Don&#8217;t forget to check out Part 1 and Part 2. Rubicant basically has 4 main parts, as mentioned in the first part of this series. They are as follows: The CscTask The CscTask is used for &#8230; <a class="more-link" href="http://blog.beigesunshine.com/2009/01/22/introducing-rubicant-part-3-the-inner-workings/">More<span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Don&#8217;t forget to check out <a href="http://blog.beigesunshine.com/2009/01/15/introducing-rubicant/">Part 1</a> and <a href="http://blog.beigesunshine.com/2009/01/22/introducint-rubicant-part-2-a-sample-script/">Part 2</a>.</p>
<p>Rubicant basically has 4 main parts, as mentioned in the first part of this series. They are as follows:</p>
<h3>The CscTask</h3>
<p>The CscTask is used for compiling C# files. It&#8217;s usage is like:</p>
<div style="border-right: gray 1px solid; padding-right: 4px; border-top: gray 1px solid; padding-left: 4px; font-size: 8pt; padding-bottom: 4px; margin: 20px 0px 10px; overflow: auto; border-left: gray 1px solid; width: 97.5%; cursor: text; max-height: 200px; line-height: 12pt; padding-top: 4px; border-bottom: gray 1px solid; font-family: consolas, &#39;Courier New&#39;, courier, monospace; background-color: #f4f4f4">
<div style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"><span style="color: #606060">   1:</span> CscTask.<span style="color: #0000ff">new</span>(:task_name =&gt; :dependencies) <span style="color: #0000ff">do</span> |csc|</pre>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"><span style="color: #606060">   2:</span>   csc.target = <span style="color: #006080">'library'</span></pre>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"><span style="color: #606060">   3:</span>   csc.references = FileList[<span style="color: #006080">&quot;libs\*.dll&quot;</span>]</pre>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"><span style="color: #606060">   4:</span>   csc.<span style="color: #0000ff">out</span> = <span style="color: #006080">&quot;hello_world.exe&quot;</span></pre>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"><span style="color: #606060">   5:</span>   csc.debug = <span style="color: #006080">&quot;full&quot;</span></pre>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"><span style="color: #606060">   6:</span>   csc.files = FileList[<span style="color: #006080">&quot;src/**/*.cs&quot;</span>]</pre>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"><span style="color: #606060">   7:</span> end</pre>
</p></div>
</div>
<p><strong>target: </strong>Any target that the csc compiler takes (exe, winexe, library, etc)</p>
<p><strong>references: </strong>The list of assemblies that are referenced during compilation</p>
<p><strong>out:</strong> The output filename</p>
<p><strong>debug: </strong>if this is set(to anything), the compiler will be passed /debug:full to create debugging information</p>
<p><strong>files: </strong>The list of files to be compiled</p>
<p>CscTask also has a shortcut that can be accessed as follows:</p>
<div style="border-right: gray 1px solid; padding-right: 4px; border-top: gray 1px solid; padding-left: 4px; font-size: 8pt; padding-bottom: 4px; margin: 20px 0px 10px; overflow: auto; border-left: gray 1px solid; width: 97.5%; cursor: text; max-height: 200px; line-height: 12pt; padding-top: 4px; border-bottom: gray 1px solid; font-family: consolas, &#39;Courier New&#39;, courier, monospace; background-color: #f4f4f4">
<div style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"><span style="color: #606060">   1:</span> csc(name, dependencies, opts)</pre>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"><span style="color: #606060">   2:</span>&#160; </pre>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"><span style="color: #606060">   3:</span> ex:</pre>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"><span style="color: #606060">   4:</span> csc :name, [:dependencies], { :target =&gt; <span style="color: #006080">'library'</span>,</pre>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"><span style="color: #606060">   5:</span>                               :references = FileList[<span style="color: #006080">&quot;libs\*.dll&quot;</span>],</pre>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"><span style="color: #606060">   6:</span>                               :<span style="color: #0000ff">out</span> = <span style="color: #006080">&quot;hello_world.exe&quot;</span>,</pre>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"><span style="color: #606060">   7:</span>                               :debug = <span style="color: #006080">&quot;full&quot;</span>,</pre>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"><span style="color: #606060">   8:</span>                               :files = FileList[<span style="color: #006080">&quot;src/**/*.cs&quot;</span>] }</pre>
</p></div>
</div>
<p>&#160;</p>
<h3>The MBUnit Helper</h3>
<p>The MBUnit helper is used to run tests using mbunit v2. It is used as follows:</p>
<div style="border-right: gray 1px solid; padding-right: 4px; border-top: gray 1px solid; padding-left: 4px; font-size: 8pt; padding-bottom: 4px; margin: 20px 0px 10px; overflow: auto; border-left: gray 1px solid; width: 97.5%; cursor: text; max-height: 200px; line-height: 12pt; padding-top: 4px; border-bottom: gray 1px solid; font-family: consolas, &#39;Courier New&#39;, courier, monospace; background-color: #f4f4f4">
<div style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"><span style="color: #606060">   1:</span> mbunit(mbunit_dir, test_dir, test_files, opts={})</pre>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"><span style="color: #606060">   2:</span>&#160; </pre>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"><span style="color: #606060">   3:</span> ex:</pre>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"><span style="color: #606060">   4:</span> mbunit(<span style="color: #006080">&quot;/path/to/mbunit/dlls&quot;</span>,</pre>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"><span style="color: #606060">   5:</span>         FileList[<span style="color: #006080">&quot;/test/dlls/test.dll&quot;</span>],</pre>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"><span style="color: #606060">   6:</span>         {:working_dir =&gt; <span style="color: #006080">&quot;/dir/to/run/tests/in&quot;</span>,</pre>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"><span style="color: #606060">   7:</span>          :assembly_path =&gt; FileList[<span style="color: #006080">&quot;/assemblies/to/include/*.dll&quot;</span>],</pre>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"><span style="color: #606060">   8:</span>          :report_folder =&gt; <span style="color: #006080">&quot;sets /rf:&quot;</span>,</pre>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"><span style="color: #606060">   9:</span>          :report_name_format =&gt; <span style="color: #006080">&quot;sets /rnf:&quot;</span>,</pre>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"><span style="color: #606060">  10:</span>          :report_type =&gt; <span style="color: #006080">&quot;sets /rt:&quot;</span>,</pre>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"><span style="color: #606060">  11:</span>          :show_reports =&gt; <span style="color: #006080">&quot;sets /sr:&quot;</span>,</pre>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"><span style="color: #606060">  12:</span>          :transform =&gt; <span style="color: #006080">&quot;sets /tr:&quot;</span>,</pre>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"><span style="color: #606060">  13:</span>          :filter_category =&gt; <span style="color: #006080">&quot;sets /fc:&quot;</span>,</pre>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"><span style="color: #606060">  14:</span>          :exclude_category =&gt; <span style="color: #006080">&quot;sets /ec:&quot;</span>,</pre>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"><span style="color: #606060">  15:</span>          :filter_author =&gt; <span style="color: #006080">&quot;sets /fa:&quot;</span>,</pre>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"><span style="color: #606060">  16:</span>          :filter_type =&gt; <span style="color: #006080">&quot;sets /ft:&quot;</span>,</pre>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"><span style="color: #606060">  17:</span>          :filter_namespace =&gt; <span style="color: #006080">&quot;sets /fn:&quot;</span>,</pre>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"><span style="color: #606060">  18:</span>          :verbose =&gt; <span style="color: #006080">&quot;sets /v{optionvalue}&quot;</span>,</pre>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"><span style="color: #606060">  19:</span>          :shadow_copy =&gt; <span style="color: #006080">&quot;sets /sc:&quot;</span> }</pre>
</p></div>
</div>
<p>For a complete listing of the mbunit command line options, please visit <a title="http://docs.mbunit.com/help/html/gettingstarted/MbUnitConsoleRunner.htm" href="http://docs.mbunit.com/help/html/gettingstarted/MbUnitConsoleRunner.htm">http://docs.mbunit.com/help/html/gettingstarted/MbUnitConsoleRunner.htm</a>.</p>
<p>This runs the tests in test_files in the test_dir with the dlls from mbunit_dir using the options in opts. Currently, this will physically copy the minimum required mbunit dlls and mbunit.cons.exe to the test dir, run the tests and then remove the files.</p>
<h3>The CopyFiles Task</h3>
<p>The copy files task will copy files from one directory to another, while maintaining the folder structure.</p>
<div style="border-right: gray 1px solid; padding-right: 4px; border-top: gray 1px solid; padding-left: 4px; font-size: 8pt; padding-bottom: 4px; margin: 20px 0px 10px; overflow: auto; border-left: gray 1px solid; width: 97.5%; cursor: text; max-height: 200px; line-height: 12pt; padding-top: 4px; border-bottom: gray 1px solid; font-family: consolas, &#39;Courier New&#39;, courier, monospace; background-color: #f4f4f4">
<div style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"><span style="color: #606060">   1:</span> CopyFiles.<span style="color: #0000ff">new</span>(:name) <span style="color: #0000ff">do</span> |cf|</pre>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"><span style="color: #606060">   2:</span>   cf.base_dir = <span style="color: #006080">&quot;/some/dir&quot;</span></pre>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"><span style="color: #606060">   3:</span>   cf.file_globs = [<span style="color: #006080">&quot;**/somefiles/*.cs&quot;</span>, **/otherfiles/*.cs<span style="color: #006080">&quot;]</pre>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"><span style="color: #606060">   4:</span>   cf.target_dir = &quot;</span>/another/dir<span style="color: #006080">&quot;</pre>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"><span style="color: #606060">   5:</span>   cf.excludes = [&quot;</span>AssemblyInfo.cs&quot;]</pre>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"><span style="color: #606060">   6:</span> end</pre>
</p></div>
</div>
<p><strong>base_dir:</strong> The base directory to start copying files from</p>
<p><strong>file_globs:</strong> The globs of files to be copied from base_dir</p>
<p><strong>target_dir:</strong> The target directory to place the files in</p>
<p><strong>excludes:</strong> (Optional) list of files to be excluded from the copy.</p>
<h3>The Expand Template File Task</h3>
<p>Usage is:</p>
<div style="border-right: gray 1px solid; padding-right: 4px; border-top: gray 1px solid; padding-left: 4px; font-size: 8pt; padding-bottom: 4px; margin: 20px 0px 10px; overflow: auto; border-left: gray 1px solid; width: 97.5%; cursor: text; max-height: 200px; line-height: 12pt; padding-top: 4px; border-bottom: gray 1px solid; font-family: consolas, &#39;Courier New&#39;, courier, monospace; background-color: #f4f4f4">
<div style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"><span style="color: #606060">   1:</span> expand_template(template, output_file)</pre>
</p></div>
</div>
<p>This will read in the file specified by template and expand it out and write it to the location of output_file.</p>
<p><strong>WARNING:</strong> I am fairly certain that the only reason this is working right now for me is because I use configatron, which is accessed as a singleton. It is entirely possible that variables declared in your build script will not be accessible during template expansion. I will be testing this in the near future, however.</p>
<h3>Framework Selection</h3>
<p>Currently, only the .Net 2.0 and .Net 3.5 frameworks are configured. .Net 3.5 is the selection by default. However, you can choose which framework you want to use by adding framework={framework} in the build line. For example:</p>
<div style="border-right: gray 1px solid; padding-right: 4px; border-top: gray 1px solid; padding-left: 4px; font-size: 8pt; padding-bottom: 4px; margin: 20px 0px 10px; overflow: auto; border-left: gray 1px solid; width: 97.5%; cursor: text; max-height: 200px; line-height: 12pt; padding-top: 4px; border-bottom: gray 1px solid; font-family: consolas, &#39;Courier New&#39;, courier, monospace; background-color: #f4f4f4">
<div style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"><span style="color: #606060">   1:</span> rake deploy_local framework=net20</pre>
</p></div>
</div>
<p>This will run the deploy_local task in the default rakefile using the .Net 2.0 framework.</p>
<p>Valid framework values are:</p>
<p><strong>net20</strong> &#8211; .Net 2.0</p>
<p><strong>net35 </strong>- .Net 3.5</p>
<p>These frameworks are discovered using the registry, so you shouldn&#8217;t have to put in the location of your csc.exe file.</p>
<h3>What else?</h3>
<p>Well, that&#8217;s about all it really does right now. The rest is just built in rake and ruby goodness. I would like to add msbuild support for those that are building WPF apps. I would also like to add some nunit support, as well as some support for other things like easy creation of assemblyinfo.cs files and possibly some deployment tasks for iis7. Who knows. We&#8217;ll see how I like things and if I really take to using this (I think I will).</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.beigesunshine.com/2009/01/22/introducing-rubicant-part-3-the-inner-workings/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Introducing rubicant &#8211; Part 2 &#8211; A sample script</title>
		<link>http://blog.beigesunshine.com/2009/01/22/introducint-rubicant-part-2-a-sample-script/</link>
		<comments>http://blog.beigesunshine.com/2009/01/22/introducint-rubicant-part-2-a-sample-script/#comments</comments>
		<pubDate>Fri, 23 Jan 2009 03:42:18 +0000</pubDate>
		<dc:creator>mendicant</dc:creator>
				<category><![CDATA[.Net]]></category>
		<category><![CDATA[Build]]></category>
		<category><![CDATA[NAnt]]></category>
		<category><![CDATA[Rake]]></category>
		<category><![CDATA[Ruby]]></category>

		<guid isPermaLink="false">http://blog.beigesunshine.com/2009/01/22/introducint-rubicant-part-2-a-sample-script/</guid>
		<description><![CDATA[Update: There is also a Part 1 and a Part 3. Alright, so here is a sample build script for rubicant. First you will have to get rubicant installed. To do that, you need to get &#8230; <a class="more-link" href="http://blog.beigesunshine.com/2009/01/22/introducint-rubicant-part-2-a-sample-script/">More<span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><strong>Update: </strong>There is also a <a href="http://blog.beigesunshine.com/2009/01/15/introducing-rubicant/">Part 1</a> and a <a href="http://blog.beigesunshine.com/2009/01/22/introducing-rubicant-part-3-the-inner-workings/">Part 3</a>.</p>
<p>Alright, so here is a sample build script for rubicant. First you will have to get rubicant installed. To do that, you need to get the source from <a title="https://rubicant.googlecode.com/svn/trunk/" href="https://rubicant.googlecode.com/svn/trunk/">https://rubicant.googlecode.com/svn/trunk/</a>. I believe the username is rubicant-read-only.</p>
<p>In the root directory type:</p>
<div style="border-right: gray 1px solid; padding-right: 4px; border-top: gray 1px solid; padding-left: 4px; font-size: 8pt; padding-bottom: 4px; margin: 20px 0px 10px; overflow: auto; border-left: gray 1px solid; width: 97.5%; cursor: text; max-height: 200px; line-height: 12pt; padding-top: 4px; border-bottom: gray 1px solid; font-family: consolas, &#39;Courier New&#39;, courier, monospace; background-color: #f4f4f4">
<div style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"><span style="color: #606060">   1:</span> E:\projects\rubicant&gt;rake gem</pre>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"><span style="color: #606060">   2:</span> (<span style="color: #0000ff">in</span> E:/projects/rubicant)</pre>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"><span style="color: #606060">   3:</span> c:/ruby/lib/ruby/gems/1.8/gems/rake-0.8.3/lib/rake/gempackagetask.rb:13:Warning:</pre>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"><span style="color: #606060">   4:</span>  Gem::manage_gems is deprecated and will be removed on or after March 2009.</pre>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"><span style="color: #606060">   5:</span> mkdir -p pkg</pre>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"><span style="color: #606060">   6:</span> WARNING:  no rubyforge_project specified</pre>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"><span style="color: #606060">   7:</span> WARNING:  RDoc will not be generated (has_rdoc == false)</pre>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"><span style="color: #606060">   8:</span> WARNING:  deprecated autorequire specified</pre>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"><span style="color: #606060">   9:</span>   Successfully built RubyGem</pre>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"><span style="color: #606060">  10:</span>   Name: Rubicant</pre>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"><span style="color: #606060">  11:</span>   Version: 0.0.1</pre>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"><span style="color: #606060">  12:</span>   File: Rubicant-0.0.1.gem</pre>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"><span style="color: #606060">  13:</span> mv Rubicant-0.0.1.gem pkg/Rubicant-0.0.1.gem</pre>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"><span style="color: #606060">  14:</span>&#160; </pre>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"><span style="color: #606060">  15:</span> E:\projects\rubicant&gt;</pre>
</p></div>
</div>
<p>Now you&#8217;ve got the gem built, you just need to install it:</p>
<div style="border-right: gray 1px solid; padding-right: 4px; border-top: gray 1px solid; padding-left: 4px; font-size: 8pt; padding-bottom: 4px; margin: 20px 0px 10px; overflow: auto; border-left: gray 1px solid; width: 97.5%; cursor: text; max-height: 200px; line-height: 12pt; padding-top: 4px; border-bottom: gray 1px solid; font-family: consolas, &#39;Courier New&#39;, courier, monospace; background-color: #f4f4f4">
<div style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"><span style="color: #606060">   1:</span> E:\projects\rubicant&gt;gem install pkg\Rubicant-0.0.1.gem</pre>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"><span style="color: #606060">   2:</span> Successfully installed Rubicant-0.0.1</pre>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"><span style="color: #606060">   3:</span> 1 gem installed</pre>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"><span style="color: #606060">   4:</span>&#160; </pre>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"><span style="color: #606060">   5:</span> E:\projects\rubicant&gt;</pre>
</p></div>
</div>
<p>&#160;</p>
<p>There. Now for a test application. Suppose we&#8217;ve got 3 projects that make up a console app. The UI, the Engine (I KNOW) and the Tests. They look like:</p>
<p><a href="http://blog.beigesunshine.com/wp-content/uploads/2009/01/solution.png"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="244" alt="solution" src="http://blog.beigesunshine.com/wp-content/uploads/2009/01/solution-thumb.png" width="97" border="0" /></a></p>
<p>For now, let&#8217;s ignore the internal workings and focus on building it.</p>
<p>The build script looks like this:</p>
<div style="border-right: gray 1px solid; padding-right: 4px; border-top: gray 1px solid; padding-left: 4px; font-size: 8pt; padding-bottom: 4px; margin: 20px 0px 10px; overflow: auto; border-left: gray 1px solid; width: 97.5%; cursor: text; max-height: 200px; line-height: 12pt; padding-top: 4px; border-bottom: gray 1px solid; font-family: consolas, &#39;Courier New&#39;, courier, monospace; background-color: #f4f4f4">
<div style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"><span style="color: #606060">   1:</span> require <span style="color: #006080">'rubicant'</span></pre>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"><span style="color: #606060">   2:</span> require <span style="color: #006080">'configatron'</span></pre>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"><span style="color: #606060">   3:</span> include Rubicant</pre>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"><span style="color: #606060">   4:</span>&#160; </pre>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"><span style="color: #606060">   5:</span> BASE_DIR = File.expand_path(<span style="color: #006080">&quot;.&quot;</span>)</pre>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"><span style="color: #606060">   6:</span> SRC_DIR = <span style="color: #006080">&quot;#{BASE_DIR}/src&quot;</span></pre>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"><span style="color: #606060">   7:</span> SRC_APP_DIR = <span style="color: #006080">&quot;#{SRC_DIR}/app&quot;</span></pre>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"><span style="color: #606060">   8:</span> SRC_TEST_DIR = <span style="color: #006080">&quot;#{SRC_DIR}/test&quot;</span></pre>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"><span style="color: #606060">   9:</span> CONFIG_DIR = <span style="color: #006080">&quot;#{BASE_DIR}/config&quot;</span></pre>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"><span style="color: #606060">  10:</span> BUILD_DIR = <span style="color: #006080">&quot;#{BASE_DIR}/build&quot;</span></pre>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"><span style="color: #606060">  11:</span> DEPLOY_DIR = <span style="color: #006080">&quot;#{BASE_DIR}/deploy&quot;</span></pre>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"><span style="color: #606060">  12:</span> TOOLS_DIR = <span style="color: #006080">&quot;#{BASE_DIR}/tools&quot;</span></pre>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"><span style="color: #606060">  13:</span> MBUNIT_DIR = <span style="color: #006080">&quot;#{TOOLS_DIR}/mbunit&quot;</span></pre>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"><span style="color: #606060">  14:</span> RHINO_DIR = <span style="color: #006080">&quot;#{TOOLS_DIR}/rhino&quot;</span></pre>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"><span style="color: #606060">  15:</span>&#160; </pre>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"><span style="color: #606060">  16:</span> UI_SOURCES = FileList[<span style="color: #006080">&quot;#{SRC_APP_DIR}/Rubicant.Test.App.UI/**/*.cs&quot;</span>]</pre>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"><span style="color: #606060">  17:</span> ENGINE_SOURCES = FileList[<span style="color: #006080">&quot;#{SRC_APP_DIR}/Rubicant.Test.App.Engine/**/*.cs&quot;</span>]</pre>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"><span style="color: #606060">  18:</span> TEST_SOURCES = FileList[<span style="color: #006080">&quot;#{SRC_TEST_DIR}/**/*.cs&quot;</span>]</pre>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"><span style="color: #606060">  19:</span>&#160; </pre>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"><span style="color: #606060">  20:</span> #### Build Initialization</pre>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"><span style="color: #606060">  21:</span> task :initialize_build <span style="color: #0000ff">do</span></pre>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"><span style="color: #606060">  22:</span>     rm_rf BUILD_DIR <span style="color: #0000ff">if</span> File.exists?(BUILD_DIR)</pre>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"><span style="color: #606060">  23:</span>     mkdir_p BUILD_DIR</pre>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"><span style="color: #606060">  24:</span>     rm_rf DEPLOY_DIR <span style="color: #0000ff">if</span> File.exists?(DEPLOY_DIR)</pre>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"><span style="color: #606060">  25:</span>     mkdir_p DEPLOY_DIR</pre>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"><span style="color: #606060">  26:</span> end</pre>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"><span style="color: #606060">  27:</span>&#160; </pre>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"><span style="color: #606060">  28:</span> #### Loading Properties</pre>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"><span style="color: #606060">  29:</span> task :load_local_properties <span style="color: #0000ff">do</span></pre>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"><span style="color: #606060">  30:</span>     configatron.configure_from_yaml(<span style="color: #006080">&quot;local.properties.yml&quot;</span>)</pre>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"><span style="color: #606060">  31:</span> end</pre>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"><span style="color: #606060">  32:</span>&#160; </pre>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"><span style="color: #606060">  33:</span> task :load_test_properties <span style="color: #0000ff">do</span></pre>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"><span style="color: #606060">  34:</span>     configatron.configure_from_yaml(<span style="color: #006080">&quot;test.properties.yml&quot;</span>)</pre>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"><span style="color: #606060">  35:</span> end</pre>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"><span style="color: #606060">  36:</span>&#160; </pre>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"><span style="color: #606060">  37:</span> #### Deployment Targets</pre>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"><span style="color: #606060">  38:</span> task :deploy_local =&gt; [:load_local_properties, :deploy]</pre>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"><span style="color: #606060">  39:</span>&#160; </pre>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"><span style="color: #606060">  40:</span> task :deploy_test =&gt; [:load_test_properties, :deploy]</pre>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"><span style="color: #606060">  41:</span>&#160; </pre>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"><span style="color: #606060">  42:</span> task :deploy =&gt; [:test, :expand_app_config] <span style="color: #0000ff">do</span></pre>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"><span style="color: #606060">  43:</span>     cp FileList[<span style="color: #006080">&quot;#{BUILD_DIR}/{hello.exe,engine.dll}&quot;</span>], DEPLOY_DIR</pre>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"><span style="color: #606060">  44:</span> end</pre>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"><span style="color: #606060">  45:</span>&#160; </pre>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"><span style="color: #606060">  46:</span>&#160; </pre>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"><span style="color: #606060">  47:</span> #### Compile Targets</pre>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"><span style="color: #606060">  48:</span> csc :compile, [:initialize_build, :compile_engine], {:files =&gt; UI_SOURCES,</pre>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"><span style="color: #606060">  49:</span>                                                      :target =&gt; <span style="color: #006080">&quot;exe&quot;</span>,</pre>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"><span style="color: #606060">  50:</span>                                                      :<span style="color: #0000ff">out</span> =&gt; <span style="color: #006080">&quot;#{BUILD_DIR}/hello.exe&quot;</span>,</pre>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"><span style="color: #606060">  51:</span>                                                      :references =&gt; FileList[<span style="color: #006080">&quot;#{BUILD_DIR}/*.dll&quot;</span>] }</pre>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"><span style="color: #606060">  52:</span>                 </pre>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"><span style="color: #606060">  53:</span> csc :compile_engine, [], {:files =&gt; ENGINE_SOURCES,</pre>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"><span style="color: #606060">  54:</span>                           :target =&gt; <span style="color: #006080">&quot;library&quot;</span>,</pre>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"><span style="color: #606060">  55:</span>                           :<span style="color: #0000ff">out</span> =&gt; <span style="color: #006080">&quot;#{BUILD_DIR}/engine.dll&quot;</span>}</pre>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"><span style="color: #606060">  56:</span>                 </pre>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"><span style="color: #606060">  57:</span> #### Testing Targets                </pre>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"><span style="color: #606060">  58:</span> task :test =&gt; [:compile_tests, :run_tests]</pre>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"><span style="color: #606060">  59:</span>&#160; </pre>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"><span style="color: #606060">  60:</span> csc :compile_tests, [:compile], {:files =&gt; TEST_SOURCES,</pre>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"><span style="color: #606060">  61:</span>                                           :target =&gt; <span style="color: #006080">&quot;library&quot;</span>,</pre>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"><span style="color: #606060">  62:</span>                                           :<span style="color: #0000ff">out</span> =&gt; <span style="color: #006080">&quot;#{BUILD_DIR}/tests.dll&quot;</span>,</pre>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"><span style="color: #606060">  63:</span>                                           :references =&gt; FileList[<span style="color: #006080">&quot;#{BUILD_DIR}/**/*.{dll,exe}&quot;</span>, <span style="color: #006080">&quot;#{RHINO_DIR}/*.dll&quot;</span>, <span style="color: #006080">&quot;#{MBUNIT_DIR}/*.dll&quot;</span>]}</pre>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"><span style="color: #606060">  64:</span>&#160; </pre>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"><span style="color: #606060">  65:</span> task :run_tests <span style="color: #0000ff">do</span></pre>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"><span style="color: #606060">  66:</span>     mbunit(MBUNIT_DIR, BUILD_DIR, FileList[<span style="color: #006080">&quot;#{BUILD_DIR}/tests.dll&quot;</span>], {:assembly_path =&gt; FileList[<span style="color: #006080">&quot;#{BUILD_DIR}/engine.dll&quot;</span>, <span style="color: #006080">&quot;#{RHINO_DIR}/*.dll&quot;</span>].to_a})</pre>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"><span style="color: #606060">  67:</span> end</pre>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"><span style="color: #606060">  68:</span>&#160; </pre>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"><span style="color: #606060">  69:</span>&#160; </pre>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"><span style="color: #606060">  70:</span> #### App.config expansion</pre>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"><span style="color: #606060">  71:</span> task :expand_app_config <span style="color: #0000ff">do</span></pre>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"><span style="color: #606060">  72:</span>     expand_template <span style="color: #006080">&quot;#{CONFIG_DIR}/App.Config.template&quot;</span>, <span style="color: #006080">&quot;#{DEPLOY_DIR}/hello.exe.config&quot;</span></pre>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"><span style="color: #606060">  73:</span> end</pre>
</p></div>
</div>
<p>The point of this build file is to be able to churn out two different builds based on two different sets of properties. This is based off of my builds that I do at work where we need to deploy and test in a test environment before going into production. It would be as simple as adding a production.properties.yml and a deploy_production target to simulate this fully in this script.</p>
<p>So basically, we call deploy_test (or deploy_local), which in turn loads the test properties, and then the deploy task.</p>
<p>Deploy calls the test task, which builds the app, builds the tests, runs the tests. If any tests fail, the build will fail here, making sure we don&#8217;t deploy any code that doesn&#8217;t pass tests.</p>
<p>Finally, we expand our app.config in a way suitable for the environment we&#8217;re going into.</p>
<p>Finally, run the executable to see that it worked!</p>
<div style="border-right: gray 1px solid; padding-right: 4px; border-top: gray 1px solid; padding-left: 4px; font-size: 8pt; padding-bottom: 4px; margin: 20px 0px 10px; overflow: auto; border-left: gray 1px solid; width: 97.5%; cursor: text; max-height: 200px; line-height: 12pt; padding-top: 4px; border-bottom: gray 1px solid; font-family: consolas, &#39;Courier New&#39;, courier, monospace; background-color: #f4f4f4">
<div style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"><span style="color: #606060">   1:</span> E:\projects\Rubicant.Test.App&gt;deploy\hello.exe</pre>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"><span style="color: #606060">   2:</span> Hello, World! (Test Version)</pre>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"><span style="color: #606060">   3:</span>&#160; </pre>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"><span style="color: #606060">   4:</span> E:\projects\Rubicant.Test.App&gt;</pre>
</p></div>
</div>
<p>&#160;</p>
<p>You can download the source from <a title="http://blog.beigesunshine.com/wp-content/uploads/2009/01/rubicanttestapp.zip" href="http://blog.beigesunshine.com/wp-content/uploads/2009/01/rubicanttestapp.zip">http://blog.beigesunshine.com/wp-content/uploads/2009/01/rubicanttestapp.zip</a> and try it out for yourself. The default rakefile goes to an exe and an assembly. You can also run both deploy_local and deploy_test and create a single exe file by using rake -f rakefile_single_exe.rb deploy_local.</p>
<p>Coming up, a post on some of the specifics of rubicant.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.beigesunshine.com/2009/01/22/introducint-rubicant-part-2-a-sample-script/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Introducing rubicant</title>
		<link>http://blog.beigesunshine.com/2009/01/15/introducing-rubicant/</link>
		<comments>http://blog.beigesunshine.com/2009/01/15/introducing-rubicant/#comments</comments>
		<pubDate>Thu, 15 Jan 2009 16:04:08 +0000</pubDate>
		<dc:creator>mendicant</dc:creator>
				<category><![CDATA[.Net]]></category>
		<category><![CDATA[Build]]></category>
		<category><![CDATA[NAnt]]></category>
		<category><![CDATA[Rake]]></category>
		<category><![CDATA[Ruby]]></category>

		<guid isPermaLink="false">http://blog.beigesunshine.com/?p=64</guid>
		<description><![CDATA[Update: Don&#8217;t forget to check out Part 2 and Part 3. In previous&#160;posts I have mentioned that I think that there might be a better way to automate builds than NAnt. I also mentioned that I &#8230; <a class="more-link" href="http://blog.beigesunshine.com/2009/01/15/introducing-rubicant/">More<span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><strong>Update: </strong>Don&#8217;t forget to check out <a href="http://blog.beigesunshine.com/2009/01/22/introducint-rubicant-part-2-a-sample-script/">Part 2</a> and <a href="http://blog.beigesunshine.com/2009/01/22/introducing-rubicant-part-3-the-inner-workings/">Part 3</a>.</p>
<p>In <a href="http://blog.beigesunshine.com/2008/11/25/buildings-the-foundation/">previous</a>&#160;<a href="http://blog.beigesunshine.com/2008/11/25/more-on-builds/">posts</a> I have mentioned that I think that there might be a better way to automate builds than <a href="http://nant.sourceforge.net/">NAnt</a>. I also mentioned that I had looked at a few of them and been mostly underwhelmed. I&#8217;ve spent a large amount of time building a process for builds that works well for me and none of them seemed to erase my pains.</p>
<p>I also <a href="http://blog.beigesunshine.com/2008/12/20/procrastination-we-meet-again/">mentioned</a> that I would be working on some items that may even drive some content to this blog, among other things. Today, I introduce the fruits of my labour.</p>
<p>Please note that this is NOT recommended for any sort of production environment. It is currently at best a way to try out Rake on .Net projects.</p>
<h2>What is rubicant?</h2>
<p><a href="http://code.google.com/p/rubicant">rubicant</a> is my own personal set of tasks that sit on top of <a href="http://rake.rubyforge.org/">rake</a>, a rubyish interpretation of <a href="http://www.gnu.org/software/make/">make</a>. I&#8217;ve used ruby for some scripting in the past, and also used rake in a rails app that I developed. I felt that the combination of both would alleviate some of the pains that I (and I&#8217;m pretty sure I&#8217;m not alone here) feel when I use NAnt.</p>
<p>I was admittedly scared to even try building my own set of tasks, and actually didn&#8217;t even know where to start. I kept rolling the idea around. One day I was going to start doing it now. Then the next I wasn&#8217;t. As a father of young children my spare time is very limited and very few and far between, especially for something that would demand so much of it.</p>
<p>And then the I started coming across others experimenting with exactly what I was talking about. First it was a post by <a href="http://codebetter.com/blogs/david_laribee/archive/2008/08/25/omg-rake.aspx">Dave Laribee</a>, as well as <a href="http://hasno.info/2008/1/6/building-net-projects-with-rake">another post</a> in his comments. And now as I read over them again, I&#8217;m seeing that there&#8217;s <a href="http://neverrunwithscissors.com/blog/2008/12/25/i-never-want-to-see-xml-driven-build-scripts-again-now-that-ive-used-rake/">more</a> people feeling like I do. I started to google and found some great posts by <a href="http://blog.jayfields.com/2006/01/rake-nunit-task.html">Jay Fields</a> and to a lesser extent one by <a href="http://martinfowler.com/articles/rake.html">Martin Fowler</a>.</p>
<p>Anyway, in my looking it seemed like no one had actually put out a reusable library that anyone could just pick up and automatically compile a project within 5 minutes.</p>
<p>And thus, with some much needed inspiration from the above sources, <a href="http://code.google.com/p/rubicant">rubicant</a> was born.</p>
<h2>What isn&#8217;t rubicant?</h2>
<p>Well written for one thing. Take a look at my tests and they&#8217;re enough to make <a href="http://blog.scottbellware.com/">someone</a> blow a gasket <img src='http://blog.beigesunshine.com/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' />  (I kid, I LOVE his twitter rants) I started writing them thinking I knew what I was doing and let me clear something up for you. At the time, I had a greatly misguided view on BDD/Specification testing. Either way, it&#8217;s still got my code covered and has helped to drive out some of the design, especially when loading framework information.</p>
<p>Another thing it is not is a complete solution. I had 4 goals in functionality that I wanted. They were:</p>
<ol>
<ol>
<li>Build C# code </li>
<li>Test C# code (with MBUnit) </li>
<li>Copy selected files in a meaningful hierarchy </li>
<li>Template expansion using <a href="http://configatron.mackframework.com/">configatron</a> to allow for easy configuration swapping. </li>
</ol>
</ol>
<h2>Why rubicant?</h2>
<p>First off, automated builds are the only thing that I feel I truly have a grasp on. I feel comfortable enough in myself and my process that I could come up with something useful. I don&#8217;t think of myself as a guru, but I do know that I have a set of build scripts at work that are robust and involved while trying to stay (somewhat simple). In other words, I don&#8217;t consider myself a guru, but I do feel I have a grasp on the subject.</p>
<p>I was also feeling too much pain with NAnt. As well, I didn&#8217;t feel that any of the other solutions out there really felt like what I was looking for. I was also looking for a learning project in ruby. I wanted to try driving out a design via testing using ruby. A lot of things. Either way, I felt like I wanted to do something for myself, but that also might provide some sort of benefit to the community, even if it just ended up as a failed attempt. In a sentence: I wanted to try and provide SOMETHING back to a community that I feel has given me so much.</p>
<p>Even if this ends in failure, it&#8217;s been exactly the experience that I&#8217;ve wanted thus far, and though I&#8217;m sure I&#8217;m in for some rough waters ahead, I think that it will continue to drive me to learn, improve and better myself. Okay, so there is definitely some selfishness there, but hopefully you can forgive me in the name of <a href="http://en.wikipedia.org/wiki/Continuous_improvement">Continuous Improvement</a>, even if it&#8217;s my own.</p>
<h2>How do I get it? How do I use it?</h2>
<p>Well, if you want to get it, you can go to the <a href="http://code.google.com/p/rubicant">project site</a> on google code and download the source. There are instructions there on how to install it. As for how to use it&#8230; stay tuned for a sample project and build file. Hopefully very soon.</p>
<p>&#160;</p>
<p><strong>Update: </strong>Don&#8217;t forget to check out <a href="http://blog.beigesunshine.com/2009/01/22/introducint-rubicant-part-2-a-sample-script/">Part 2</a> and <a href="http://blog.beigesunshine.com/2009/01/22/introducing-rubicant-part-3-the-inner-workings/">Part 3</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.beigesunshine.com/2009/01/15/introducing-rubicant/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Building&#8217;s the Foundation</title>
		<link>http://blog.beigesunshine.com/2008/11/25/buildings-the-foundation/</link>
		<comments>http://blog.beigesunshine.com/2008/11/25/buildings-the-foundation/#comments</comments>
		<pubDate>Tue, 25 Nov 2008 14:00:16 +0000</pubDate>
		<dc:creator>mendicant</dc:creator>
				<category><![CDATA[.Net]]></category>
		<category><![CDATA[Build]]></category>
		<category><![CDATA[Continuous Integration]]></category>
		<category><![CDATA[NAnt]]></category>
		<category><![CDATA[Rake]]></category>
		<category><![CDATA[Ruby]]></category>

		<guid isPermaLink="false">http://blog.beigesunshine.com/2008/11/25/buildings-the-foundation/</guid>
		<description><![CDATA[&#160; Let me get this off my chest. I think about Build Scripts all the time. I spent the better part of the first 6 months at my current job migrating old legacy .Net 1.1 web &#8230; <a class="more-link" href="http://blog.beigesunshine.com/2008/11/25/buildings-the-foundation/">More<span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>&#160;</p>
<p>Let me get this off my chest. I think about Build Scripts all the time. I spent the better part of the first 6 months at my current job migrating old legacy .Net 1.1 web apps from&#160; <a href="http://en.wikipedia.org/wiki/Concurrent_Versions_System">CVS</a> to .Net 2.0 and <a href="http://subversion.tigris.org/">Subversion</a>. Part of that included migrating the projects from CVS to SVN, then taking the old projects and migrating those into our current directory structure for projects. After that, I had to template the config files and create build scripts that could build a local, test or production version of an app with a single command.</p>
<p>During the course of this, I used <a href="http://www.microsoft.com/windowsserver2003/technologies/management/powershell/default.mspx">PowerShell</a>, <a href="http://www.ruby-lang.org">Ruby</a> and of course, <a href="http://nant.sourceforge.net/">NAnt</a>.</p>
<p>I found that, like many things, I was able to find some things I loved about all of them. And lots of things I hated about most of them. PowerShell, for one, has some great ideas in it. It&#8217;s truly a good idea. I love the idea of being able to leverage the .Net Framework from my scripts. It really is a good idea. But after the few scripts that I wrote in PowerShell, I don&#8217;t think that I could use it again. I found the syntax either annoying or clunky the whole time. Especially once I started writing the scripts in Ruby.</p>
<p>Now Ruby I have some experience in as I&#8217;ve done a bit of <a href="http://www.rubyonrails.org/">Rails</a> development. Lots of the notations I like. I have some difficulty in using a dynamic language at times, most notably I find myself missing method signatures that are strongly typed. However, the annoyances are small, and mostly come in the form of me running into issues with working with the file system. I think those annoyances mostly come from me not fully understanding some of the intricacies of working with the filesystem on windows with ruby.</p>
<p>I find the biggest difference between the two is how easy it is to use Ruby from within a <a href="http://www.cygwin.com/">CygWin</a>&#160;<a href="http://www.gnu.org/software/bash/">Bash</a> shell. I&#8217;ve been a longtime <a href="http://www.gentoo.org">linux</a> user, and actually my first unix-like operating system that I used at home was <a href="http://www.freebsd.org/">FreeBSD</a>. Because of FreeBSD, I was a long time user of <a href="http://www.tcsh.org/">tcsh</a>. In fact, it was less than a year ago that I finally made the move over to bash. Either way, both of these shells provide power, ease of use and so many advantages that I can&#8217;t believe that Microsoft doesn&#8217;t have them in any of it&#8217;s shells. I mean seriously, how does anyone live without a searchable <a href="http://blog.macromates.com/2008/working-with-history-in-bash/">history</a> in a command prompt?</p>
<p>And this brings us to NAnt. I was in love with NAnt when I first started. It was great to use, simple and it could do <a href="http://nant.sourceforge.net/release/0.85/help/tasks/">so</a>&#160;<a href="http://nant.sourceforge.net/release/0.85/help/functions/index.html">much</a>. But I started to find myself hitting situations where things would become very murky and difficult to keep track of where things were happening, especially when I tried to make things generic so they could be called in many places. For example, here is how a template file is expanded in our code:</p>
<div style="border-right: gray 1px solid; padding-right: 4px; border-top: gray 1px solid; padding-left: 4px; font-size: 8pt; padding-bottom: 4px; margin: 20px 0px 10px; overflow: auto; border-left: gray 1px solid; width: 97.5%; cursor: text; max-height: 200px; line-height: 12pt; padding-top: 4px; border-bottom: gray 1px solid; font-family: consolas, &#39;Courier New&#39;, courier, monospace; background-color: #f4f4f4">
<div style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"><span style="color: #606060">   1:</span> <span style="color: #0000ff">&lt;</span><span style="color: #800000">target</span> <span style="color: #ff0000">name</span><span style="color: #0000ff">=&quot;expand.template.file&quot;</span><span style="color: #0000ff">&gt;</span></pre>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"><span style="color: #606060">   2:</span>     <span style="color: #0000ff">&lt;</span><span style="color: #800000">copy</span> <span style="color: #ff0000">file</span><span style="color: #0000ff">=&quot;${template.file}.template&quot;</span> <span style="color: #ff0000">tofile</span><span style="color: #0000ff">=&quot;${template.file}&quot;</span> <span style="color: #ff0000">overwrite</span><span style="color: #0000ff">=&quot;true&quot;</span><span style="color: #0000ff">&gt;</span></pre>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"><span style="color: #606060">   3:</span>         <span style="color: #0000ff">&lt;</span><span style="color: #800000">filterchain</span><span style="color: #0000ff">&gt;</span></pre>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"><span style="color: #606060">   4:</span>             <span style="color: #0000ff">&lt;</span><span style="color: #800000">replacetokens</span><span style="color: #0000ff">&gt;</span></pre>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"><span style="color: #606060">   5:</span>                 ....lots of tokens...</pre>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"><span style="color: #606060">   6:</span>             <span style="color: #0000ff">&lt;/</span><span style="color: #800000">replacetokens</span><span style="color: #0000ff">&gt;</span></pre>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"><span style="color: #606060">   7:</span>         <span style="color: #0000ff">&lt;/</span><span style="color: #800000">filterchain</span><span style="color: #0000ff">&gt;</span></pre>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"><span style="color: #606060">   8:</span>     <span style="color: #0000ff">&lt;/</span><span style="color: #800000">copy</span><span style="color: #0000ff">&gt;</span></pre>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"><span style="color: #606060">   9:</span> <span style="color: #0000ff">&lt;/</span><span style="color: #800000">target</span><span style="color: #0000ff">&gt;</span></pre>
</p></div>
</div>
<p>&#160;</p>
<p>But where does ${template.file} get set? Why, the line before we call expand.template.file of course!</p>
<div style="border-right: gray 1px solid; padding-right: 4px; border-top: gray 1px solid; padding-left: 4px; font-size: 8pt; padding-bottom: 4px; margin: 20px 0px 10px; overflow: auto; border-left: gray 1px solid; width: 97.5%; cursor: text; max-height: 200px; line-height: 12pt; padding-top: 4px; border-bottom: gray 1px solid; font-family: consolas, &#39;Courier New&#39;, courier, monospace; background-color: #f4f4f4">
<div style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"><span style="color: #606060">   1:</span> <span style="color: #0000ff">&lt;</span><span style="color: #800000">property</span> <span style="color: #ff0000">name</span><span style="color: #0000ff">=&quot;template.file&quot;</span> <span style="color: #ff0000">value</span><span style="color: #0000ff">=&quot;${some.dir}\app.config&quot;</span><span style="color: #0000ff">/&gt;</span></pre>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"><span style="color: #606060">   2:</span> <span style="color: #0000ff">&lt;</span><span style="color: #800000">call</span> <span style="color: #ff0000">target</span><span style="color: #0000ff">=&quot;expand.template.file&quot;</span> <span style="color: #0000ff">/&gt;</span></pre>
</p></div>
</div>
<p>&#160;</p>
<p>I just find that this can be confusing, especially to newcomers who don&#8217;t know which targets act as functions. I know that you could do a search through the code and find it, but it&#8217;s just not as clean or explicit as something like:</p>
<div style="border-right: gray 1px solid; padding-right: 4px; border-top: gray 1px solid; padding-left: 4px; font-size: 8pt; padding-bottom: 4px; margin: 20px 0px 10px; overflow: auto; border-left: gray 1px solid; width: 97.5%; cursor: text; max-height: 200px; line-height: 12pt; padding-top: 4px; border-bottom: gray 1px solid; font-family: consolas, &#39;Courier New&#39;, courier, monospace; background-color: #f4f4f4">
<div style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"><span style="color: #606060">   1:</span> expandTemplate(filename)</pre>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"><span style="color: #606060">   2:</span>&#160; </pre>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"><span style="color: #606060">   3:</span> def expandTemplate(filename)</pre>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"><span style="color: #606060">   4:</span>     ...expand <span style="color: #0000ff">in</span> here...</pre>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"><span style="color: #606060">   5:</span> end</pre>
</p></div>
</div>
<p>&#160;</p>
<p>So I think that you can see where I&#8217;m going with this. After a while of doing this, I started to think a lot about <a href="http://www.railsenvy.com/2007/6/11/ruby-on-rails-rake-tutorial">Rake</a>. After all, I had used it in Rails projects previously. As you can tell, I&#8217;m quite a fan of Ruby. After a while, things began to cool off. I had gotten almost all of our projects converted and I wasn&#8217;t writing build files as much anymore. But I kept on thinking about it. Recently, I&#8217;ve been writing build files again. I&#8217;ve also been reading that I&#8217;m not the only person who feels this way.</p>
<p>I&#8217;ve noticed a few projects that seem to be reaching for what I want. There&#8217;s <a href="http://ayende.com/Blog/archive/2007/09/22/Introducing-Boobs-Boo-Build-System.aspx">Boo Build System</a> (and yes, it is shortened to BooBS. Nice work Ayende), <a href="http://codebetter.com/blogs/james.kovacs/archive/2008/06/27/introducing-psake.aspx">PSake</a> (which <a href="http://jpboodhoo.com">JP</a> seems to have <a href="http://blog.jpboodhoo.com/InterestedInTradingInYourNAntBuildsATeaser.aspx">picked up</a>) and then there&#8217;s Rake. Rake seems to be the only one that isn&#8217;t geared towards some sort of .Net problem (not that it can&#8217;t). It turns out that though there was a lot of hype around boo a while back, I just don&#8217;t think it&#8217;s something I&#8217;m up for learning just yet. And as for PSake, I downloaded the source and nothing against James (it&#8217;s not his fault, it&#8217;s the syntax!) I barely made it through the first PS1 file before my head hurt and I remembered why I stopped writing PowerShell scripts in the first place.</p>
<p>That leaves me with Rake. And it seems like I&#8217;m <a href="http://codebetter.com/blogs/david_laribee/archive/2008/10/17/transitioning-from-nant-to-rake.aspx">not</a>&#160;<a href="http://hasno.info/2008/1/6/building-net-projects-with-rake">the</a>&#160;<a href="http://weblogs.asp.net/bsimser/archive/2008/08/17/alt-net-canada-day-2-noah-build-me-an-ark.aspx">only</a>&#160;<a href="http://blog.jayfields.com/2006/01/i-prefer-rake-to-nant-1.html">one</a>. The only difference is that I would absolutely love to see a <a href="http://www.rubygems.org/">Gem</a> built with some custom .Net tasks for rake. This is something that I&#8217;ve been seriously contemplating putting some time into, but haven&#8217;t fully explored yet. Most notably, I would like to take the syntax of: </p>
<div style="border-right: gray 1px solid; padding-right: 4px; border-top: gray 1px solid; padding-left: 4px; font-size: 8pt; padding-bottom: 4px; margin: 20px 0px 10px; overflow: auto; border-left: gray 1px solid; width: 97.5%; cursor: text; max-height: 200px; line-height: 12pt; padding-top: 4px; border-bottom: gray 1px solid; font-family: consolas, &#39;Courier New&#39;, courier, monospace; background-color: #f4f4f4">
<div style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"><span style="color: #606060">   1:</span> require <span style="color: #006080">'lib/nunittask'</span></pre>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"><span style="color: #606060">   2:</span>&#160; </pre>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"><span style="color: #606060">   3:</span> Rake::NUnit.<span style="color: #0000ff">new</span> <span style="color: #0000ff">do</span> |nunit|</pre>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"><span style="color: #606060">   4:</span>   nunit.library = <span style="color: #006080">&quot;foo.dll&quot;</span></pre>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"><span style="color: #606060">   5:</span> end</pre>
</p></div>
</div>
<p>&#160;</p>
<p>And replace it with something along the lines of:</p>
<div style="border-right: gray 1px solid; padding-right: 4px; border-top: gray 1px solid; padding-left: 4px; font-size: 8pt; padding-bottom: 4px; margin: 20px 0px 10px; overflow: auto; border-left: gray 1px solid; width: 97.5%; cursor: text; max-height: 200px; line-height: 12pt; padding-top: 4px; border-bottom: gray 1px solid; font-family: consolas, &#39;Courier New&#39;, courier, monospace; background-color: #f4f4f4">
<div style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"><span style="color: #606060">   1:</span> require <span style="color: #006080">'lib/nunittask'</span></pre>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"><span style="color: #606060">   2:</span>&#160; </pre>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &#39;Courier New&#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"><span style="color: #606060">   3:</span> nunit :test, :library =&gt; <span style="color: #006080">'foo.dll', :depends =&gt; [:load_properties, :compile]</span></pre>
</p></div>
</div>
<p>&#160;</p>
<p>I get the feeling that this could be wrapped up in a function which could use Hash which could hide away the nastiness of Rake::Task.new do |task| block and take these scripts to an entirely new level. I&#8217;m not entirely sure how the naming would work, but I&#8217;m sure it would.</p>
<p>After writing this, I think I&#8217;m going to start taking a much closer look. Has anyone heard of anything like this in the works/already released?</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.beigesunshine.com/2008/11/25/buildings-the-foundation/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

