<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://devlicio.us/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Rob Reynolds - The Fervent Coder : UppercuT, Development</title><link>http://devlicio.us/blogs/rob_reynolds/archive/tags/UppercuT/Development/default.aspx</link><description>Tags: UppercuT, Development</description><dc:language>en</dc:language><generator>CommunityServer 2008.5 SP1 (Build: 31106.3070)</generator><item><title>AppHarbor - Azure Done Right AKA Heroku for .NET</title><link>http://devlicio.us/blogs/rob_reynolds/archive/2011/02/16/appharbor-azure-done-right-aka-heroku-for-net.aspx</link><pubDate>Wed, 16 Feb 2011 12:49:23 GMT</pubDate><guid isPermaLink="false">40756a8b-6212-4073-9d98-6c26781577de:66401</guid><dc:creator>Rob Reynolds</dc:creator><slash:comments>3</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://devlicio.us/blogs/rob_reynolds/rsscomments.aspx?PostID=66401</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://devlicio.us/blogs/rob_reynolds/commentapi.aspx?PostID=66401</wfw:comment><comments>http://devlicio.us/blogs/rob_reynolds/archive/2011/02/16/appharbor-azure-done-right-aka-heroku-for-net.aspx#comments</comments><description>&lt;blockquote&gt;   &lt;p&gt;&lt;strong&gt;Easy and Instant deployments and instant scale for .NET?&lt;/strong&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Awhile back a &lt;a href="http://groups.google.com/group/nu-net" target="_blank"&gt;few of us&lt;/a&gt; were looking at &lt;a href="http://rubygems.org/" target="_blank"&gt;Ruby Gems&lt;/a&gt; as the answer to &lt;a href="http://devlicio.us/blogs/rob_reynolds/archive/2010/07/15/gems-package-management-for-net.aspx" target="_blank"&gt;package management for .NET&lt;/a&gt;. The gems platform supported the concept of DLLs as packages although some changes would have needed to happen to have long term use for the entire community. From that we formed a partnership with some folks at Microsoft to make v2 into something that would meet &lt;a href="http://devlicio.us/blogs/rob_reynolds/archive/2010/10/06/the-evolution-of-package-management-for-net.aspx" target="_blank"&gt;wider adoption across the community&lt;/a&gt;, which people now call &lt;a href="http://nuget.codeplex.com/" target="_blank"&gt;NuGet&lt;/a&gt;. So now we have the concept of package management. What comes next?&lt;/p&gt;  &lt;h4&gt;&lt;u&gt;Heroku&lt;/u&gt;&lt;/h4&gt;  &lt;p&gt;&lt;strong&gt;Instant deployments and instant scaling. Stupid simple API.&lt;/strong&gt; This is &lt;a href="http://heroku.com/" target="_blank"&gt;Heroku&lt;/a&gt;. It doesn’t sound like much, but when you think of how fast you can go from an idea to having someone else tinker with it, you can start to see its power. In literally seconds you can be looking at your rails application deployed and online. Then when you are ready to scale, you can do that. This is power. Some may call this “cloud-computing” or &lt;a href="http://en.wikipedia.org/wiki/Platform_as_a_service" target="_blank"&gt;PaaS&lt;/a&gt; (Platform as a Service).&lt;/p&gt;  &lt;p&gt;I first ran into Heroku back in July when I met &lt;a href="http://litanyagainstfear.com/" target="_blank"&gt;Nick&lt;/a&gt; of &lt;a href="http://rubygems.org/" target="_blank"&gt;RubyGems.org&lt;/a&gt;. At the time there was no alternative in the .NET-o-sphere. I don’t count &lt;a href="http://www.microsoft.com/windowsazure/" target="_blank"&gt;Windows Azure&lt;/a&gt;, mostly because it is not simple and I don’t believe there is a free version. Heroku itself would not lend itself well to .NET due to the nature of platforms and each language’s specific needs (solution stack).&amp;#160; So I tucked the idea in the back of my head and moved on. &lt;/p&gt;  &lt;h4&gt;&lt;u&gt;AppHarbor Enters The Scene&lt;/u&gt;&lt;/h4&gt;  &lt;p&gt;&lt;a href="http://devlicio.us/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rob_5F00_reynolds/image_5F00_14CF6EF3.png"&gt;&lt;img style="background-image:none;border-right-width:0px;padding-left:0px;padding-right:0px;display:inline;float:right;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;padding-top:0px;" title="image" border="0" alt="image" align="right" src="http://devlicio.us/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rob_5F00_reynolds/image_5F00_thumb_5F00_7D54BAC1.png" width="244" height="184" /&gt;&lt;/a&gt;I’m not sure when I first heard about &lt;a href="http://appharbor.com/" target="_blank"&gt;AppHarbor&lt;/a&gt; as a possible .NET version of Heroku. It may have been in November, but I didn’t actually try it until January. I was instantly hooked. AppHarbor is awesome! It still has a ways to go to be considered Heroku for .NET, but it already has a growing community. I created a video series (at the bottom of this post) that really highlights how fast you can get a product onto the web and really shows the power and simplicity of AppHarbor. &lt;/p&gt;  &lt;p&gt;Deploying is as simple as a git/hg push to appharbor. From there they build your code, run any unit tests you have and deploy it if everything succeeds. The screen on the right shows a simple and elegant UI to getting things done.&lt;/p&gt;  &lt;p&gt;The folks at AppHarbor graciously gave me a limited number of invites to hand out. If you are itching to try AppHarbor then navigate to: &lt;a title="new-inviteCode=ferventcoder" href="https://appharbor.com/account/new?inviteCode=ferventcoder"&gt;https://appharbor.com/account/new?inviteCode=ferventcoder&lt;/a&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;After playing with it, send &lt;a href="http://feedback.appharbor.com/forums/95687-general"&gt;feedback&lt;/a&gt; if you want more features. Go vote up &lt;a href="http://feedback.appharbor.com/forums/95687-general/suggestions/1380047-gem-command-line-application?ref=title"&gt;two&lt;/a&gt; &lt;a href="http://feedback.appharbor.com/forums/95687-general/suggestions/1377701-migrations?ref=title"&gt;features&lt;/a&gt; I want that will make it more like Heroku.&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;Disclaimer: I am in no way affiliated with AppHarbor and have not received any funds or favors from anyone at AppHarbor. I just think it is awesome and I want others to know about it.&lt;/p&gt; &lt;/blockquote&gt;  &lt;h4&gt;&lt;u&gt;From Zero To Deployed in 15 Minutes (Or Less)&lt;/u&gt;&lt;/h4&gt;  &lt;p&gt;Now I have a challenge for you. I created a video series showing how fast I could go from nothing to a deployed application. It could have been from Zero to Deployed in Less than 5 minutes, but I wanted to show you the tools a little more and give you an opportunity to beat my time.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;And that’s the challenge. Beat my time and show it in a video response.&lt;/strong&gt; The video series is below (at least one of the videos has to be watched on YouTube). The person with the best time by March 15th @ 11:59PM CST will receive a prize.&lt;/p&gt;  &lt;p&gt;Ground rules: &lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;.NET Application with a valid database connection &lt;/li&gt;    &lt;li&gt;Start from Zero &lt;/li&gt;    &lt;li&gt;Deployed with AppHarbor or an alternative &lt;/li&gt;    &lt;li&gt;A timer displayed in the video that runs during the entire process &lt;/li&gt;    &lt;li&gt;Video response published on YouTube or acceptable alternative &lt;/li&gt;    &lt;li&gt;Video(s) must be published by March 15th at 11:59PM CST.&lt;/li&gt;    &lt;li&gt;Either post the link here as a comment or on YouTube as a response (also by 11:59PM CST March 15th)&lt;/li&gt; &lt;/ul&gt;    &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:5737277B-5D6D-4f48-ABFC-DD9C333F4C5D:e1a3d5a5-c97b-4a35-911e-8b2163418dc8" class="wlWriterEditableSmartContent"&gt;&lt;div&gt;&lt;a href="http://www.youtube.com/watch?v=cZIUVfHWsbc" target="_new"&gt;&lt;img src="http://devlicio.us/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rob_5F00_reynolds/video454d0754bef1_5F00_566840DC.jpg" style="border-style:none;" alt="" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="width:448px;clear:both;font-size:.8em;"&gt;From Zero To Deployed In 15 Minutes (Or Less) Part 1&lt;/div&gt;&lt;/div&gt;      &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:5737277B-5D6D-4f48-ABFC-DD9C333F4C5D:9bf5acc4-7735-4b63-a773-6448d28ba476" class="wlWriterEditableSmartContent"&gt;&lt;div&gt;&lt;a href="http://www.youtube.com/watch?v=l7WluaXIya0" target="_new"&gt;&lt;img src="http://devlicio.us/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rob_5F00_reynolds/videoffb63c9cfc3e_5F00_1BA09806.jpg" style="border-style:none;" alt="" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="width:448px;clear:both;font-size:.8em;"&gt;From Zero To Deployed In 15 Minutes (Or Less) Part 2&lt;/div&gt;&lt;/div&gt;      &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:5737277B-5D6D-4f48-ABFC-DD9C333F4C5D:18da1711-02ee-4953-ba19-2ce35e8f4bf5" class="wlWriterEditableSmartContent"&gt;&lt;div&gt;&lt;a href="http://www.youtube.com/watch?v=IqPh7wbWsLc" target="_new"&gt;&lt;img src="http://devlicio.us/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rob_5F00_reynolds/video8c3ef0b1b950_5F00_5306A934.jpg" style="border-style:none;" alt="" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="width:448px;clear:both;font-size:.8em;"&gt;From Zero To Deployed In 15 Minutes (Or Less) Part 3&lt;/div&gt;&lt;/div&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://devlicio.us/aggbug.aspx?PostID=66401" width="1" height="1"&gt;</description><category domain="http://devlicio.us/blogs/rob_reynolds/archive/tags/NHibernate/default.aspx">NHibernate</category><category domain="http://devlicio.us/blogs/rob_reynolds/archive/tags/Fluent+NHibernate/default.aspx">Fluent NHibernate</category><category domain="http://devlicio.us/blogs/rob_reynolds/archive/tags/RoundhousE/default.aspx">RoundhousE</category><category domain="http://devlicio.us/blogs/rob_reynolds/archive/tags/HowTo/default.aspx">HowTo</category><category domain="http://devlicio.us/blogs/rob_reynolds/archive/tags/UppercuT/default.aspx">UppercuT</category><category domain="http://devlicio.us/blogs/rob_reynolds/archive/tags/Development/default.aspx">Development</category><category domain="http://devlicio.us/blogs/rob_reynolds/archive/tags/Git/default.aspx">Git</category><category domain="http://devlicio.us/blogs/rob_reynolds/archive/tags/Tools/default.aspx">Tools</category><category domain="http://devlicio.us/blogs/rob_reynolds/archive/tags/.NET/default.aspx">.NET</category><category domain="http://devlicio.us/blogs/rob_reynolds/archive/tags/Agile/default.aspx">Agile</category><category domain="http://devlicio.us/blogs/rob_reynolds/archive/tags/Gems/default.aspx">Gems</category><category domain="http://devlicio.us/blogs/rob_reynolds/archive/tags/Challenge/default.aspx">Challenge</category></item><item><title>UppercuT v1.2–NuGet Support</title><link>http://devlicio.us/blogs/rob_reynolds/archive/2011/01/23/uppercut-v1-2-nuget-support.aspx</link><pubDate>Mon, 24 Jan 2011 02:18:57 GMT</pubDate><guid isPermaLink="false">40756a8b-6212-4073-9d98-6c26781577de:64799</guid><dc:creator>Rob Reynolds</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://devlicio.us/blogs/rob_reynolds/rsscomments.aspx?PostID=64799</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://devlicio.us/blogs/rob_reynolds/commentapi.aspx?PostID=64799</wfw:comment><comments>http://devlicio.us/blogs/rob_reynolds/archive/2011/01/23/uppercut-v1-2-nuget-support.aspx#comments</comments><description>&lt;p&gt;&lt;a href="http://devlicio.us/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rob_5F00_reynolds/nuget_2D00_229x64_5F00_20C99BC9.png"&gt;&lt;img style="background-image:none;border-right-width:0px;margin:0px 0px 5px 5px;padding-left:0px;padding-right:0px;display:inline;float:right;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;padding-top:0px;" title="NuGet beeaches! NuGet-ty goodness yo! Get your package here!" border="0" alt="NuGet" align="right" src="http://devlicio.us/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rob_5F00_reynolds/nuget_2D00_229x64_5F00_thumb_5F00_7FD62921.png" width="233" height="68" /&gt;&lt;/a&gt;&lt;a href="http://devlicio.us/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rob_5F00_reynolds/UppercuT_5F00_Logo_5F00_medium_5F00_5EE2B67A.jpg"&gt;&lt;img style="background-image:none;border-right-width:0px;margin:0px 5px 5px 0px;padding-left:0px;padding-right:0px;display:inline;float:left;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;padding-top:0px;" title="UppercuT beeaches! Freakin conventional automated builds yo!" border="0" alt="UppercuT_Logo_medium" align="left" src="http://devlicio.us/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rob_5F00_reynolds/UppercuT_5F00_Logo_5F00_medium_5F00_thumb_5F00_7072A145.jpg" width="204" height="147" /&gt;&lt;/a&gt;For those that have not yet heard, &lt;a href="http://nuget.codeplex.com/" target="_blank"&gt;NuGet&lt;/a&gt; &lt;a href="http://weblogs.asp.net/scottgu/archive/2011/01/13/announcing-release-of-asp-net-mvc-3-iis-express-sql-ce-4-web-farm-framework-orchard-webmatrix.aspx" target="_blank"&gt;went v1 recently&lt;/a&gt; along with a whole slew of tools from the Microsoft folks. I’ve been lucky to be a part of the NuGet project and see it take shape over the past few months with community input and contributions. Even though v1.0 was released, we are already moving forward with getting ideas and prioritizing features for the next version.&lt;/p&gt;  &lt;p&gt;To follow the announcement, &lt;a href="http://projectuppercut.org/" target="_blank"&gt;UppercuT&lt;/a&gt; (UC) v1.2 now includes support for NuGet out of the box. Plus, it will handle versioning the nuspec file for you, a highly requested feature for those that worked with other package managers.&lt;/p&gt;  &lt;h4&gt;&lt;u&gt;UppercuT + NuGet == Can Packaging Get Any Easier?&lt;/u&gt;&lt;/h4&gt;  &lt;p&gt;It can. UC exists to take the pains out of builds. To go from zero to your first NuGet package with the goodness of UC, just read on and follow the directions. If you are already creating nuget packages, UC can help update the version in the nuspec for you automatically. Read on…&lt;/p&gt;  &lt;h5&gt;Upgrading?&lt;/h5&gt;  &lt;p&gt;1. For those upgrading, you bring over the entire contents of the build directory like before. Please see the &lt;a href="http://code.google.com/p/uppercut/downloads" target="_blank"&gt;downloads&lt;/a&gt; (or the &lt;a href="http://code.google.com/p/uppercut/source/browse/trunk/README.markdown#57" target="_blank"&gt;ReadMe ReleaseNotes section&lt;/a&gt;) for any items you need to change between your previous version and the latest version of UC you are downloading.&lt;/p&gt;  &lt;p&gt;2. You will want to add the following to your UppercuT.config file:&lt;/p&gt;  &lt;pre class="xml" name="code"&gt;&amp;lt;property name=&amp;quot;app.nuget&amp;quot; value=&amp;quot;..${path.separator}${folder.references}${path.separator}NuGet${path.separator}NuGet.exe&amp;quot; overwrite=&amp;quot;false&amp;quot; /&amp;gt;&lt;/pre&gt;

&lt;p&gt;&lt;a href="http://devlicio.us/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rob_5F00_reynolds/image_5F00_1668519C.png"&gt;&lt;img style="background-image:none;border-right-width:0px;padding-left:0px;padding-right:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;padding-top:0px;" title="app.nuget location in uppercut.config" border="0" alt="uppercut.config setting" src="http://devlicio.us/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rob_5F00_reynolds/image_5F00_thumb_5F00_79EB5FBB.png" width="644" height="57" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;2. Include the NuGet folder in your lib directory from the UC distribution (or get the latest NuGet.exe and drop it in a NuGet folder under lib):&lt;/p&gt;

&lt;p&gt;&lt;a href="http://devlicio.us/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rob_5F00_reynolds/image_5F00_14B785C8.png"&gt;&lt;img style="background-image:none;border-right-width:0px;padding-left:0px;padding-right:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;padding-top:0px;" title="lib/NuGet" border="0" alt="lib/NuGet" src="http://devlicio.us/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rob_5F00_reynolds/image_5F00_thumb_5F00_7E153780.png" width="305" height="215" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;3. Add the nuget directory at your top level (next to the build.bat file) from the UC distribution:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://devlicio.us/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rob_5F00_reynolds/image_5F00_75452F34.png"&gt;&lt;img style="background-image:none;border-right-width:0px;padding-left:0px;padding-right:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;padding-top:0px;" title="nuget folder" border="0" alt="nuget folder" src="http://devlicio.us/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rob_5F00_reynolds/image_5F00_thumb_5F00_427528C0.png" width="215" height="197" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h5&gt;New to Uppercut?&lt;/h5&gt;

&lt;p&gt;1. There is a nice &lt;a href="http://uppercut.pbworks.com/w/page/9022444/HowToUse" target="_blank"&gt;write up&lt;/a&gt; on how to get UC set up on your project in less than 5 minutes (or you can try the &lt;a href="http://projectuppercut.org/" target="_blank"&gt;gems approach&lt;/a&gt;)! It really shows how little is needed to get a fully conventional build with the ability to upgrade in seconds instead of hours for your builds.&lt;/p&gt;

&lt;h4&gt;&lt;u&gt;Getting Some Nuget-ty Goodness To Your Builds&lt;/u&gt;&lt;/h4&gt;

&lt;p&gt;1. Head into the top level &lt;strong&gt;nuget&lt;/strong&gt; folder. Rename the __NAME__.nuspec file to the name of your nugget (most likely your project name if there are no other packages named the same). Here we are working with &lt;a href="http://sidepop.googlecode.com" target="_blank"&gt;SidePOP&lt;/a&gt;, so I named it sidepop.nuspec.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://devlicio.us/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rob_5F00_reynolds/image_5F00_6F8A158E.png"&gt;&lt;img style="background-image:none;border-right-width:0px;padding-left:0px;padding-right:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;padding-top:0px;" title="rename the __NAME__.nuspec" border="0" alt="rename the __NAME__.nuspec" src="http://devlicio.us/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rob_5F00_reynolds/image_5F00_thumb_5F00_07414CF5.png" width="316" height="181" /&gt;&lt;/a&gt;&amp;#160;&amp;#160; &lt;a href="http://devlicio.us/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rob_5F00_reynolds/image_5F00_710B31A2.png"&gt;&lt;img style="background-image:none;border-right-width:0px;padding-left:0px;padding-right:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;padding-top:0px;" title="Renamed __NAME__.nuspec to sidepop.nuspec" border="0" alt="sidepop.nuspec" src="http://devlicio.us/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rob_5F00_reynolds/image_5F00_thumb_5F00_5083F1F0.png" width="143" height="65" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;2. Let’s open that file and take a look.&lt;/p&gt;

&lt;pre class="xml" name="code"&gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot;?&amp;gt;
&amp;lt;package xmlns:xsi=&amp;quot;http://www.w3.org/2001/XMLSchema-instance&amp;quot; xmlns:xsd=&amp;quot;http://www.w3.org/2001/XMLSchema&amp;quot;&amp;gt;
  &amp;lt;metadata&amp;gt;
    &amp;lt;id&amp;gt;__REPLACE__&amp;lt;/id&amp;gt;
    &amp;lt;version&amp;gt;DO_NOT_EDIT&amp;lt;/version&amp;gt;
    &amp;lt;authors&amp;gt;__REPLACE__&amp;lt;/authors&amp;gt;
    &amp;lt;owners&amp;gt;__REPLACE__&amp;lt;/owners&amp;gt;
    &amp;lt;summary&amp;gt;__REPLACE__&amp;lt;/summary&amp;gt;
    &amp;lt;description&amp;gt;__REPLACE__&amp;lt;/description&amp;gt;
    &amp;lt;!--&amp;lt;projectUrl&amp;gt;__REPLACE__&amp;lt;/projectUrl&amp;gt;
    &amp;lt;licenseUrl&amp;gt;__REPLACE__&amp;lt;/licenseUrl&amp;gt;
    &amp;lt;requireLicenseAcceptance&amp;gt;false&amp;lt;/requireLicenseAcceptance&amp;gt;
    &amp;lt;tags&amp;gt;space delimited&amp;lt;/tags&amp;gt;
    &amp;lt;iconUrl&amp;gt;32x32.png&amp;lt;/iconUrl&amp;gt;
    &amp;lt;dependencies&amp;gt;
      &amp;lt;dependency id=&amp;quot;something&amp;quot; version=&amp;quot;1.0.0.0&amp;quot; /&amp;gt;
    &amp;lt;/dependencies&amp;gt;--&amp;gt;
  &amp;lt;/metadata&amp;gt;
&amp;lt;/package&amp;gt;&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;NOTE: &lt;/strong&gt;Notice the metadata attribute doesn’t have the xmlns in it (xmlns=&amp;quot;http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd&amp;quot;). This needs to be removed for xpath to be able to replace the version. If you are bringing an existing nuspec in, you will want to remove that.&lt;/p&gt;

&lt;p&gt;3. Look how most things say __REPLACE__. The version attribute does not. Do not edit version (if you do, it will just be replaced during the build). &lt;/p&gt;

&lt;p&gt;4. Let’s set up the nuspec for SidePOP. SidePOP has a dependency on log4net version 1.2.10.&lt;/p&gt;

&lt;pre class="xml" name="code"&gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot;?&amp;gt;
&amp;lt;package xmlns:xsi=&amp;quot;http://www.w3.org/2001/XMLSchema-instance&amp;quot; xmlns:xsd=&amp;quot;http://www.w3.org/2001/XMLSchema&amp;quot;&amp;gt;
  &amp;lt;metadata&amp;gt;
    &amp;lt;id&amp;gt;sidepop&amp;lt;/id&amp;gt;
    &amp;lt;version&amp;gt;DO_NOT_EDIT&amp;lt;/version&amp;gt;
    &amp;lt;authors&amp;gt;Rob Reynolds, Tim Hibbard&amp;lt;/authors&amp;gt;
    &amp;lt;owners&amp;gt;Rob Reynolds&amp;lt;/owners&amp;gt;
    &amp;lt;summary&amp;gt;SidePOP gives your app the ability to receive email&amp;lt;/summary&amp;gt;
    &amp;lt;description&amp;gt;SidePOP allows your application the ability to receive email&amp;lt;/description&amp;gt;
    &amp;lt;projectUrl&amp;gt;http://sidepop.googlecode.com&amp;lt;/projectUrl&amp;gt;
    &amp;lt;licenseUrl&amp;gt;http://www.apache.org/licenses/LICENSE-2.0&amp;lt;/licenseUrl&amp;gt;
    &amp;lt;requireLicenseAcceptance&amp;gt;false&amp;lt;/requireLicenseAcceptance&amp;gt;
    &amp;lt;tags&amp;gt;email&amp;lt;/tags&amp;gt;
    &amp;lt;!--&amp;lt;iconUrl&amp;gt;32x32.png&amp;lt;/iconUrl&amp;gt;--&amp;gt;
    &amp;lt;dependencies&amp;gt;
      &amp;lt;dependency id=&amp;quot;log4net&amp;quot; version=&amp;quot;1.2.10&amp;quot; /&amp;gt;
    &amp;lt;/dependencies&amp;gt;
  &amp;lt;/metadata&amp;gt;
&amp;lt;/package&amp;gt;&lt;/pre&gt;

&lt;p&gt;5. We also have content transformation for the config file, so we’ll include that in the nuget folder.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://devlicio.us/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rob_5F00_reynolds/image_5F00_0FE1A581.png"&gt;&lt;img style="background-image:none;border-right-width:0px;padding-left:0px;padding-right:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;padding-top:0px;" title="adding a content folder!" border="0" alt="adding a content folder" src="http://devlicio.us/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rob_5F00_reynolds/image_5F00_thumb_5F00_364388CC.png" width="261" height="90" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;6. In that we will create our transforms for the web.config and app.config.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://devlicio.us/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rob_5F00_reynolds/image_5F00_03738258.png"&gt;&lt;img style="background-image:none;border-right-width:0px;padding-left:0px;padding-right:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;padding-top:0px;" title="transform files, we roll explicit yo!" border="0" alt="transform files" src="http://devlicio.us/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rob_5F00_reynolds/image_5F00_thumb_5F00_7BE812EA.png" width="311" height="144" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;7. Now we go back up to our top level folder and run build.bat. &lt;/p&gt;

&lt;p&gt;&lt;a href="http://devlicio.us/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rob_5F00_reynolds/image_5F00_41206A14.png"&gt;&lt;img style="background-image:none;border-right-width:0px;padding-left:0px;padding-right:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;padding-top:0px;" title="Loving the colorific console!" border="0" alt="build it like the matrix" src="http://devlicio.us/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rob_5F00_reynolds/image_5F00_thumb_5F00_78F2AE37.png" width="454" height="413" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;8. If we head down to our code_drop/nuget folder, you can see we have a nupkg with the right version on it!&lt;/p&gt;

&lt;p&gt;&lt;a href="http://devlicio.us/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rob_5F00_reynolds/image_5F00_4F9B6639.png"&gt;&lt;img style="background-image:none;border-right-width:0px;padding-left:0px;padding-right:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;padding-top:0px;" title="7Zip - showing the package manager and contents. Sweet!" border="0" alt="7Zip - showing the package and contents" src="http://devlicio.us/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rob_5F00_reynolds/image_5F00_thumb_5F00_42C1101B.png" width="599" height="434" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;9. Now all we have to do is look to be sure we have everything we want and we can upload. In my case I need to exclude the log4net file I have, so I need to delete that one from the directory during the build process. How do I get in? &lt;a href="http://uppercut.pbworks.com/w/page/9022440/CustomizeUsingExtensionPoints" target="_blank"&gt;UC Extension Points&lt;/a&gt; of course!&lt;/p&gt;

&lt;p&gt;&lt;a href="http://devlicio.us/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rob_5F00_reynolds/image_5F00_6052EB1A.png"&gt;&lt;img style="background-image:none;border-right-width:0px;padding-left:0px;padding-right:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;padding-top:0px;" title="Whoops! Got log4net in my package. Dude!" border="0" alt="Got log4net in my package" src="http://devlicio.us/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rob_5F00_reynolds/image_5F00_thumb_5F00_6699C1A8.png" width="425" height="128" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;10. If I drop into the build folder and open a command line I can type: &lt;strong&gt;customize nugetPrepare.step post&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="http://devlicio.us/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rob_5F00_reynolds/image_5F00_30B4CC8E.png"&gt;&lt;img style="background-image:none;border-right-width:0px;padding-left:0px;padding-right:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;padding-top:0px;" title="customize nugetPrepare.step post" border="0" alt="customize nugetPrepare.step post" src="http://devlicio.us/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rob_5F00_reynolds/image_5F00_thumb_5F00_251F0F4F.png" width="478" height="40" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;11. This will create an extension point file for me in build.custom. &lt;/p&gt;

&lt;p&gt;&lt;a href="http://devlicio.us/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rob_5F00_reynolds/image_5F00_08A21D6F.png"&gt;&lt;img style="background-image:none;border-right-width:0px;padding-left:0px;padding-right:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;padding-top:0px;" title="nugetPrepare.post.step yo" border="0" alt="nugetPrepare.post.step" src="http://devlicio.us/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rob_5F00_reynolds/image_5F00_thumb_5F00_2E2B9AD0.png" width="288" height="242" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;12. Open that file and let’s remove the log4net file from the nuget drop directory prior to the nuget build. This is how I set up that file:&lt;/p&gt;

&lt;pre class="xml" name="code"&gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot;?&amp;gt;
&amp;lt;project name=&amp;quot;CUSTOM POST NUGETPREPARE&amp;quot; default=&amp;quot;go&amp;quot;&amp;gt;
  &amp;lt;!-- Project UppercuT - http://projectuppercut.org --&amp;gt;
  &amp;lt;property name=&amp;quot;build.config.settings&amp;quot; value=&amp;quot;__NONE__&amp;quot; overwrite=&amp;quot;false&amp;quot; /&amp;gt;
  &amp;lt;include buildfile=&amp;quot;${build.config.settings}&amp;quot; if=&amp;quot;${file::exists(build.config.settings)}&amp;quot; /&amp;gt;
  &amp;lt;property name=&amp;quot;path.separator&amp;quot; value=&amp;quot;${string::trim(path::combine(&amp;#39; &amp;#39;, &amp;#39; &amp;#39;))}&amp;quot; /&amp;gt;
  &amp;lt;property name=&amp;quot;dirs.current&amp;quot; value=&amp;quot;${directory::get-parent-directory(project::get-buildfile-path())}&amp;quot; /&amp;gt;
  &amp;lt;property name=&amp;quot;path.to.toplevel&amp;quot; value=&amp;quot;..&amp;quot; /&amp;gt;
  &amp;lt;property name=&amp;quot;folder.code_drop&amp;quot; value=&amp;quot;code_drop&amp;quot; overwrite=&amp;quot;false&amp;quot; /&amp;gt;
  &amp;lt;property name=&amp;quot;dirs.drop&amp;quot; value=&amp;quot;${dirs.current}${path.separator}${path.to.toplevel}${path.separator}${folder.code_drop}&amp;quot; overwrite=&amp;quot;false&amp;quot; /&amp;gt;
  &amp;lt;property name=&amp;quot;dirs.drop&amp;quot; value=&amp;quot;${path::get-full-path(dirs.drop)}&amp;quot; /&amp;gt;
  &amp;lt;property name=&amp;quot;folder.nuget&amp;quot; value=&amp;quot;nuget&amp;quot; overwrite=&amp;quot;false&amp;quot; /&amp;gt;
  &amp;lt;property name=&amp;quot;dirs.drop.nuget&amp;quot; value=&amp;quot;${dirs.drop}${path.separator}${folder.nuget}&amp;quot; overwrite=&amp;quot;false&amp;quot; /&amp;gt;
  
  &amp;lt;target name=&amp;quot;go&amp;quot;&amp;gt;
    &amp;lt;echo message=&amp;quot;Removing log4net from &amp;#39;${dirs.drop.nuget}\lib&amp;#39;&amp;quot; /&amp;gt;
    &amp;lt;delete&amp;gt;
      &amp;lt;fileset basedir=&amp;quot;${dirs.drop.nuget}\lib&amp;quot; &amp;gt;
        &amp;lt;include name=&amp;quot;log4net.*&amp;quot; /&amp;gt;
      &amp;lt;/fileset&amp;gt;
    &amp;lt;/delete&amp;gt;
  &amp;lt;/target&amp;gt;
  
&amp;lt;/project&amp;gt;&lt;/pre&gt;

&lt;p&gt;13. Now looky here, log4net is no longer in my package. &lt;img style="border-bottom-style:none;border-right-style:none;border-top-style:none;border-left-style:none;" class="wlEmoticon wlEmoticon-openmouthedsmile" alt="Open-mouthed smile" src="http://devlicio.us/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rob_5F00_reynolds/wlEmoticon_2D00_openmouthedsmile_5F00_21BD77A7.png" /&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="http://devlicio.us/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rob_5F00_reynolds/image_5F00_255B9284.png"&gt;&lt;img style="background-image:none;border-right-width:0px;padding-left:0px;padding-right:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;padding-top:0px;" title="sidepop.dll minus log4net.dll" border="0" alt="sidepop.dll minus log4net.dll" src="http://devlicio.us/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rob_5F00_reynolds/image_5F00_thumb_5F00_64B94614.png" width="456" height="148" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;14. Now I am ready to test my package before I push it out by putting it in a local feed and grabbing it.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://devlicio.us/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rob_5F00_reynolds/image_5F00_7FF19F15.png"&gt;&lt;img style="background-image:none;border-right-width:0px;padding-left:0px;padding-right:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;padding-top:0px;" title="PM is for Package Manager... :D" border="0" alt="Package Manager Console" src="http://devlicio.us/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rob_5F00_reynolds/image_5F00_thumb_5F00_18150971.png" width="614" height="157" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="http://devlicio.us/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rob_5F00_reynolds/image_5F00_29856A49.png"&gt;&lt;img style="background-image:none;border-right-width:0px;padding-left:0px;padding-right:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;padding-top:0px;" title="SidePOP - checkin your email yo!" border="0" alt="sidepop in the configuration file" src="http://devlicio.us/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rob_5F00_reynolds/image_5F00_thumb_5F00_2F600DE2.png" width="633" height="268" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;15. All good. Now I can upload and put my package on the &lt;a href="http://nuget.org" target="_blank"&gt;official feed&lt;/a&gt;!&lt;/p&gt;

&lt;p&gt;&lt;a href="http://devlicio.us/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rob_5F00_reynolds/image_5F00_20492F08.png"&gt;&lt;img style="background-image:none;border-right-width:0px;padding-left:0px;padding-right:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;padding-top:0px;" title="SidePOP on NuGet gallery!" border="0" alt="SidePOP on NuGet gallery!" src="http://devlicio.us/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rob_5F00_reynolds/image_5F00_thumb_5F00_12967300.png" width="354" height="284" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;NOTE:&lt;/strong&gt; SidePOP is in Alpha. If you want to use it to check email, it works, but be prepared for possible errors.&lt;/p&gt;

&lt;h4&gt;&lt;u&gt;Conclusion – UppercuT and NuGet – A Good Team!&lt;/u&gt;&lt;/h4&gt;

&lt;p&gt;You can see how fast we went from ZERO NuGet to up on the &lt;a href="http://nuget.org" target="_blank"&gt;http://nuget.org&lt;/a&gt; site! In 4 steps I was already building a NuGet package, and in less than 15 steps it was production ready! What are you waiting for? Go &lt;a href="http://projectuppercut.org/" target="_blank"&gt;UppercuT&lt;/a&gt; your code now!&lt;/p&gt;

&lt;p&gt;If you have any UC related questions when getting it all NuGet-ty, feel free to contact the list: &lt;a href="http://groups.google.com/group/chucknorrisframework" target="_blank"&gt;http://groups.google.com/group/chucknorrisframework&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;With this knowledge, you shall build.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://devlicio.us/aggbug.aspx?PostID=64799" width="1" height="1"&gt;</description><category domain="http://devlicio.us/blogs/rob_reynolds/archive/tags/HowTo/default.aspx">HowTo</category><category domain="http://devlicio.us/blogs/rob_reynolds/archive/tags/UppercuT/default.aspx">UppercuT</category><category domain="http://devlicio.us/blogs/rob_reynolds/archive/tags/Development/default.aspx">Development</category><category domain="http://devlicio.us/blogs/rob_reynolds/archive/tags/.NET/default.aspx">.NET</category></item><item><title>Herding Code Talks About Nu</title><link>http://devlicio.us/blogs/rob_reynolds/archive/2010/08/27/herding-code-talks-about-nu.aspx</link><pubDate>Fri, 27 Aug 2010 06:22:58 GMT</pubDate><guid isPermaLink="false">40756a8b-6212-4073-9d98-6c26781577de:61707</guid><dc:creator>Rob Reynolds</dc:creator><slash:comments>4</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://devlicio.us/blogs/rob_reynolds/rsscomments.aspx?PostID=61707</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://devlicio.us/blogs/rob_reynolds/commentapi.aspx?PostID=61707</wfw:comment><comments>http://devlicio.us/blogs/rob_reynolds/archive/2010/08/27/herding-code-talks-about-nu.aspx#comments</comments><description>&lt;p&gt;&lt;a href="http://devlicio.us/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rob_5F00_reynolds/image_5F00_33FC9938.png"&gt;&lt;img style="border-right-width:0px;margin:0px 0px 5px 5px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="Herding Code" border="0" alt="Herding Code" align="right" src="http://devlicio.us/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rob_5F00_reynolds/image_5F00_thumb_5F00_0BE9EA19.png" width="174" height="174" /&gt;&lt;/a&gt;&lt;a href="http://drusellers.codebetter.com" target="_blank"&gt;Dru&lt;/a&gt; and I were recently featured on &lt;a href="http://herdingcode.com/?p=272" target="_blank"&gt;Herding Code&lt;/a&gt; Podcast. In the podcast we talk about everything from package management in general to &lt;a href="http://nu.wikispot.org" target="_blank"&gt;Nubular&lt;/a&gt; (Nu) to other package management systems (&lt;a href="http://github.com/openrasta/openwrap" target="_blank"&gt;OpenWrap&lt;/a&gt;, &lt;a href="http://bricksproject.org/" target="_blank"&gt;Bricks&lt;/a&gt;, and &lt;a href="http://groups.google.com/group/horn-development" target="_blank"&gt;Horn&lt;/a&gt;, although horn was/is slightly different) to the possibility of Microsoft releasing a package management system. It was a good time and I enjoyed doing the podcast, but the herding code guys start recording at an insane 10:30 PM! I have no idea how I made it through the whole thing and was still able to talk afterwards.&lt;/p&gt;  &lt;p&gt;Some highlights:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;There is a lot of talk in the beginning about package management in general. &lt;/li&gt;    &lt;li&gt;Basically, I say the word “basically” way too much. &lt;/li&gt;    &lt;li&gt;For the first 16 minutes I think I was teetering on sleep, it was 10:30PM after all. Then after that I start to wake up and sound more articulate. &lt;/li&gt;    &lt;li&gt;Big shouts out to all the people in the community that have really been stepping up, and huge shout outs to &lt;a href="http://litanyagainstfear.com/" target="_blank"&gt;Nick Quaranto&lt;/a&gt; (@&lt;a href="http://twitter.com/qrush" target="_blank"&gt;qrush&lt;/a&gt;), &lt;a href="http://weblogs.asp.net/bsimser/" target="_blank"&gt;Bil Simser&lt;/a&gt; (@&lt;a href="http://twitter.com/bsimser" target="_blank"&gt;bsimser&lt;/a&gt;) and &lt;a href="http://systemex.net/" target="_blank"&gt;Michael Carter&lt;/a&gt; (@&lt;a href="http://twitter.com/kiliman" target="_blank"&gt;kiliman&lt;/a&gt;). &lt;/li&gt;    &lt;li&gt;40:16 – Discussion about what we would do if Microsoft released a package management system &lt;/li&gt;    &lt;li&gt;49:34 - “It’s spelled with an N U” - Dru Pimps Nu in the “Pimp Your Code” section of the podcast &lt;/li&gt;    &lt;li&gt;Going OT (off topic) 53:11 - “We junk punch audit” - Mentions for &lt;a href="http://projectroundhouse.org/" target="_blank"&gt;RoundhousE&lt;/a&gt; and what problems it solves. &lt;/li&gt;    &lt;li&gt;55:13 - “At the end of the day it is what it is as long as you bring your A game” - Basically Rehashed and Remixed. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;a href="http://devlicio.us/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rob_5F00_reynolds/image_5F00_6AF67771.png"&gt;&lt;img style="border-right-width:0px;margin:0px 5px 5px 0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="Nubular (Nu)" border="0" alt="Nubular (Nu)" align="left" src="http://devlicio.us/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rob_5F00_reynolds/image_5F00_thumb_5F00_0960B85B.png" width="225" height="215" /&gt;&lt;/a&gt;Check out the herding code podcast and notes for more. I didn’t keep track of certain times for interesting bits in the beginning of the podcast, but &lt;a href="http://johnnycoder.com/blog/" target="_blank"&gt;Ben Griswold&lt;/a&gt; does an excellent job on the notes from the podcast.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://herdingcode.com/?p=272" target="_blank"&gt;&lt;strong&gt;http://herdingcode.com/?p=272&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://devlicio.us/aggbug.aspx?PostID=61707" width="1" height="1"&gt;</description><category domain="http://devlicio.us/blogs/rob_reynolds/archive/tags/RoundhousE/default.aspx">RoundhousE</category><category domain="http://devlicio.us/blogs/rob_reynolds/archive/tags/UppercuT/default.aspx">UppercuT</category><category domain="http://devlicio.us/blogs/rob_reynolds/archive/tags/Development/default.aspx">Development</category><category domain="http://devlicio.us/blogs/rob_reynolds/archive/tags/.NET/default.aspx">.NET</category><category domain="http://devlicio.us/blogs/rob_reynolds/archive/tags/Agile/default.aspx">Agile</category><category domain="http://devlicio.us/blogs/rob_reynolds/archive/tags/Gems/default.aspx">Gems</category></item><item><title>How To – UppercuT and Gems</title><link>http://devlicio.us/blogs/rob_reynolds/archive/2010/07/20/how-to-uppercut-and-gems.aspx</link><pubDate>Tue, 20 Jul 2010 14:00:00 GMT</pubDate><guid isPermaLink="false">40756a8b-6212-4073-9d98-6c26781577de:61136</guid><dc:creator>Rob Reynolds</dc:creator><slash:comments>4</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://devlicio.us/blogs/rob_reynolds/rsscomments.aspx?PostID=61136</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://devlicio.us/blogs/rob_reynolds/commentapi.aspx?PostID=61136</wfw:comment><comments>http://devlicio.us/blogs/rob_reynolds/archive/2010/07/20/how-to-uppercut-and-gems.aspx#comments</comments><description>&lt;p&gt;In a previous &lt;a href="http://devlicio.us/blogs/rob_reynolds/archive/2010/07/16/how-to-gems-and-net.aspx" target="_blank"&gt;post&lt;/a&gt; I mentioned how I was going to show you how &lt;a href="http://projectuppercut.org/" target="_blank"&gt;UppercuT&lt;/a&gt; (UC) has the ability to make gems stupid simple to create and publish. You ask if gems can get any easier and to that I answer, &amp;ldquo;Why YES, they can!&amp;rdquo; How about just filling out the information for the gemspec, running a build and having a nice, shiny new gem ready for publishing?&lt;/p&gt;
&lt;h4&gt;&lt;strong&gt;Rock The Gems&lt;/strong&gt;&lt;/h4&gt;
&lt;p&gt;Basically you want to get the latest release of &lt;a href="http://projectuppercut.org" target="_blank"&gt;UppercuT&lt;/a&gt;. You can &lt;a href="http://code.google.com/p/uppercut/downloads/list" target="_blank"&gt;download it&lt;/a&gt; or grab the source and compile.&lt;/p&gt;
&lt;p&gt;There are already &lt;a href="http://uppercut.pbworks.com/HowToUse" target="_blank"&gt;instructions&lt;/a&gt; &lt;a href="http://uppercut.googlecode.com/svn/trunk/docs" target="_blank"&gt;out&lt;/a&gt; there for how to get UC in your project, so I&amp;rsquo;m not going to concentrate on that.&lt;/p&gt;
&lt;p&gt;Once you upgrade (or add and get everything else set up), you want to have this gems folder at your top level (just under trunk or branch name).&lt;/p&gt;
&lt;p&gt;&lt;a href="http://devlicio.us/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rob_5F00_reynolds/image_5F00_2EF23BA0.png"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="gems folder at the top level" border="0" alt="gems folder at the top level" src="http://devlicio.us/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rob_5F00_reynolds/image_5F00_thumb_5F00_5166CA5B.png" width="204" height="281" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;In that gems folder you are going to find a file named something like the file below. Rename that file to your new &lt;em&gt;gemname&lt;/em&gt;.gemspec. &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; Once you have a gemspec file in a gems folder, your build server NOW needs to also have ruby and gems installed.&lt;/p&gt;
&lt;p&gt;Open that file in your favorite text editor and fill in the details. Here&amp;rsquo;s a &lt;a href="http://devlicio.us/blogs/rob_reynolds/archive/2010/07/16/how-to-gems-and-net.aspx" target="_blank"&gt;good post&lt;/a&gt; on how to do that.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://devlicio.us/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rob_5F00_reynolds/image_5F00_3E459DAF.png"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="Rename the file to gemname.gemspec" border="0" alt="Rename the file to gemname.gemspec" src="http://devlicio.us/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rob_5F00_reynolds/image_5F00_thumb_5F00_5D884482.png" width="244" height="213" /&gt;&lt;/a&gt;&amp;nbsp;&lt;a href="http://devlicio.us/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rob_5F00_reynolds/image_5F00_3C94D1DB.png"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="Open in a text editor and edit the gemspec according to your needs" border="0" alt="Open in a text editor and edit the gemspec according to your needs" src="http://devlicio.us/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rob_5F00_reynolds/image_5F00_thumb_5F00_628A8231.png" width="244" height="201" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;Then just for having the gems folder with a gemspec in it, UC will automatically try to build the gem for you (the code in your code_drop/&lt;em&gt;projectname&lt;/em&gt; folder is brought over to code_drop/gems/lib folder).&lt;/p&gt;
&lt;p&gt;&lt;a href="http://devlicio.us/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rob_5F00_reynolds/image_5F00_41970F8A.png"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="code_drop/gems" border="0" alt="code_drop/gems" src="http://devlicio.us/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rob_5F00_reynolds/image_5F00_thumb_5F00_27C2D95B.png" width="226" height="244" /&gt;&lt;/a&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://devlicio.us/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rob_5F00_reynolds/image_5F00_3860D03D.png"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="Gem gets built with the correct version" border="0" alt="Gem gets built with the correct version" src="http://devlicio.us/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rob_5F00_reynolds/image_5F00_thumb_5F00_104E211E.png" width="466" height="351" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;h4&gt;&lt;strong&gt;Removing All of the Other Output After the Gem is Built&lt;/strong&gt;&lt;/h4&gt;
&lt;p&gt;Once we are good with what we are getting back for the gem, we can start cleaning up. So we go into our build.custom (don&amp;rsquo;t have one? create it right next to the build folder) folder and create a file named &lt;strong&gt;gemsBuild.post.step&lt;/strong&gt;. &lt;/p&gt;
&lt;p&gt;&lt;a href="http://devlicio.us/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rob_5F00_reynolds/image_5F00_702D186C.png"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="build.custom/gemsbuild.post.step" border="0" alt="build.custom/gemsbuild.post.step" src="http://devlicio.us/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rob_5F00_reynolds/image_5F00_thumb_5F00_5658E23D.png" width="244" height="238" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s open the file and insert this:&lt;/p&gt;
&lt;pre class="xml" name="code"&gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot;?&amp;gt;
&amp;lt;project name=&amp;quot;CUSTOM POST GEMSBUILD&amp;quot; default=&amp;quot;go&amp;quot;&amp;gt;
  &amp;lt;!-- Project UppercuT - http://projectuppercut.org --&amp;gt;
  &amp;lt;property name=&amp;quot;build.config.settings&amp;quot; value=&amp;quot;__NONE__&amp;quot; overwrite=&amp;quot;false&amp;quot; /&amp;gt;
  &amp;lt;include buildfile=&amp;quot;${build.config.settings}&amp;quot; if=&amp;quot;${file::exists(build.config.settings)}&amp;quot; /&amp;gt;
  &amp;lt;property name=&amp;quot;dirs.current&amp;quot; value=&amp;quot;${directory::get-parent-directory(project::get-buildfile-path())}&amp;quot; /&amp;gt;
  &amp;lt;property name=&amp;quot;path.to.toplevel&amp;quot; value=&amp;quot;..&amp;quot; /&amp;gt;
  &amp;lt;property name=&amp;quot;folder.code_drop&amp;quot; value=&amp;quot;code_drop&amp;quot; overwrite=&amp;quot;false&amp;quot; /&amp;gt;
  &amp;lt;property name=&amp;quot;dirs.drop&amp;quot; value=&amp;quot;${dirs.current}\${path.to.toplevel}\${folder.code_drop}&amp;quot; overwrite=&amp;quot;false&amp;quot; /&amp;gt;
  &amp;lt;property name=&amp;quot;folder.gems&amp;quot; value=&amp;quot;gems&amp;quot; overwrite=&amp;quot;false&amp;quot; /&amp;gt;
  
  &amp;lt;target name=&amp;quot;go&amp;quot; depends=&amp;quot;run_tasks&amp;quot; /&amp;gt;
  
  &amp;lt;target name=&amp;quot;run_tasks&amp;quot;&amp;gt;
    &amp;lt;delete&amp;gt;
      &amp;lt;fileset basedir=&amp;quot;${dirs.drop}/${folder.gems}&amp;quot; &amp;gt;
        &amp;lt;exclude name=&amp;quot;*.gem&amp;quot; /&amp;gt;
        &amp;lt;include name=&amp;quot;**/*&amp;quot; /&amp;gt;
      &amp;lt;/fileset&amp;gt;
    &amp;lt;/delete&amp;gt;
  &amp;lt;/target&amp;gt;
  
&amp;lt;/project&amp;gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Note: &lt;/strong&gt;Don&amp;rsquo;t like NAnt?&lt;strong&gt; &lt;/strong&gt;You can also use Ruby or PowerShell instead of NAnt to write your &lt;a href="http://uppercut.pbworks.com/CustomizeUsingExtensionPoints" target="_blank"&gt;custom extensions&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Now when we run our build again, we have a nice clean folder. &lt;/p&gt;
&lt;p&gt;&lt;a href="http://devlicio.us/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rob_5F00_reynolds/image_5F00_35656F96.png"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="All clean - just the built gem. Nice..." border="0" alt="All clean - just the built gem. Nice..." src="http://devlicio.us/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rob_5F00_reynolds/image_5F00_thumb_5F00_348D09AC.png" width="440" height="191" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4&gt;&lt;strong&gt;What If I Want to Change What Goes Into my Gem?&lt;/strong&gt;&lt;/h4&gt;
&lt;p&gt;Interested in influencing what goes INTO your gem in the first place? That&amp;rsquo;s a pretty good thing to be concerned with so that you don&amp;rsquo;t have all of your referenced assemblies sitting in there. Read about how to set up &lt;a href="http://devlicio.us/blogs/rob_reynolds/archive/2010/07/17/how-to-gems-and-net-dependencies-references.aspx" target="_blank"&gt;dependencies&lt;/a&gt;. Then you will create a file next to &lt;strong&gt;gemsbuild.post.step&lt;/strong&gt; named &lt;strong&gt;gemsPrepare.post.step&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://devlicio.us/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rob_5F00_reynolds/image_5F00_3A67AD45.png"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="build.custom/gemsPrepare.post.step" border="0" alt="build.custom/gemsPrepare.post.step" src="http://devlicio.us/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rob_5F00_reynolds/image_5F00_thumb_5F00_249DC4E8.png" width="204" height="263" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;In that file, you will insert something similar to the following (&lt;a href="http://roundhouse.googlecode.com/svn/trunk/build.custom/gemsPrepare.post.step" target="_blank"&gt;roundhouse file&lt;/a&gt;):&lt;/p&gt;
&lt;pre class="xml" name="code"&gt;&amp;lt;copy todir=&amp;quot;${dirs.drop}\${folder.gems}\lib&amp;quot;&amp;gt;
  &amp;lt;fileset basedir=&amp;quot;${dirs.drop}\${folder.gems}\lib\MSBuild&amp;quot;&amp;gt;
    &amp;lt;include name=&amp;quot;**/*.*&amp;quot; /&amp;gt;
  &amp;lt;/fileset&amp;gt;
&amp;lt;/copy&amp;gt;

&amp;lt;copy todir=&amp;quot;${dirs.drop}\${folder.gems}\lib&amp;quot;&amp;gt;
  &amp;lt;fileset basedir=&amp;quot;${dirs.drop}\${folder.gems}\lib\NAnt&amp;quot;&amp;gt;
    &amp;lt;include name=&amp;quot;**/*.*&amp;quot; /&amp;gt;
  &amp;lt;/fileset&amp;gt;
&amp;lt;/copy&amp;gt;

&amp;lt;delete&amp;gt;
  &amp;lt;fileset basedir=&amp;quot;${dirs.drop}\${folder.gems}\lib&amp;quot; &amp;gt;
    &amp;lt;include name=&amp;quot;ConsoleApp/**&amp;quot; /&amp;gt;
    &amp;lt;include name=&amp;quot;MSBuild/**&amp;quot; /&amp;gt;
    &amp;lt;include name=&amp;quot;NAnt/**&amp;quot; /&amp;gt;
  &amp;lt;/fileset&amp;gt;
&amp;lt;/delete&amp;gt;&lt;/pre&gt;
&lt;h4&gt;&lt;strong&gt;Learn More&lt;/strong&gt;&lt;/h4&gt;
&lt;p&gt;With this knowledge, you shall build. Interested in more UppercuT? Check out the &lt;a href="http://groups.google.com/group/chucknorrisframework" target="_blank"&gt;ChuckNorris&lt;/a&gt; framework and &lt;a href="http://groups.google.com/group/chucknorrisframework/subscribe" target="_blank"&gt;join&lt;/a&gt; the group.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4&gt;&lt;strong&gt;Related Posts&lt;/strong&gt;&lt;/h4&gt;
&lt;p&gt;Before you comment about &amp;ldquo;cluttering&amp;rdquo; the ruby community, please be sure to read this (we&amp;rsquo;re with you on this):&amp;nbsp; &lt;a title="http://devlicio.us/blogs/rob_reynolds/archive/2010/07/19/gems-for-net-community-response.aspx" href="http://devlicio.us/blogs/rob_reynolds/archive/2010/07/19/gems-for-net-community-response.aspx" target="_blank"&gt;http://devlicio.us/blogs/rob_reynolds/archive/2010/07/19/gems-for-net-community-response.aspx&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://devlicio.us/blogs/rob_reynolds/archive/2010/07/15/gems-package-management-for-net.aspx" target="_blank"&gt;Gems - Package Management for .NET&lt;/a&gt;&amp;nbsp; &lt;/p&gt;
&lt;p&gt;&lt;a href="http://devlicio.us/blogs/rob_reynolds/archive/2010/07/16/how-to-gems-and-net.aspx" target="_blank"&gt;How To &amp;ndash; Gems &amp;amp; .NET&lt;/a&gt; &amp;amp; &lt;a href="http://devlicio.us/blogs/rob_reynolds/archive/2010/07/17/how-to-gems-and-net-dependencies-references.aspx" target="_blank"&gt;How To &amp;ndash; Gems &amp;amp; .NET - Dependencies (References)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://devlicio.us/blogs/rob_reynolds/archive/2010/07/26/the-future-of-net-open-source-software-delivery.aspx" target="_blank"&gt;The Future is Now!&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://devlicio.us/aggbug.aspx?PostID=61136" width="1" height="1"&gt;</description><category domain="http://devlicio.us/blogs/rob_reynolds/archive/tags/HowTo/default.aspx">HowTo</category><category domain="http://devlicio.us/blogs/rob_reynolds/archive/tags/UppercuT/default.aspx">UppercuT</category><category domain="http://devlicio.us/blogs/rob_reynolds/archive/tags/Development/default.aspx">Development</category><category domain="http://devlicio.us/blogs/rob_reynolds/archive/tags/Tools/default.aspx">Tools</category><category domain="http://devlicio.us/blogs/rob_reynolds/archive/tags/.NET/default.aspx">.NET</category><category domain="http://devlicio.us/blogs/rob_reynolds/archive/tags/Gems/default.aspx">Gems</category></item><item><title>How To – Gems And .NET – Dependencies (References)</title><link>http://devlicio.us/blogs/rob_reynolds/archive/2010/07/17/how-to-gems-and-net-dependencies-references.aspx</link><pubDate>Sat, 17 Jul 2010 13:04:00 GMT</pubDate><guid isPermaLink="false">40756a8b-6212-4073-9d98-6c26781577de:61109</guid><dc:creator>Rob Reynolds</dc:creator><slash:comments>5</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://devlicio.us/blogs/rob_reynolds/rsscomments.aspx?PostID=61109</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://devlicio.us/blogs/rob_reynolds/commentapi.aspx?PostID=61109</wfw:comment><comments>http://devlicio.us/blogs/rob_reynolds/archive/2010/07/17/how-to-gems-and-net-dependencies-references.aspx#comments</comments><description>&lt;p&gt;In my &lt;a target="_blank" href="http://devlicio.us/blogs/rob_reynolds/archive/2010/07/16/how-to-gems-and-net.aspx"&gt;last post&lt;/a&gt; I didn&amp;rsquo;t mention dependencies.&amp;nbsp; Dependencies are their own animal. They require a couple more things to be in place. Let&amp;rsquo;s talk about those things.&lt;/p&gt;
&lt;p&gt;In the .NET world, the dependency for compiled bits is usually an exact version of a reference.&lt;/p&gt;
&lt;p&gt;Let me explain. So for example, you have a reference to log4net, and you don&amp;rsquo;t &lt;a target="_blank" href="http://research.microsoft.com/en-us/people/mbarnett/ilmerge.aspx"&gt;ILMerge&lt;/a&gt; it into your assembly. You now have a dependency that the DLL needs to be there and a particular version (outside of &lt;a target="_blank" href="http://ferventcoder.com/archive/2009/07/19/net-binding-redirects-ndash-updating-referenced-assemblies-without-recompiling-code.aspx"&gt;redirecting the bindings&lt;/a&gt;).&amp;nbsp; So what I&amp;rsquo;m getting at is that you require an exact version of a particular DLL. And what you really need is an exact name, version, culture, and public key token of a DLL.&amp;nbsp; But let&amp;rsquo;s keep things simple. It&amp;rsquo;s really the version and the name when culture is neutral (and the key shouldn&amp;rsquo;t change in the same version). So just the name and version.&lt;/p&gt;
&lt;h4&gt;&lt;strong&gt;Adding a Reference as a Dependency&lt;/strong&gt;&lt;/h4&gt;
&lt;p&gt;For each reference you have to a library, you find out what version it is (assembly version) and then add that as a dependency. You can do that by cracking open reflector and taking a look at the actual assembly version.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://devlicio.us/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rob_5F00_reynolds/image_5F00_592293C5.png"&gt;&lt;img height="339" width="417" src="http://devlicio.us/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rob_5F00_reynolds/image_5F00_thumb_5F00_0A41CE66.png" alt="The assembly version" border="0" title="The assembly version" style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;Don&amp;rsquo;t use the properties. Neither file version or product version are going to be accurate here:&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;a href="http://devlicio.us/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rob_5F00_reynolds/image_5F00_1645FAED.png"&gt;&lt;img height="328" width="329" src="http://devlicio.us/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rob_5F00_reynolds/image_5F00_thumb_5F00_2E696548.png" alt="Properties of log4net.dll - file and product verions" border="0" title="Properties of log4net.dll - file and product verions" style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;There is nothing out there that says that assembly, file and informational (also known as product) versions have to be the same. .NET relies on the assembly version for referencing. It makes sense that we should as well. Here&amp;rsquo;s a better example where things are different:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://devlicio.us/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rob_5F00_reynolds/image_5F00_226538C1.png"&gt;&lt;img height="320" width="277" src="http://devlicio.us/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rob_5F00_reynolds/image_5F00_thumb_5F00_41A7DF94.png" alt="Castle File Version 1.2.0.6623" border="0" title="Castle File Version 1.2.0.6623" style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" /&gt;&lt;/a&gt; &lt;a href="http://devlicio.us/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rob_5F00_reynolds/image_5F00_47EEB622.png"&gt;&lt;img height="286" width="354" src="http://devlicio.us/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rob_5F00_reynolds/image_5F00_thumb_5F00_0DFF7336.png" alt="Castle Assembly Version 1.2.0.0" border="0" title="Castle Assembly Version 1.2.0.0" style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;So what would I put in my gemspec? If your reference was to log4net version 1.2.10.0, then you need to assign a dependency to that exact version. Done like so:&lt;/p&gt;
&lt;pre name="code" class="ruby"&gt;spec.add_dependency(&amp;#39;log4net&amp;#39;,&amp;#39;= 1.2.10.0&amp;#39;)&lt;/pre&gt;
&lt;p&gt;I believe you add each referenced dependency to it&amp;rsquo;s own line.&lt;/p&gt;
&lt;h4&gt;&lt;strong&gt;Gem Exists?&lt;/strong&gt;&lt;/h4&gt;
&lt;p&gt;Now to the sanity check. Before you even add it as a dependency, you want to ensure that the gem exists.&lt;/p&gt;
&lt;p&gt;Go to &lt;a href="http://rubygems.org"&gt;http://rubygems.org&lt;/a&gt; and in the top right there is a search box. Search for your reference there.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://devlicio.us/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rob_5F00_reynolds/image_5F00_284185E0.png"&gt;&lt;img height="111" width="554" src="http://devlicio.us/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rob_5F00_reynolds/image_5F00_thumb_5F00_52CD40F0.png" alt="Search box on RubyGems.org" border="0" title="Search box on RubyGems.org" style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;So let&amp;rsquo;s search for log4net to be sure it&amp;rsquo;s there.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://devlicio.us/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rob_5F00_reynolds/image_5F00_3B528CBF.png"&gt;&lt;img height="292" width="404" src="http://devlicio.us/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rob_5F00_reynolds/image_5F00_thumb_5F00_2CC76ACD.png" alt="Search results for log4net" border="0" title="Search results for log4net" style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;Sweet! I can move on to my next reference because the right version of the gem exists.&lt;/p&gt;
&lt;p&gt;Keep in mind that the name of the gem may not be the one you are looking for and/or the name may be slightly different. For example. I have a gem for &lt;a target="_blank" href="http://projectuppercut.org/"&gt;UppercuT&lt;/a&gt;. The gem is named &lt;a target="_blank" href="http://rubygems.org/gems/uppercutbuild"&gt;uppercutbuild&lt;/a&gt; because there was already a gem named uppercut.&lt;/p&gt;
&lt;h4&gt;&lt;strong&gt;Gem Doesn&amp;rsquo;t Exist?&lt;/strong&gt;&lt;/h4&gt;
&lt;p&gt;Now if it&amp;rsquo;s not there, you can add it. When the actual authors want to start managing the gem, you can just add them as owners so they can push their own gems.&lt;/p&gt;
&lt;p&gt;To check the owners of a gem you type:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;gem owner &lt;em&gt;gemname&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href="http://devlicio.us/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rob_5F00_reynolds/image_5F00_3CF332C6.png"&gt;&lt;img height="123" width="244" src="http://devlicio.us/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rob_5F00_reynolds/image_5F00_thumb_5F00_5C35D999.png" alt="Gem owners for log4net" border="0" title="Gem owners for log4net" style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;To add someone, according to the &lt;a target="_blank" href="http://rubygems.org/pages/gem_docs"&gt;gem docs&lt;/a&gt;, you issue this command (all on one line):&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;gem owner gemname --add &lt;em&gt;users.confirmed.email.address.for.ruby.gems@wherever.com&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;And that&amp;rsquo;s it.&lt;/p&gt;
&lt;p&gt;You see how I am listed as the owner of the log4net gems? I am not really the developer, when I created the gem, I tied it as closely as I could to the apache project and the committers. When those guys are ready to own the gem, I have the specs for both 1.2.9 and 1.2.10 (both are commonly referred to without the last version octet) and I can just add them as owners.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4&gt;&lt;strong&gt;Related Posts&lt;/strong&gt;&lt;/h4&gt;
&lt;p&gt;Before you comment about &amp;ldquo;cluttering&amp;rdquo; the ruby community, please be sure to read this (we&amp;rsquo;re with you on this):&amp;nbsp; &lt;a target="_blank" href="http://devlicio.us/blogs/rob_reynolds/archive/2010/07/19/gems-for-net-community-response.aspx" title="http://devlicio.us/blogs/rob_reynolds/archive/2010/07/19/gems-for-net-community-response.aspx"&gt;http://devlicio.us/blogs/rob_reynolds/archive/2010/07/19/gems-for-net-community-response.aspx&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a target="_blank" href="http://devlicio.us/blogs/rob_reynolds/archive/2010/07/15/gems-package-management-for-net.aspx"&gt;Gems - Package Management for .NET&lt;/a&gt; &amp;amp; &lt;a target="_blank" href="http://devlicio.us/blogs/rob_reynolds/archive/2010/07/16/how-to-gems-and-net.aspx"&gt;How To &amp;ndash; Gems &amp;amp; .NET&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a target="_blank" href="http://devlicio.us/blogs/rob_reynolds/archive/2010/07/20/how-to-uppercut-and-gems.aspx"&gt;Walkthrough - Create Gems Even Easier With a Conventional Build (UppercuT)!&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a target="_blank" href="http://devlicio.us/blogs/rob_reynolds/archive/2010/07/26/the-future-of-net-open-source-software-delivery.aspx"&gt;The Future is Now!&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://devlicio.us/aggbug.aspx?PostID=61109" width="1" height="1"&gt;</description><category domain="http://devlicio.us/blogs/rob_reynolds/archive/tags/HowTo/default.aspx">HowTo</category><category domain="http://devlicio.us/blogs/rob_reynolds/archive/tags/UppercuT/default.aspx">UppercuT</category><category domain="http://devlicio.us/blogs/rob_reynolds/archive/tags/Development/default.aspx">Development</category><category domain="http://devlicio.us/blogs/rob_reynolds/archive/tags/.NET/default.aspx">.NET</category><category domain="http://devlicio.us/blogs/rob_reynolds/archive/tags/Gems/default.aspx">Gems</category></item><item><title>How To - Gems And .NET</title><link>http://devlicio.us/blogs/rob_reynolds/archive/2010/07/16/how-to-gems-and-net.aspx</link><pubDate>Fri, 16 Jul 2010 15:30:00 GMT</pubDate><guid isPermaLink="false">40756a8b-6212-4073-9d98-6c26781577de:61095</guid><dc:creator>Rob Reynolds</dc:creator><slash:comments>11</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://devlicio.us/blogs/rob_reynolds/rsscomments.aspx?PostID=61095</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://devlicio.us/blogs/rob_reynolds/commentapi.aspx?PostID=61095</wfw:comment><comments>http://devlicio.us/blogs/rob_reynolds/archive/2010/07/16/how-to-gems-and-net.aspx#comments</comments><description>&lt;p&gt;In my last &lt;a target="_blank" href="http://devlicio.us/blogs/rob_reynolds/archive/2010/07/15/gems-package-management-for-net.aspx"&gt;post&lt;/a&gt; I showed gems being used for .NET. Now let&amp;rsquo;s talk about How.&amp;nbsp; Most of this stuff I&amp;rsquo;ve learned over the past two days, so if I have a mistake here or you have a better idea, please don&amp;rsquo;t hesitate to offer a better solution.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The GemSpec&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The &lt;a target="_blank" href="http://docs.rubygems.org/read/chapter/20"&gt;Gem::Specification reference&lt;/a&gt; is your friend.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;In order to create a gem, you need to define a gem specification, commonly      &lt;br /&gt;called a &amp;ldquo;gemspec&amp;rdquo;. &lt;/p&gt;
&lt;p&gt;A gemspec consists of several &lt;em&gt;attributes&lt;/em&gt;. Some of these are required;       &lt;br /&gt;most of them are optional.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;From here you learn what is required and what will just get you there.&lt;/p&gt;
&lt;h4&gt;&lt;strong&gt;Setup&lt;/strong&gt;&lt;/h4&gt;
&lt;p&gt;1. Create a folder named gems in your top level source directory.&lt;/p&gt;
&lt;p&gt;2. In that folder we are going to put our gemspec and version files. This is where we will store the files in source control (and one of them may become autogenerated). &lt;/p&gt;
&lt;p&gt;3. We will bring our gems folder to our compiled source folder after we build. Then we can add in the compiled output.&lt;/p&gt;
&lt;h4&gt;&lt;strong&gt;GemSpec for .NET&lt;/strong&gt;&lt;/h4&gt;
&lt;p&gt;1. Create a file named &lt;em&gt;project&lt;/em&gt;.gemspec. In our example it is &lt;strong&gt;&lt;em&gt;roundhouse&lt;/em&gt;&lt;/strong&gt;.gemspec. This is the most important file for this entire process. &lt;/p&gt;
&lt;p&gt;&lt;a href="http://devlicio.us/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rob_5F00_reynolds/image_5F00_011CD097.png"&gt;&lt;img height="141" width="207" src="http://devlicio.us/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rob_5F00_reynolds/image_5F00_thumb_5F00_727224B1.png" alt="First two files" border="0" title="First two files" style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;2. Open the gemspec in your favorite notepad editor. Copy the below in and change it for you needs.&lt;/p&gt;
&lt;pre name="code" class="ruby"&gt;version = File.read(File.expand_path(&amp;quot;../VERSION&amp;quot;,__FILE__)).strip

Gem::Specification.new do |spec|
  spec.platform    = Gem::Platform::RUBY
  spec.name        = &amp;#39;roundhouse&amp;#39;
  spec.version     = version
  spec.files = Dir[&amp;#39;lib/**/*&amp;#39;]

  spec.summary     = &amp;#39;RoundhousE - Professional Database Change and Versioning Management&amp;#39;
  spec.description = &amp;#39;RoundhousE is a Professional Database Change and Versioning Management tool&amp;#39;
  
  spec.authors           = [&amp;#39;Rob &amp;quot;FerventCoder&amp;quot; Reynolds&amp;#39;,&amp;#39;Pascal Mestdach&amp;#39;,&amp;#39;Jochen Jonckheere&amp;#39;,&amp;#39;Dru Sellers&amp;#39;]
  spec.email             = &amp;#39;chucknorrisframework@googlegroups.com&amp;#39;
  spec.homepage          = &amp;#39;http://projectroundhouse.org&amp;#39;
  spec.rubyforge_project = &amp;#39;roundhouse&amp;#39;
end&lt;/pre&gt;
&lt;p&gt;3. Just about everything with tick marks above you will edit to suit your needs. spec.name and spec.rubyforge_project (and the gemspec file name) should all match and not be an already existing project name on RubyForge.&lt;/p&gt;
&lt;p&gt;4. If you are a singular author, instead of &lt;em&gt;spec.authors&lt;/em&gt;, replace it with&lt;/p&gt;
&lt;pre name="code" class="ruby"&gt;spec.author = &amp;#39;somebody&amp;#39;&lt;/pre&gt;
&lt;p&gt;You can also set up description for multiple lines.&lt;/p&gt;
&lt;pre name="code" class="ruby"&gt;spec.description = &amp;lt;&amp;lt;-EOF
   Rake is a Make-like program implemented in Ruby. Tasks and
   dependencies are specified in standard Ruby syntax.
 EOF&lt;/pre&gt;
&lt;h4&gt;&lt;strong&gt;Dependencies On Other Libraries &lt;/strong&gt;&lt;/h4&gt;
&lt;p&gt;What we call references. You have a dependency on them existing for your library to run. See this &lt;a target="_blank" href="http://devlicio.us/blogs/rob_reynolds/archive/2010/07/17/how-to-gems-and-net-dependencies-references.aspx"&gt;post&lt;/a&gt;.&lt;/p&gt;
&lt;h4&gt;&lt;strong&gt;VERSION file&lt;/strong&gt;&lt;/h4&gt;
&lt;p&gt;This file is stupid simple. It&amp;rsquo;s a version number. I believe you can put whatever you want in here. Use the Assembly Version number here and stick with the .NET 4 octets of numbers (like &lt;em&gt;0.0.0.0) &lt;/em&gt;for version. &lt;/p&gt;
&lt;p&gt;1. Create a file named VERSION.&lt;/p&gt;
&lt;p&gt;2. Open it in your favorite editor and put the version you want here.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://devlicio.us/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rob_5F00_reynolds/image_5F00_46C15AB5.png"&gt;&lt;img height="119" width="244" src="http://devlicio.us/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rob_5F00_reynolds/image_5F00_thumb_5F00_57C58898.png" alt="VERSION with 0.5.0.242 as contents of file" border="0" title="VERSION with 0.5.0.242 as contents of file" style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;h4&gt;&lt;strong&gt;Libraries&lt;/strong&gt;&lt;/h4&gt;
&lt;p&gt;1. Create a folder called &lt;strong&gt;lib&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://devlicio.us/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rob_5F00_reynolds/image_5F00_046E4272.png"&gt;&lt;img height="153" width="243" src="http://devlicio.us/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rob_5F00_reynolds/image_5F00_thumb_5F00_5CC7C647.png" alt="adding in lib folder" border="0" title="adding in lib folder" style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;2. Copy &lt;strong&gt;YOUR&lt;/strong&gt; compiled DLLs into here. Your references (or dependencies) should not go here. See &lt;a target="_blank" href="http://devlicio.us/blogs/rob_reynolds/archive/2010/07/17/how-to-gems-and-net-dependencies-references.aspx"&gt;How To: Gems and .NET - Dependencies&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;a href="http://devlicio.us/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rob_5F00_reynolds/image_5F00_486B52F9.png"&gt;&lt;img height="434" width="335" src="http://devlicio.us/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rob_5F00_reynolds/image_5F00_thumb_5F00_726B5121.png" alt="Put your dlls in lib folder" border="0" title="Put your dlls in lib folder" style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;h4&gt;&lt;strong&gt;Documentation&lt;/strong&gt;&lt;/h4&gt;
&lt;p&gt;Create a docs folder. In that folder goes your documentation. This could be release notes, a ReadMe, actual documentation. This area is open. Just make sure you add the docs folder to the specification.&lt;/p&gt;
&lt;pre name="code" class="ruby"&gt;spec.files = Dir[&amp;#39;lib/**/*&amp;#39;] + Dir[&amp;#39;docs/**/*&amp;#39;]&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4&gt;&lt;strong&gt;Executables&lt;/strong&gt;&lt;/h4&gt;
&lt;p&gt;If you want to give someone the ability to run an executable from the command line after installing your application with gems, and you use .NET, this is how you do it.&lt;/p&gt;
&lt;p&gt;1. Create a folder named &lt;strong&gt;bin&lt;/strong&gt; as a subdirectory next to the gemspec.&lt;/p&gt;
&lt;p&gt;2. Put your executable (and dependencies) into the bin directory.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://devlicio.us/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rob_5F00_reynolds/image_5F00_0536828F.png"&gt;&lt;img height="171" width="244" src="http://devlicio.us/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rob_5F00_reynolds/image_5F00_thumb_5F00_4494361F.png" alt="create a bin directory" border="0" title="create a bin directory" style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" /&gt;&lt;/a&gt; &lt;a href="http://devlicio.us/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rob_5F00_reynolds/image_5F00_75B370BF.png"&gt;&lt;img height="244" width="222" src="http://devlicio.us/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rob_5F00_reynolds/image_5F00_thumb_5F00_65C42BFB.png" alt="stand alone executable in bin" border="0" title="stand alone executable in bin" style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;3. Create your shim file (it&amp;rsquo;s named what you would type at the command line). I&amp;rsquo;ve called mine &lt;strong&gt;rh&lt;/strong&gt;. The one above allows ruby to be able to actually execute the Windows executable. Let&amp;rsquo;s open it and see what it looks like. This, we learned from an answer to a &lt;a target="_blank" href="http://stackoverflow.com/questions/3250794/gems-with-net-applications-how-do-i-set-up-the-executables-so-they-run-without"&gt;post on stack overflow&lt;/a&gt;.&amp;nbsp; This shim also goes in source control&lt;/p&gt;
&lt;pre name="code" class="ruby"&gt;result = system(File.dirname(__FILE__) + &amp;quot;/rh.exe &amp;quot; + ARGV.join(&amp;#39; &amp;#39;))
exit 1 unless result&lt;/pre&gt;
&lt;p&gt;4. Don&amp;rsquo;t forget that space at the end of your executable name.&lt;/p&gt;
&lt;p&gt;5. Open your gemspec. We need to make sure we have spec.executables filled out and our new directory added to our Files.&lt;/p&gt;
&lt;pre name="code" class="ruby"&gt;version = File.read(File.expand_path(&amp;quot;../VERSION&amp;quot;,__FILE__)).strip

Gem::Specification.new do |spec|
  spec.platform    = Gem::Platform::RUBY
  spec.name        = &amp;#39;roundhouse&amp;#39;
  spec.version     = version
  spec.files = Dir[&amp;#39;lib/**/*&amp;#39;] + Dir[&amp;#39;docs/**/*&amp;#39;] + Dir[&amp;#39;bin/**/*&amp;#39;]
  spec.bindir = &amp;#39;bin&amp;#39;
  spec.executables &amp;lt;&amp;lt; &amp;#39;rh&amp;#39;

  spec.summary     = &amp;#39;RoundhousE - Professional Database Change and Versioning Management&amp;#39;
  spec.description = &amp;#39;RoundhousE is a Professional Database Change and Versioning Management tool&amp;#39;
  
  spec.authors           = [&amp;#39;Rob &amp;quot;FerventCoder&amp;quot; Reynolds&amp;#39;,&amp;#39;Pascal Mestdach&amp;#39;,&amp;#39;Jochen Jonckheere&amp;#39;,&amp;#39;Dru Sellers&amp;#39;]
  spec.email             = &amp;#39;chucknorrisframework@googlegroups.com&amp;#39;
  spec.homepage          = &amp;#39;http://projectroundhouse.org&amp;#39;
  spec.rubyforge_project = &amp;#39;roundhouse&amp;#39;
end&lt;/pre&gt;
&lt;h4&gt;&lt;strong&gt;Build And Push&lt;/strong&gt;&lt;/h4&gt;
&lt;p&gt;You must already have &lt;a target="_blank" href="http://www.ruby-lang.org/en/downloads/"&gt;Ruby&lt;/a&gt; (1.8.6 or better) and &lt;a target="_blank" href="http://rubygems.org/pages/download"&gt;RubyGems&lt;/a&gt; installed and/or updated to at least 1.3.7 (gem update &amp;ndash;system). You will want to use a RubyInstaller version of Ruby under the &lt;strong&gt;Ruby on Windows &lt;/strong&gt;section.&lt;/p&gt;
&lt;p&gt;1. Open a command line and type &lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;gem build &lt;em&gt;&lt;strong&gt;project&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;2. If there are no issues, you should have a gem for upload.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://devlicio.us/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rob_5F00_reynolds/image_5F00_237113B8.png"&gt;&lt;img height="83" width="244" src="http://devlicio.us/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rob_5F00_reynolds/image_5F00_thumb_5F00_378A3041.png" alt="roundhouse-0.5.0.242.gem" border="0" title="roundhouse-0.5.0.242.gem" style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;&lt;a href="http://devlicio.us/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rob_5F00_reynolds/image_5F00_4AA0473E.png"&gt;&lt;img height="83" width="485" src="http://devlicio.us/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rob_5F00_reynolds/image_5F00_thumb_5F00_29ACD497.png" alt="roundhouse-0.5.0.242.gem" border="0" title="roundhouse-0.5.0.242.gem" style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;3. Create an account with &lt;a target="_blank" href="http://rubygems.org/"&gt;RubyGems.org&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;4. Ensure your project name isn&amp;rsquo;t already taken by searching for it. If it is you will need to rename your gemspec file, spec.name, and spec.rubyforge_project to a name that is not taken.&lt;/p&gt;
&lt;p&gt;5. Type the following command:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;gem push &lt;strong&gt;&lt;em&gt;project&lt;/em&gt;&lt;/strong&gt;_&lt;strong&gt;&lt;em&gt;someversionnumbers&lt;/em&gt;&lt;/strong&gt;.gem&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href="http://devlicio.us/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rob_5F00_reynolds/image_5F00_3DD106CF.png"&gt;&lt;img height="57" width="244" src="http://devlicio.us/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rob_5F00_reynolds/image_5F00_thumb_5F00_215414EF.png" alt="gem push roundhouse" border="0" title="gem push roundhouse" style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;6. Let it finish. Head out to rubygems.org and look at your shiny, new gem!&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;a href="http://devlicio.us/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rob_5F00_reynolds/image_5F00_077FDEC0.png"&gt;&lt;img height="244" width="240" src="http://devlicio.us/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rob_5F00_reynolds/image_5F00_thumb_5F00_71694D60.png" alt="sweet!" border="0" title="sweet!" style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;7. Test it.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;gem install &lt;em&gt;&lt;strong&gt;project&lt;/strong&gt;&lt;/em&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;gem uninstall &lt;strong&gt;&lt;em&gt;project&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;FollowUp&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;In my next post, I&amp;rsquo;ll show you how to make it stupid simple. &lt;a target="_blank" href="http://projectuppercut.org"&gt;UppercuT&lt;/a&gt; will support this feature natively so all you have to do is have a directory called gems (at the top level of your source) with the gemspec. During the build, it will create the VERSION file and copy your output the the lib folder (custom step for bin folder will be necessary). Then it will execute a step that builds the gem. All for the price of &amp;ldquo;build&amp;rdquo;. That&amp;rsquo;s coming up in the next blog post. In the meantime, feel free to ask any questions you have. Stay tuned&amp;hellip;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4&gt;&lt;strong&gt;Related Posts&lt;/strong&gt;&lt;/h4&gt;
&lt;p&gt;Before you comment about &amp;ldquo;cluttering&amp;rdquo; the ruby community, please be sure to read this (we&amp;rsquo;re with you on this):&amp;nbsp; &lt;a target="_blank" href="http://devlicio.us/blogs/rob_reynolds/archive/2010/07/19/gems-for-net-community-response.aspx" title="http://devlicio.us/blogs/rob_reynolds/archive/2010/07/19/gems-for-net-community-response.aspx"&gt;http://devlicio.us/blogs/rob_reynolds/archive/2010/07/19/gems-for-net-community-response.aspx&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a target="_blank" href="http://devlicio.us/blogs/rob_reynolds/archive/2010/07/15/gems-package-management-for-net.aspx"&gt;Gems - Package Management for .NET&lt;/a&gt; &amp;amp; &lt;a target="_blank" href="http://devlicio.us/blogs/rob_reynolds/archive/2010/07/17/how-to-gems-and-net-dependencies-references.aspx"&gt;How To &amp;ndash; Gems &amp;amp; .NET - Dependencies (References)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a target="_blank" href="http://devlicio.us/blogs/rob_reynolds/archive/2010/07/20/how-to-uppercut-and-gems.aspx"&gt;Walkthrough - Create Gems Even Easier With a Conventional Build (UppercuT)!&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a target="_blank" href="http://devlicio.us/blogs/rob_reynolds/archive/2010/07/26/the-future-of-net-open-source-software-delivery.aspx"&gt;The Future is Now!&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://devlicio.us/aggbug.aspx?PostID=61095" width="1" height="1"&gt;</description><category domain="http://devlicio.us/blogs/rob_reynolds/archive/tags/HowTo/default.aspx">HowTo</category><category domain="http://devlicio.us/blogs/rob_reynolds/archive/tags/UppercuT/default.aspx">UppercuT</category><category domain="http://devlicio.us/blogs/rob_reynolds/archive/tags/Development/default.aspx">Development</category><category domain="http://devlicio.us/blogs/rob_reynolds/archive/tags/.NET/default.aspx">.NET</category><category domain="http://devlicio.us/blogs/rob_reynolds/archive/tags/Gems/default.aspx">Gems</category></item><item><title>Gems - Package Management For .NET</title><link>http://devlicio.us/blogs/rob_reynolds/archive/2010/07/15/gems-package-management-for-net.aspx</link><pubDate>Fri, 16 Jul 2010 04:27:00 GMT</pubDate><guid isPermaLink="false">40756a8b-6212-4073-9d98-6c26781577de:61091</guid><dc:creator>Rob Reynolds</dc:creator><slash:comments>18</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://devlicio.us/blogs/rob_reynolds/rsscomments.aspx?PostID=61091</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://devlicio.us/blogs/rob_reynolds/commentapi.aspx?PostID=61091</wfw:comment><comments>http://devlicio.us/blogs/rob_reynolds/archive/2010/07/15/gems-package-management-for-net.aspx#comments</comments><description>&lt;p&gt;The Ruby community has enjoyed a great user experience with a package management system they use called Gems. A gem is a package (or a library), compressed with some additional metadata, and can be either source files or binaries. Let&amp;rsquo;s focus on binary gems. We have the same concept in .NET (DLLs/EXEs). You may have references to other DLLs. When you want to update a reference you are using on a project, you may also need to update its dependencies as well. And so on and so forth. A package management project is meant to help make that easier. It&amp;rsquo;s actually really hard to explain what gems or package management without just showing you. So take a look here:&lt;/p&gt;
&lt;p&gt;&amp;nbsp; &lt;a href="http://devlicio.us/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rob_5F00_reynolds/image_5F00_5AC297E8.png"&gt;&lt;img height="181" width="455" src="http://devlicio.us/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rob_5F00_reynolds/image_5F00_thumb_5F00_0456631C.png" alt="gem install sidepop - installed log4net - installed sidepop" border="0" title="gem install sidepop - installed log4net - installed sidepop" style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I type:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;gem install sidepop&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;And that&amp;rsquo;s it. It looks and sees that I have a dependency on log4net. Notice how it nicely just pulls down log4net version 1.2.10 as well? &lt;/p&gt;
&lt;h4&gt;&lt;strong&gt;Background&lt;/strong&gt;&lt;/h4&gt;
&lt;p&gt;I can count on one hand all of the package management projects that have been &lt;a target="_blank" href="http://strangelights.com/blog/archive/2010/05/16/1661.aspx"&gt;started&lt;/a&gt; &lt;a target="_blank" href="http://github.com/dagda1/horn_src"&gt;for&lt;/a&gt; &lt;a target="_blank" href="http://github.com/phatboyg/nu"&gt;.NET&lt;/a&gt;. &lt;a target="_blank" href="http://twitter.com/drusellers"&gt;Dru Sellers&lt;/a&gt;, &lt;a target="_blank" href="http://twitter.com/phatboyg"&gt;Chris Patterson&lt;/a&gt;, and I have talked about package management stuff from time to time. Dru and Chris have been a part of one project (&lt;a target="_blank" href="http://github.com/phatboyg/nu"&gt;Nu&lt;/a&gt;) that has been started several times to start to answer this question. We&amp;rsquo;ve participated on the mailing list for &lt;a target="_blank" href="http://groups.google.com/group/horn-development"&gt;HornGet&lt;/a&gt;. At one point I casually asked why we couldn&amp;rsquo;t just use gems. Other people out there have probably stated the same thing. But no one has really carried the idea forward. Until now.&lt;/p&gt;
&lt;p&gt;Yesterday Dru asked for a &lt;a target="_blank" href="http://code.google.com/p/uppercut/issues/detail?id=16"&gt;gem-ify&lt;/a&gt; feature for &lt;a target="_blank" href="http://projectuppercut.org"&gt;UppercuT&lt;/a&gt;. We started talking and looking at how easy it is to create a gem. Then we figured out how to make the &lt;a target="_blank" href="http://stackoverflow.com/questions/3250794/gems-with-net-applications-how-do-i-set-up-the-executables-so-they-run-without"&gt;executables&lt;/a&gt; piece work as well. This is where you can install a gem and then call the executable from the command line anywhere and get output. From the &lt;a target="_blank" href="http://groups.google.com/group/chucknorrisframework/browse_thread/thread/4f0c0deeadbd61d4"&gt;thread&lt;/a&gt; on &lt;a target="_blank" href="http://groups.google.com/group/chucknorrisframework/"&gt;ChuckNorris&lt;/a&gt; where we talked about this:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Here is something you might find pretty interesting: &lt;a target="_blank" href="http://rubygems.org/gems/roundhouse"&gt;http://rubygems.org/gems/roundhouse&lt;/a&gt;&amp;nbsp;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href="http://rubygems.org/gems/roundhouse"&gt;&lt;/a&gt;If you have ruby installed, you can install roundhouse now from the command line:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;gem install roundhouse&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This gives you the opportunity to type this anywhere:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;rh &amp;lt;options&amp;gt;&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4&gt;&lt;strong&gt;Why Should I Care?&lt;/strong&gt;&lt;/h4&gt;
&lt;p&gt;If you work with Open Source, you know how much of a pain it can be to update your references. You update one library, say NHibernate, and find out that you also need to update your references to Castle. And possibly, you might then need to update your references to log4net. It can be a painful process. This is the start of answering that question.&lt;/p&gt;
&lt;h4&gt;&lt;strong&gt;&lt;strong&gt;&lt;a href="http://devlicio.us/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rob_5F00_reynolds/image_5F00_18034CB0.png"&gt;&lt;img height="221" width="404" src="http://devlicio.us/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rob_5F00_reynolds/image_5F00_thumb_5F00_76A3A713.png" align="right" alt="Right now it&amp;#39;s starting to look like the answer for gems in .NET is just gems." border="0" title="Right now it&amp;#39;s starting to look like the answer for gems in .NET is just gems." style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;margin-left:0px;border-left-width:0px;margin-right:0px;" /&gt;&lt;/a&gt;&lt;/strong&gt;Why Should I Get Excited?&lt;/strong&gt;&lt;/h4&gt;
&lt;p&gt;It sounds like &lt;a target="_blank" href="http://twitter.com/jeremydmiller/statuses/18628012354"&gt;Jeremy Miller&lt;/a&gt; among others are getting excited about this. And why not? We&amp;rsquo;ve been trying to answer the gems question since Ruby made it so easy. &lt;/p&gt;
&lt;p&gt;The implications of this are awesome! I still haven&amp;rsquo;t fully grokked what we&amp;rsquo;ve just opened up.&amp;nbsp; But it&amp;rsquo;s huge! &lt;/p&gt;
&lt;p&gt;It doesn&amp;rsquo;t get us all of the way there to updating the references in our source code folder. That&amp;rsquo;s where projects, like Nu, are going to start showing up that leverage the idea of using the gems infrastructure to get the libraries from the ruby folders to your source code folder. You are going to see UppercuT come back soon with taking care of getting your gem built with the proper version.&lt;/p&gt;
&lt;p&gt;This is the start of something very cool.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4&gt;&lt;strong&gt;Related Posts&lt;/strong&gt;&lt;/h4&gt;
&lt;p&gt;Before you comment about &amp;ldquo;cluttering&amp;rdquo; the ruby community, please be sure to read this (we&amp;rsquo;re with you on this):&amp;nbsp; &lt;a target="_blank" href="http://devlicio.us/blogs/rob_reynolds/archive/2010/07/19/gems-for-net-community-response.aspx" title="http://devlicio.us/blogs/rob_reynolds/archive/2010/07/19/gems-for-net-community-response.aspx"&gt;http://devlicio.us/blogs/rob_reynolds/archive/2010/07/19/gems-for-net-community-response.aspx&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a target="_blank" href="http://devlicio.us/blogs/rob_reynolds/archive/2010/07/16/how-to-gems-and-net.aspx"&gt;How To - Gems and .NET&lt;/a&gt;&amp;nbsp; and &lt;a target="_blank" href="http://devlicio.us/blogs/rob_reynolds/archive/2010/07/17/how-to-gems-and-net-dependencies-references.aspx"&gt;How To &amp;ndash; Gems &amp;amp; .NET - Dependencies (References)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a target="_blank" href="http://devlicio.us/blogs/rob_reynolds/archive/2010/07/20/how-to-uppercut-and-gems.aspx"&gt;Walkthrough &amp;ndash; Create Gems Even Easier With a Conventional Build (UppercuT)!&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a target="_blank" href="http://devlicio.us/blogs/rob_reynolds/archive/2010/07/26/the-future-of-net-open-source-software-delivery.aspx"&gt;The Future is Now!&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://devlicio.us/aggbug.aspx?PostID=61091" width="1" height="1"&gt;</description><category domain="http://devlicio.us/blogs/rob_reynolds/archive/tags/RoundhousE/default.aspx">RoundhousE</category><category domain="http://devlicio.us/blogs/rob_reynolds/archive/tags/SidePOP/default.aspx">SidePOP</category><category domain="http://devlicio.us/blogs/rob_reynolds/archive/tags/UppercuT/default.aspx">UppercuT</category><category domain="http://devlicio.us/blogs/rob_reynolds/archive/tags/Development/default.aspx">Development</category><category domain="http://devlicio.us/blogs/rob_reynolds/archive/tags/Tools/default.aspx">Tools</category><category domain="http://devlicio.us/blogs/rob_reynolds/archive/tags/.NET/default.aspx">.NET</category><category domain="http://devlicio.us/blogs/rob_reynolds/archive/tags/Gems/default.aspx">Gems</category></item><item><title>Deciding On Features For Open Source</title><link>http://devlicio.us/blogs/rob_reynolds/archive/2010/05/15/deciding-on-features-for-open-source.aspx</link><pubDate>Sat, 15 May 2010 23:16:48 GMT</pubDate><guid isPermaLink="false">40756a8b-6212-4073-9d98-6c26781577de:58884</guid><dc:creator>Rob Reynolds</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://devlicio.us/blogs/rob_reynolds/rsscomments.aspx?PostID=58884</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://devlicio.us/blogs/rob_reynolds/commentapi.aspx?PostID=58884</wfw:comment><comments>http://devlicio.us/blogs/rob_reynolds/archive/2010/05/15/deciding-on-features-for-open-source.aspx#comments</comments><description>&lt;blockquote&gt;   &lt;p&gt;“Open source feature selection is subjective.”&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;&lt;a href="http://devlicio.us/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rob_5F00_reynolds/image_5F00_4B21E031.png"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;margin-left:0px;border-left-width:0px;margin-right:0px;" title="Pick a feature" border="0" alt="Pick a feature" align="right" src="http://devlicio.us/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rob_5F00_reynolds/image_5F00_thumb_5F00_0ADBA0EA.png" width="244" height="218" /&gt;&lt;/a&gt; An interesting question was posed to me recently at a &lt;a href="http://devlicio.us/blogs/rob_reynolds/archive/2010/05/15/chicago-alt-net-presentation-aftermath.aspx" target="_blank"&gt;presentation&lt;/a&gt; - “How do you decide what features to include in the [open source] projects you manage?”&lt;/p&gt;  &lt;h4&gt;&lt;strong&gt;&lt;u&gt;Is It Objective?&lt;/u&gt;&lt;/strong&gt;&lt;/h4&gt;  &lt;p&gt;I’d like to say that it’s really objective and that we vote on features and look at what carries the most interest of the populace. Actually no I wouldn’t. I don’t think I would enjoy working on open source (OSS) as much if it someone else decided on what features I should include. It already works that way at work. I don’t want to come home from work and work on things that others decide for me unless I’m being paid for those features. &lt;/p&gt;  &lt;p&gt;So how do I decide on features for our open source projects? I think there are at least three paths to feature selection and they are not necessarily mutually exclusive.&lt;/p&gt;  &lt;h4&gt;&lt;strong&gt;&lt;u&gt;Feature Selection IS the Set of Features For the Domain&lt;/u&gt;&lt;/strong&gt;&lt;/h4&gt;  &lt;p&gt;Your product, in whatever domain it is in, needs to have the basic set of features that make it answer the needs of that domain. That is different for every product, but if you take for example a build tool, at the very least it needs to be able to compile source. And these basic needed features are not always objective either. Two people could completely disagree what makes for a required feature to meet a domain need for a product. Even one person may disagree with himself/herself about what features are needed based on different timeframes. So that leads us down to subjective.&lt;/p&gt;  &lt;h4&gt;&lt;strong&gt;&lt;u&gt;Feature Selection IS An Answer To Competition&lt;/u&gt;&lt;/strong&gt;&lt;/h4&gt;  &lt;p&gt;Some features go in because the competition adds a feature that may draw others away from your product offering. With OSS, there are all free alternatives, so if your competition adds a killer feature and you don’t, there isn’t much other than learning (how to use the other product) to move your customers off to the competition. If you want to keep your customers, you need to be ready to answer the questions of adding the features your competition has added.&amp;#160; &lt;/p&gt;  &lt;p&gt;Sometimes it’s about adding a feature that your competition charges for, but you add it for free. That draws people to the free alternative – so sometimes that adds a motivation to select a feature. Sometimes it’s because you want those features in your product, either to learn how you can answer the question of how to do something and/or because you have a need for that feature and you want it in your product. That also leads us down the road to subjective.&lt;/p&gt;  &lt;h4&gt;&lt;strong&gt;&lt;u&gt;Feature Selection IS Subjective&lt;/u&gt;&lt;/strong&gt;&lt;/h4&gt;  &lt;p&gt;I decide on features based on what I want to see in the product I am working on. Things I am interested in or have the biggest need for usually get picked first, with things that do not interest me either coming later or not at all. Most people get interested in an area of OSS because it solves a need for them and/or they find it interesting. If one of these two things is not happening and they are not being paid, it’s likely that person will move on to something else they find interesting or just stop OSS altogether.&lt;/p&gt;  &lt;p&gt;OSS feature selection is just that – subjective. If it wasn’t, it wouldn’t be opinionated and it wouldn’t have a personality about it. Most people like certain OSS because they like where the product is going or the personalities behind the product. &lt;/p&gt;  &lt;p&gt;For me, I want my products to be easy to use and solve an important problem. If it takes you more than 5-10 minutes to learn how to use my product, I know you are probably going somewhere else. So I pick features that make the product easy to use and learn, and those are not always the simplest features to work on. I work for conventions and make the product opinionated, because I think that is what makes using a product easier, if it already works with little setup. And I like to provide the ability for power users to get in and change the conventions to suit their needs. So those are required features for me above and beyond the domain features. I like to think I do a pretty good job at this. Usually when I present on something I’ve created, I like seeing people’s eyes light up when they see how simple it is to set up a powerful product like &lt;a href="http://projectuppercut.org/" target="_blank"&gt;UppercuT&lt;/a&gt;.&lt;/p&gt;  &lt;h4&gt;&lt;strong&gt;&lt;u&gt;Patches And/Or Donations&lt;/u&gt;&lt;/strong&gt;&lt;/h4&gt;  &lt;p&gt;But remember before you say I’m a bad person or won’t use my product, I’ll always accept patches or I might like the feature that you suggest. If you like using the products I provide and they solve a problem for you the two biggest compliments you can provide are either a patch or a &lt;a href="https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&amp;amp;hosted_button_id=4410250" target="_blank"&gt;donation&lt;/a&gt;.&amp;#160; If you think the product is great, but if it could do this one other thing, it would be awesome(!), then consider contacting me and providing a patch, or consider contacting me with a donation and a request to put the feature in. And alternatively, if it’s a big feature, you could hire me to work on the product to make it even better.&lt;/p&gt;  &lt;h4&gt;&lt;strong&gt;&lt;u&gt;What If There Are Multiple Committers?&lt;/u&gt;&lt;/strong&gt;&lt;/h4&gt;  &lt;p&gt;In the question of multiple committers, I choose that someone always makes the ultimate decision to select whether a feature should be part of a product or not. But for other OSS project maybe this is not the case. If there is not an ultimate decision maker, then there is the possibility of either adding every feature suggested or having a deadlock on two conflicting features. &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;So let me pose this question. If you work on Open Source, how do you decide on what features to put in your open source projects? How do you decide what doesn’t belong? What do you do when there are conflicting features?&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://devlicio.us/aggbug.aspx?PostID=58884" width="1" height="1"&gt;</description><category domain="http://devlicio.us/blogs/rob_reynolds/archive/tags/HowTo/default.aspx">HowTo</category><category domain="http://devlicio.us/blogs/rob_reynolds/archive/tags/UppercuT/default.aspx">UppercuT</category><category domain="http://devlicio.us/blogs/rob_reynolds/archive/tags/Development/default.aspx">Development</category></item><item><title>UppercuT and Mercurial (hg)</title><link>http://devlicio.us/blogs/rob_reynolds/archive/2010/04/21/uppercut-and-mercurial-hg.aspx</link><pubDate>Thu, 22 Apr 2010 04:33:30 GMT</pubDate><guid isPermaLink="false">40756a8b-6212-4073-9d98-6c26781577de:57573</guid><dc:creator>Rob Reynolds</dc:creator><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://devlicio.us/blogs/rob_reynolds/rsscomments.aspx?PostID=57573</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://devlicio.us/blogs/rob_reynolds/commentapi.aspx?PostID=57573</wfw:comment><comments>http://devlicio.us/blogs/rob_reynolds/archive/2010/04/21/uppercut-and-mercurial-hg.aspx#comments</comments><description>&lt;p&gt;I mentioned this awhile back on twitter, but &lt;a href="http://projectuppercut.org" target="_blank"&gt;UppercuT&lt;/a&gt; (UC) has support for Mercurial for versioning your assemblies.&lt;/p&gt;  &lt;p&gt;In the settings file, all you need to do it tell UC to use hg.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://devlicio.us/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rob_5F00_reynolds/uppercut_5F00_HG_5F00_6CF0AFA0.png"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="hg goes in source_control_type" border="0" alt="hg goes in source_control_type" src="http://devlicio.us/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rob_5F00_reynolds/uppercut_5F00_HG_5F00_thumb_5F00_56BA944E.png" width="644" height="58" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;When you build your assemblies, they will use the changeset number in the version, and in the informational version, you get the hash, just like you do when using Git.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://devlicio.us/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rob_5F00_reynolds/uppercut_5F00_hg_5F00_dll_5F00_7C4411AF.png"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="Sweet mother Mary, look what we have here!" border="0" alt="Sweet mother Mary, look what we have here!" src="http://devlicio.us/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rob_5F00_reynolds/uppercut_5F00_hg_5F00_dll_5F00_thumb_5F00_49740B3B.png" width="347" height="251" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;Pretty sweet. By the way, UC also supports .NET 4.0 as of last week. With this knowledge you shall build.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://devlicio.us/aggbug.aspx?PostID=57573" width="1" height="1"&gt;</description><category domain="http://devlicio.us/blogs/rob_reynolds/archive/tags/UppercuT/default.aspx">UppercuT</category><category domain="http://devlicio.us/blogs/rob_reynolds/archive/tags/Development/default.aspx">Development</category><category domain="http://devlicio.us/blogs/rob_reynolds/archive/tags/Tools/default.aspx">Tools</category><category domain="http://devlicio.us/blogs/rob_reynolds/archive/tags/.NET/default.aspx">.NET</category></item><item><title>Chuck Norris Welcomes You</title><link>http://devlicio.us/blogs/rob_reynolds/archive/2010/04/17/chuck-norris-welcomes-you.aspx</link><pubDate>Sat, 17 Apr 2010 14:57:21 GMT</pubDate><guid isPermaLink="false">40756a8b-6212-4073-9d98-6c26781577de:57410</guid><dc:creator>Rob Reynolds</dc:creator><slash:comments>3</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://devlicio.us/blogs/rob_reynolds/rsscomments.aspx?PostID=57410</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://devlicio.us/blogs/rob_reynolds/commentapi.aspx?PostID=57410</wfw:comment><comments>http://devlicio.us/blogs/rob_reynolds/archive/2010/04/17/chuck-norris-welcomes-you.aspx#comments</comments><description>&lt;blockquote&gt;   &lt;p&gt;&amp;#160;&lt;a href="http://www.codesqueeze.com/the-ultimate-top-25-chuck-norris-the-programmer-jokes/" target="_blank"&gt;Chuck Norris doesn’t program with a keyboard. He stares the computer down until it does what he wants.&lt;/a&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;&lt;a href="http://devlicio.us/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rob_5F00_reynolds/image_5F00_62A08492.png"&gt;&lt;img style="border-right-width:0px;margin:10px 0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="Chuck Norris welcomes you" border="0" alt="Chuck Norris welcomes you" align="right" src="http://devlicio.us/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rob_5F00_reynolds/image_5F00_thumb_5F00_42091F13.png" width="174" height="320" /&gt;&lt;/a&gt; All things need a name. We’ve tossed around a bunch of names for the framework of tools we’ve been working on, but one we kept coming back to was Chuck Norris. Why did we choose Chuck Norris? Well Chuck Norris sort of chose us. Everything we talked about, the name kept drawing us closer to it. We couldn’t escape Chuck Norris, no matter how hard we tried. So we gave in.&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;a href="http://www.chucknorrisfacts.com/node/101" target="_blank"&gt;Chuck Norris can divide by zero.&lt;/a&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;h4&gt;&lt;strong&gt;What is the &lt;/strong&gt;&lt;a href="http://groups.google.com/group/chucknorrisframework" target="_blank"&gt;&lt;strong&gt;Chuck Norris Framework&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt;?&lt;u&gt; &lt;/u&gt;&lt;/strong&gt;&lt;/h4&gt;  &lt;p&gt;&lt;a href="http://twitter.com/drusellers" target="_blank"&gt;@drusellers&lt;/a&gt; and I have been working on a variety of tools:&lt;/p&gt;  &lt;p&gt;WarmuP - &lt;a href="http://github.com/chucknorris/warmup" target="_blank"&gt;http://github.com/chucknorris/warmup&lt;/a&gt; (Template your entire project/solution and create projects ready to code - From Zero to a Solution with everything in seconds. Your templates, your choices.)     &lt;br /&gt;UppercuT - &lt;a href="http://projectuppercut.org/"&gt;http://projectuppercut.org&lt;/a&gt; (Build with Conventions - Professional Builds in Moments, Not Days!) | Code also at &lt;a title="http://github.com/chucknorris/uppercut" href="http://github.com/chucknorris/uppercut" target="_blank"&gt;http://github.com/chucknorris/uppercut&lt;/a&gt;     &lt;br /&gt;DropkicK - &lt;a href="http://github.com/chucknorris/dropkick" target="_blank"&gt;http://github.com/chucknorris/dropkick&lt;/a&gt; (Deploy Fluently)     &lt;br /&gt;RoundhousE - &lt;a href="http://projectroundhouse.org/"&gt;http://projectroundhouse.org&lt;/a&gt; (Professional Database Management with Versioning) | Code also at &lt;a title="http://github.com/chucknorris/roundhouse" href="http://github.com/chucknorris/roundhouse" target="_blank"&gt;http://github.com/chucknorris/roundhouse&lt;/a&gt;     &lt;br /&gt;SidePOP - &lt;a href="http://sidepop.googlecode.com/"&gt;http://sidepop.googlecode.com&lt;/a&gt; (Does your application need to check email?)     &lt;br /&gt;HeadlocK - &lt;a href="http://github.com/chucknorris/headlock" target="_blank"&gt;http://github.com/chucknorris/headlock&lt;/a&gt; (Hash a directory so you can later know if anything has changed) &lt;/p&gt;  &lt;p&gt;Others – still in concept or vaporware &lt;/p&gt;  &lt;h4&gt;&lt;strong&gt;What’s in a Name?&lt;/strong&gt;&lt;/h4&gt;  &lt;p&gt;People ask why we choose such violent names for each tool of our framework? At first it was about whipping your code into shape, but after awhile the naming became, “How can we relate this to Chuck Norris?” People also ask why we uppercase the last letter of each name. Well, that’s more about making you ask questions…but there are a few reasons for it. &lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;a href="http://www.codesqueeze.com/the-ultimate-top-25-chuck-norris-the-programmer-jokes" target="_blank"&gt;Project managers never ask Chuck Norris for estimations…ever.&lt;/a&gt; &lt;/p&gt;    &lt;p&gt;&lt;a href="http://www.codesqueeze.com/the-ultimate-top-25-chuck-norris-the-programmer-jokes/" target="_blank"&gt;The class object inherits from Chuck Norris&lt;/a&gt;&lt;/p&gt;    &lt;p&gt;&lt;a href="http://www.codesqueeze.com/the-ultimate-top-25-chuck-norris-the-programmer-jokes/" target="_blank"&gt;Chuck Norris doesn’t need garbage collection because he doesn’t call .Dispose(), he calls .DropKick()&lt;/a&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;h4&gt;&lt;strong&gt;Call To Action&lt;/strong&gt;&lt;/h4&gt;  &lt;p&gt;So what are you waiting for? Join the &lt;a href="http://groups.google.com/group/chucknorrisframework" target="_blank"&gt;Google group&lt;/a&gt; today, download and play with the tools. &lt;/p&gt;  &lt;p&gt;And lastly, welcome to Chuck Norris. Or should I say Chuck Norris welcomes you…&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://devlicio.us/aggbug.aspx?PostID=57410" width="1" height="1"&gt;</description><category domain="http://devlicio.us/blogs/rob_reynolds/archive/tags/RoundhousE/default.aspx">RoundhousE</category><category domain="http://devlicio.us/blogs/rob_reynolds/archive/tags/SidePOP/default.aspx">SidePOP</category><category domain="http://devlicio.us/blogs/rob_reynolds/archive/tags/UppercuT/default.aspx">UppercuT</category><category domain="http://devlicio.us/blogs/rob_reynolds/archive/tags/Development/default.aspx">Development</category><category domain="http://devlicio.us/blogs/rob_reynolds/archive/tags/Tools/default.aspx">Tools</category><category domain="http://devlicio.us/blogs/rob_reynolds/archive/tags/.NET/default.aspx">.NET</category></item><item><title>UppercuT – Custom Extensions Now With PowerShell and Ruby</title><link>http://devlicio.us/blogs/rob_reynolds/archive/2010/03/13/uppercut-custom-extensions-now-with-powershell-and-ruby.aspx</link><pubDate>Sun, 14 Mar 2010 01:43:27 GMT</pubDate><guid isPermaLink="false">40756a8b-6212-4073-9d98-6c26781577de:55934</guid><dc:creator>Rob Reynolds</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://devlicio.us/blogs/rob_reynolds/rsscomments.aspx?PostID=55934</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://devlicio.us/blogs/rob_reynolds/commentapi.aspx?PostID=55934</wfw:comment><comments>http://devlicio.us/blogs/rob_reynolds/archive/2010/03/13/uppercut-custom-extensions-now-with-powershell-and-ruby.aspx#comments</comments><description>&lt;p&gt;&lt;a href="http://devlicio.us/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rob_5F00_reynolds/image_5F00_12EE92D6.png"&gt;&lt;img style="border-right-width:0px;margin:5px 0px 10px 5px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="UppercuT Logo. With attributions to Microsoft for PowerShell Logo and Ruby Association for Ruby Logo" border="0" alt="UppercuT Logo. With attributions to Microsoft for PowerShell Logo and Ruby Association for Ruby Logo" align="right" src="http://devlicio.us/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rob_5F00_reynolds/image_5F00_thumb_5F00_06409A20.png" width="244" height="176" /&gt;&lt;/a&gt; Arguably, one of the most powerful features of &lt;a href="http://projectuppercut.org" target="_blank"&gt;UppercuT&lt;/a&gt; (UC) is the ability to extend any step of the build process with a pre, post, or replace hook. This customization is done in a separate location from the build so you can upgrade without wondering if you broke the build.&lt;/p&gt;  &lt;p&gt;There is a hook before each step of the build has run. There is a hook after. And back to power again, there is a replacement hook. If you don’t like what the step is doing and/or you want to replace it’s entire functionality, you just drop a custom replacement extension and UppercuT will perform the custom step instead.&lt;/p&gt;  &lt;p&gt;Up until recently all custom hooks had to be written in &lt;a href="http://nant.sourceforge.net" target="_blank"&gt;NAnt&lt;/a&gt;. Now they are a little sweeter because you no longer need to use NAnt to extend UC if you don’t want to. You can use &lt;a href="http://go.microsoft.com/fwlink/?LinkID=107116" target="_blank"&gt;PowerShell&lt;/a&gt;. Or &lt;a href="http://www.ruby-lang.org/" target="_blank"&gt;Ruby&lt;/a&gt;.&amp;#160;&amp;#160; Let that sink in for a moment. You don’t have to even need to interact with NAnt at all now.&lt;/p&gt;  &lt;h4&gt;&lt;strong&gt;&lt;u&gt;Extension Points&lt;/u&gt;&lt;/strong&gt;&lt;/h4&gt;  &lt;p&gt;On the &lt;a href="http://uppercut.pbworks.com/"&gt;wiki&lt;/a&gt;, all of the &lt;a href="http://uppercut.pbworks.com/CustomizeUsingExtensionPoints"&gt;extension points&lt;/a&gt; are shown. The basic idea is that you would put whatever customization you are doing in a separate folder named build.custom. Each step Let’s take a look at all we can customize:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;The start point is &lt;strong&gt;default.build. &lt;/strong&gt;It calls build.custom/default.&lt;strong&gt;pre&lt;/strong&gt;.build if it exists, then it runs build/default.build (normal tasks) OR build.custom/default.&lt;strong&gt;replace&lt;/strong&gt;.build if it exists, and finally build.custom/default.&lt;strong&gt;post&lt;/strong&gt;.build if it exists. Every step below runs with the same extension points but changes on the file name it is looking for. &lt;strong&gt;NOTE: If you include default.replace.build, nothing else will run because everything is called from default.build.&lt;/strong&gt;       &lt;ul&gt;       &lt;li&gt;policyChecks.step &lt;/li&gt;        &lt;li&gt;versionBuilder.step &lt;strong&gt;NOTE: If you include build.custom/versionBuilder.replace.step, the items below will not run.&lt;/strong&gt;           &lt;ul&gt;           &lt;li&gt;svn.step, tfs.step, or git.step (the custom tasks for these need to go in build.custom/versioners) &lt;/li&gt;         &lt;/ul&gt;       &lt;/li&gt;        &lt;li&gt;generateBuildInfo.step &lt;/li&gt;        &lt;li&gt;compile.step &lt;/li&gt;        &lt;li&gt;environmentBuilder.step &lt;/li&gt;        &lt;li&gt;analyze.step &lt;strong&gt;NOTE: If you include build.custom/analyze.replace.step, the items below will not run.&lt;/strong&gt;           &lt;ul&gt;           &lt;li&gt;test.step (the custom tasks for this need to go in build.custom/analyzers) &lt;strong&gt;NOTE: If you include build.custom/analyzers/test.replace.step, the items below will not run.&lt;/strong&gt;               &lt;ul&gt;               &lt;li&gt;mbunit2.step, gallio.step, or nunit.step (the custom tasks for these need to go in build.custom/analyzers) &lt;/li&gt;             &lt;/ul&gt;           &lt;/li&gt;            &lt;li&gt;ncover.step (the custom tasks for this need to go in build.custom/analyzers) &lt;/li&gt;            &lt;li&gt;ndepend.step (the custom tasks for this need to go in build.custom/analyzers) &lt;/li&gt;            &lt;li&gt;moma.step (the custom tasks for this need to go in build.custom/analyzers) &lt;/li&gt;         &lt;/ul&gt;       &lt;/li&gt;        &lt;li&gt;package.step &lt;strong&gt;NOTE: If you include build.custom/package.replace.step, the items below will not run.&lt;/strong&gt;           &lt;ul&gt;           &lt;li&gt;deploymentBuilder.step &lt;/li&gt;         &lt;/ul&gt;       &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt; &lt;/ul&gt;  &lt;h4&gt;&lt;strong&gt;&lt;u&gt;Customize UppercuT Builds With PowerShell&lt;/u&gt;&lt;/strong&gt;&lt;/h4&gt;  &lt;p&gt;UppercuT can now be extended with PowerShell (PS). To customize any extension point with PS, just add &lt;strong&gt;.ps1&lt;/strong&gt; to the end of the file name and write your custom tasks in PowerShell.&lt;/p&gt;  &lt;p&gt;If you are not signing your scripts you will need to change a setting in the &lt;a href="http://uppercut.pbworks.com/UppercuT_config"&gt;UppercuT.config&lt;/a&gt; file. This does impose a security risk, because this allows PS to now run any PS script. This setting stays that way on &lt;strong&gt;ANY&lt;/strong&gt; machine that runs the build until manually changed by someone. I’m not responsible if you mess up your machine or anyone else’s by doing this. You’ve been warned.&lt;/p&gt;  &lt;p&gt;Now that you are fully aware of any security holes you may open and are okay with that, let’s move on. &lt;/p&gt;  &lt;p&gt;Let’s create a file called &lt;strong&gt;default.replace.build.ps1&lt;/strong&gt; in the &lt;strong&gt;build.custom&lt;/strong&gt; folder.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://devlicio.us/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rob_5F00_reynolds/image_5F00_51BFC7D7.png"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="default.replace.build.ps1" border="0" alt="default.replace.build.ps1" src="http://devlicio.us/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rob_5F00_reynolds/image_5F00_thumb_5F00_74C0137A.png" width="371" height="360" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Open that file in notepad and let’s add this to it:&lt;/p&gt;  &lt;pre&gt;write-host &amp;quot;hello - I&amp;#39;m a custom task written in Powershell!&amp;quot;&lt;/pre&gt;

&lt;p&gt;Now, let’s run build.bat.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://devlicio.us/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rob_5F00_reynolds/image_5F00_1DE7ABB9.png"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="I&amp;#39;m a custom task written in PowerShell!" border="0" alt="I&amp;#39;m a custom task written in PowerShell!" src="http://devlicio.us/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rob_5F00_reynolds/image_5F00_thumb_5F00_787DB84A.png" width="511" height="237" /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;You could get some &lt;a href="http://code.google.com/p/psake/"&gt;PSake&lt;/a&gt; action going here. I won’t dive into that in this post though.&lt;/p&gt;

&lt;h4&gt;&lt;strong&gt;&lt;u&gt;Customize UppercuT Builds With Ruby&lt;/u&gt;&lt;/strong&gt;&lt;/h4&gt;

&lt;p&gt;If you want to customize any extension point with Ruby, just add &lt;strong&gt;.rb&lt;/strong&gt; to the end of the file name and write your custom tasks in Ruby.&amp;#160; Let’s write a custom ruby task for UC. If you were thinking it would be the same as the one we just wrote for PS, you’d be right! &lt;/p&gt;

&lt;p&gt;In the &lt;strong&gt;build.custom&lt;/strong&gt; folder, lets create a file called &lt;strong&gt;default.replace.build.rb&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://devlicio.us/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rob_5F00_reynolds/image_5F00_227DB673.png"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="default.replace.build.rb. Ya. Ruby" border="0" alt="default.replace.build.rb. Ya. Ruby" src="http://devlicio.us/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rob_5F00_reynolds/image_5F00_thumb_5F00_7992A169.png" width="330" height="273" /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Open that file in notepad and let’s put this in there:&lt;/p&gt;

&lt;pre class="ruby" name="code"&gt;puts &amp;quot;I&amp;#39;m a custom ruby task!&amp;quot;&lt;/pre&gt;

&lt;p&gt;Now, let’s run build.bat again.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://devlicio.us/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rob_5F00_reynolds/image_5F00_65990ED3.png"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="I&amp;#39;m a custom ruby task!" border="0" alt="I&amp;#39;m a custom ruby task!" src="http://devlicio.us/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rob_5F00_reynolds/image_5F00_thumb_5F00_5C5CD392.png" width="665" height="269" /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;That’s chunky bacon.&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;h4&gt;&lt;strong&gt;&lt;u&gt;UppercuT and Albacore.NET&lt;/u&gt;&lt;/strong&gt;&lt;/h4&gt;

&lt;p&gt;Just for fun, I wanted to see if I could replace the compile.step with a Rake task. Not just any rake task, &lt;a href="http://albacorebuild.net/"&gt;Albacore’s&lt;/a&gt; msbuild task. &lt;a href="http://albacorebuild.net/"&gt;Albacore&lt;/a&gt; is a suite of rake tasks brought about by &lt;a href="http://www.lostechies.com/blogs/derickbailey"&gt;Derick Bailey&lt;/a&gt; to make building .NET with Rake easier. It has quite a bit of support with developers that are using Rake to build code. &lt;/p&gt;

&lt;p&gt;In my build.custom folder, I drop a compile.replace.step.rb. I also put in a separate file that will contain my Albacore rake task and I call that compile.rb.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://devlicio.us/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rob_5F00_reynolds/image_5F00_68EA80AE.png"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="compile.replace.step.rb" border="0" alt="compile.replace.step.rb" src="http://devlicio.us/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rob_5F00_reynolds/image_5F00_thumb_5F00_4CF94BB6.png" width="424" height="369" /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;What are the contents of &lt;strong&gt;compile.replace.step.rb&lt;/strong&gt;?&lt;/p&gt;

&lt;pre class="ruby" name="code"&gt;rake = &amp;#39;rake&amp;#39;
arguments= &amp;#39;-f &amp;#39; + Dir.pwd + &amp;#39;/../build.custom/compile.rb&amp;#39;

#puts &amp;quot;Calling #{rake} &amp;quot; + arguments
system(&amp;quot;#{rake} &amp;quot; + arguments)&lt;/pre&gt;

&lt;p&gt;Since the custom extensions call ruby, we have to shell back out and call rake. That’s what we are doing here. We also realize that ruby is called from the build folder, so we need to back out and dive into the build.custom folder to find the file that is technically next to us.&lt;/p&gt;

&lt;p&gt;What are the contents of &lt;strong&gt;compile.rb&lt;/strong&gt;?&lt;/p&gt;

&lt;pre class="ruby" name="code"&gt;require &amp;#39;rubygems&amp;#39;
require &amp;#39;fileutils&amp;#39;
require &amp;#39;albacore&amp;#39;

task :default =&amp;gt; [:compile]

puts &amp;quot;Using Ruby to compile UppercuT with Albacore Tasks&amp;quot;
desc &amp;#39;Compile the source&amp;#39;
msbuild :compile do |msb|
  msb.properties = { :configuration =&amp;gt; :Release, :outputpath =&amp;gt; &amp;#39;../../build_output/UppercuT&amp;#39; }
  msb.targets [:clean, :build]
  msb.verbosity = &amp;quot;quiet&amp;quot;
  msb.path_to_command = &amp;#39;c:/Windows/Microsoft.NET/Framework/v3.5/MSBuild.exe&amp;#39;
  msb.solution = &amp;#39;../uppercut.sln&amp;#39;
end&lt;/pre&gt;

&lt;p&gt;We are using the msbuild task here. We change the output path to the build_output/UppercuT folder. The output path has “../../” because this is based on every project. We could grab the current directory and then point the task specifically to a folder if we have projects that are at different levels. We want the verbosity to be quiet so we set that as well.&lt;/p&gt;

&lt;p&gt;So what kind of output do you get for this? Let’s run build.bat&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;custom_tasks_replace: &lt;/p&gt;

  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; [echo] Running custom tasks instead of normal tasks if C:\code\uppercut\build\..\build.custom\compile.replace.step exists. 
    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; [exec] (in C:/code/uppercut/build) 

    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; [exec] &lt;strong&gt;Using Ruby to compile UppercuT with Albacore Tasks&lt;/strong&gt; 

    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; [exec] Microsoft (R) Build Engine Version 3.5.30729.4926 

    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; [exec] [Microsoft .NET Framework, Version 2.0.50727.4927] 

    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; [exec] Copyright (C) Microsoft Corporation 2007. All rights reserved.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;If you think this is awesome, you’d be right!&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;With this knowledge you shall build.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://devlicio.us/aggbug.aspx?PostID=55934" width="1" height="1"&gt;</description><category domain="http://devlicio.us/blogs/rob_reynolds/archive/tags/HowTo/default.aspx">HowTo</category><category domain="http://devlicio.us/blogs/rob_reynolds/archive/tags/UppercuT/default.aspx">UppercuT</category><category domain="http://devlicio.us/blogs/rob_reynolds/archive/tags/Development/default.aspx">Development</category><category domain="http://devlicio.us/blogs/rob_reynolds/archive/tags/.NET/default.aspx">.NET</category></item><item><title>Virtual Alt.NET – UppercuT Automated Builds</title><link>http://devlicio.us/blogs/rob_reynolds/archive/2010/02/24/virtual-alt-net-uppercut-automated-builds.aspx</link><pubDate>Wed, 24 Feb 2010 06:06:22 GMT</pubDate><guid isPermaLink="false">40756a8b-6212-4073-9d98-6c26781577de:55511</guid><dc:creator>Rob Reynolds</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://devlicio.us/blogs/rob_reynolds/rsscomments.aspx?PostID=55511</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://devlicio.us/blogs/rob_reynolds/commentapi.aspx?PostID=55511</wfw:comment><comments>http://devlicio.us/blogs/rob_reynolds/archive/2010/02/24/virtual-alt-net-uppercut-automated-builds.aspx#comments</comments><description>&lt;p&gt;Tonight (February 24th, 2010) I’m going to be giving a &lt;a href="http://virualaltnet.blogspot.com/2010/02/from-zero-to-professional-build-in.html" target="_blank"&gt;presentation&lt;/a&gt; on &lt;a href="http://projectuppercut.org/" target="_blank"&gt;UppercuT&lt;/a&gt; (UC) at &lt;a href="http://www.virtualaltnet.com/" target="_blank"&gt;Virtual Alt.NET&lt;/a&gt; (VAN). If you are interested in learning about an automated build tool that will save you time and get you to a professional build in moments, not days, you can log into the &lt;a href="http://www.virtualaltnet.com/" target="_blank"&gt;VAN&lt;/a&gt; around 8PM CST on Wednesday (tomorrow). You don’t even have to go to a physical place to see the presentation! You can hang out from the comfort of your own home and watch me walk through how easy it is to use UC.&lt;/p&gt;  &lt;p&gt;Here is a link to the live meeting: &lt;a title="http://www.virtualaltnet.com/van" href="http://www.virtualaltnet.com/van" target="_blank"&gt;http://www.virtualaltnet.com/van&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;If you’ve seen my presentation of UC before, this will be similar but more focused on examples and samples.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://devlicio.us/aggbug.aspx?PostID=55511" width="1" height="1"&gt;</description><category domain="http://devlicio.us/blogs/rob_reynolds/archive/tags/UppercuT/default.aspx">UppercuT</category><category domain="http://devlicio.us/blogs/rob_reynolds/archive/tags/Development/default.aspx">Development</category><category domain="http://devlicio.us/blogs/rob_reynolds/archive/tags/.NET/default.aspx">.NET</category><category domain="http://devlicio.us/blogs/rob_reynolds/archive/tags/Events/default.aspx">Events</category></item><item><title>Warmup – Getting Started</title><link>http://devlicio.us/blogs/rob_reynolds/archive/2010/02/01/warmup-getting-started.aspx</link><pubDate>Mon, 01 Feb 2010 14:25:00 GMT</pubDate><guid isPermaLink="false">40756a8b-6212-4073-9d98-6c26781577de:55241</guid><dc:creator>Rob Reynolds</dc:creator><slash:comments>3</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://devlicio.us/blogs/rob_reynolds/rsscomments.aspx?PostID=55241</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://devlicio.us/blogs/rob_reynolds/commentapi.aspx?PostID=55241</wfw:comment><comments>http://devlicio.us/blogs/rob_reynolds/archive/2010/02/01/warmup-getting-started.aspx#comments</comments><description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;What if there was a tool out there that could let you specify a structure for a project (visual studio solution + everything else) and save you up to 3+ hours of work every time you started a new project?&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a target="_blank" href="http://github.com/drusellers/warmup"&gt;Warmup&lt;/a&gt; was an idea by &lt;a target="_blank" href="http://codebetter.com/blogs/dru.sellers/archive/2009/09/25/warmup.aspx"&gt;Dru Sellers&lt;/a&gt; to remove all of the setup work required every time you set up a new project. You know, create the solution, add projects, put in your references, etc. Then how about getting the infrastructure for your service/website/console set up as well with things like IoC, etc? What about patterns and other pet items that you put in any project?&lt;/p&gt;
&lt;p&gt;Yeah &amp;ndash; there&amp;rsquo;s an app for that. And it&amp;rsquo;s pretty simple to use. Plus you can change your templates when you have new ideas, so it&amp;rsquo;s totally rockstar! &lt;/p&gt;
&lt;p&gt;The first thing you do is to set up templates somewhere in source control (svn or git). Then you specify where that is to the configuration and what type of source control.&lt;/p&gt;
&lt;pre name="code" class="xml"&gt;&amp;lt;warmup
  sourceControlWarmupLocation=&amp;quot;git://github.com/ferventcoder/warmup-templates.git&amp;quot;
  sourceControlType=&amp;quot;git&amp;quot;
  /&amp;gt;&lt;/pre&gt;
&lt;p&gt;Then you run a simple command. If base was one of the folders below the directory above my source control, then that is what I would specify as the first argument.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;warmup.exe base &lt;em&gt;nameOfProject&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href="http://devlicio.us/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rob_5F00_reynolds/image_5F00_3D2669E1.png"&gt;&lt;img height="209" width="243" src="http://devlicio.us/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rob_5F00_reynolds/image_5F00_thumb_5F00_5549D43C.png" alt="The base is a template" border="0" title="The base is a template" style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;I specify &lt;em&gt;nameofProject&lt;/em&gt;. That is what I want my project to be named when I am complete.&amp;nbsp; &lt;/p&gt;
&lt;h4&gt;&lt;strong&gt;&lt;span style="text-decoration:underline;"&gt;Templating&lt;/span&gt;&lt;/strong&gt;&lt;/h4&gt;
&lt;p&gt;Let&amp;rsquo;s start by taking a look at the base template. The basic idea here is simple. Place &lt;strong&gt;__NAME__&lt;/strong&gt; everywhere you want to be replaced when running Warmup. In the same way &lt;a target="_blank" href="http://projectuppercut.org"&gt;UppercuT&lt;/a&gt; does token replacement with ConfigBuilder, DocBuilder, SqlBuilder, and DeployBuilder, Warmup does token replacement for an entire solution.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://devlicio.us/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rob_5F00_reynolds/image_5F00_66BA3514.png"&gt;&lt;img height="484" width="258" src="http://devlicio.us/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rob_5F00_reynolds/image_5F00_thumb_5F00_4AC9001C.png" alt="__NAME__ for replacement" border="0" title="__NAME__ for replacement" style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;If we were to look at some of the files you would see the absolute depth of how naming really can be replaced. Let&amp;rsquo;s take a look at the solution though, that will hold quite a bit of meaning for you.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://devlicio.us/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rob_5F00_reynolds/image_5F00_156FC7EA.png"&gt;&lt;img height="378" width="338" src="http://devlicio.us/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rob_5F00_reynolds/image_5F00_thumb_5F00_6D5D18CA.png" alt="From Visual Studio - __NAME__ is everywhere" border="0" title="From Visual Studio - __NAME__ is everywhere" style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;Now that we have our template all set up, we have one thing to do. Open our .sln file in Notepad and delete the first line (not sure what happens here, but this works). Microsoft should be on the first line when we are done.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://devlicio.us/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rob_5F00_reynolds/image_5F00_7337BC63.png"&gt;&lt;img height="145" width="244" src="http://devlicio.us/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rob_5F00_reynolds/image_5F00_thumb_5F00_127A6337.png" alt="__NAME__.sln first line must be deleted." border="0" title="__NAME__.sln first line must be deleted." style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;And now our template is all ready, so we check our changes into source. If we are using git, we need to push back to the repository we are looking at after we finish committing.&lt;/p&gt;
&lt;h4&gt;&lt;strong&gt;&lt;span style="text-decoration:underline;"&gt;Run Warmup&lt;/span&gt;&lt;/strong&gt;&lt;/h4&gt;
&lt;p&gt;Now that we&amp;rsquo;ve seen our template, let&amp;rsquo;s run Warmup.&lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s call the new project &lt;strong&gt;Alpha&lt;/strong&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;warmup.exe base Alpha&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This is the output: &lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Hardcore git cloning action to: C:\code\warmup\code_drop\warmup\Alpha &lt;br /&gt;Running: cmd&amp;nbsp; /c git clone git://github.com/ferventcoder/warmup-templates.git C:\code\warmup\code_drop\warmup\Alpha &lt;br /&gt;Initialized empty Git repository in C:/code/warmup/code_drop/warmup/Alpha/.git/ &lt;/p&gt;
&lt;p&gt;replacing tokens&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href="http://devlicio.us/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rob_5F00_reynolds/image_5F00_74B8D877.png"&gt;&lt;img height="231" width="244" src="http://devlicio.us/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rob_5F00_reynolds/image_5F00_thumb_5F00_612B78D6.png" alt="image" border="0" title="image" style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" /&gt;&lt;/a&gt;&amp;nbsp; &lt;a href="http://devlicio.us/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rob_5F00_reynolds/image_5F00_4612A9C8.png"&gt;&lt;img height="244" width="222" src="http://devlicio.us/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rob_5F00_reynolds/image_5F00_thumb_5F00_102DB4AE.png" alt="__NAME__ is replaced with Alpha when running Warmup" border="0" title="__NAME__ is replaced with Alpha when running Warmup" style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;This project already has &lt;a target="_blank" href="http://projectuppercut.org"&gt;UppercuT&lt;/a&gt;, &lt;a target="_blank" href="http://projectroundhouse.org"&gt;RoundhousE&lt;/a&gt;, and others already in it. Take a look at the lib folder:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://devlicio.us/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rob_5F00_reynolds/image_5F00_55660BD7.png"&gt;&lt;img height="244" width="182" src="http://devlicio.us/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rob_5F00_reynolds/image_5F00_thumb_5F00_42B11220.png" alt="All of my references are good" border="0" title="All of my references are good" style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;I open a command line and run build.bat.&amp;nbsp; I get a successful build with 31 passing tests! If I were to go to the code_drop folder, I&amp;rsquo;m all ready to deploy if I had my deployment framework already here. &lt;/p&gt;
&lt;p&gt;I can already run RoundhousE and create my database from here:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://devlicio.us/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rob_5F00_reynolds/image_5F00_4C29D096.png"&gt;&lt;img height="173" width="244" src="http://devlicio.us/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rob_5F00_reynolds/image_5F00_thumb_5F00_2CD703F6.png" alt="Output from RoundhousE" border="0" title="Output from RoundhousE" style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;&lt;a href="http://devlicio.us/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rob_5F00_reynolds/image_5F00_0B0B2B65.png"&gt;&lt;img height="172" width="244" src="http://devlicio.us/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rob_5F00_reynolds/image_5F00_thumb_5F00_69AB85C8.png" alt="Database is created and we are ready to rock!" border="0" title="Database is created and we are ready to rock!" style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;h4&gt;&lt;strong&gt;&lt;span style="text-decoration:underline;"&gt;Conclusion&lt;/span&gt;&lt;/strong&gt;&lt;/h4&gt;
&lt;p&gt;I have an entire structure that allows me to just concentrate on the stories at hand. Warmup may not be the best thing since sliced bread, but it&amp;rsquo;s going to save you oodles of time! If you know someone else that has created a template you want to use and it&amp;rsquo;s shared publicly, you can just edit the config file to point there. We have been using warmup for close to 3 months now and it saves us quite a bit of time. Plus we find more and more things we can put back into the templates to save us time. I believe this aspect of learning and growing your templates over time is the intention of warmup. Plus your template may not be the same as mine and that&amp;rsquo;s completely cool!&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://devlicio.us/aggbug.aspx?PostID=55241" width="1" height="1"&gt;</description><category domain="http://devlicio.us/blogs/rob_reynolds/archive/tags/RoundhousE/default.aspx">RoundhousE</category><category domain="http://devlicio.us/blogs/rob_reynolds/archive/tags/HowTo/default.aspx">HowTo</category><category domain="http://devlicio.us/blogs/rob_reynolds/archive/tags/UppercuT/default.aspx">UppercuT</category><category domain="http://devlicio.us/blogs/rob_reynolds/archive/tags/Development/default.aspx">Development</category><category domain="http://devlicio.us/blogs/rob_reynolds/archive/tags/Tools/default.aspx">Tools</category><category domain="http://devlicio.us/blogs/rob_reynolds/archive/tags/.NET/default.aspx">.NET</category></item><item><title>Two Major Milestones for RoundhousE and UppercuT</title><link>http://devlicio.us/blogs/rob_reynolds/archive/2010/01/01/two-major-milestones-for-roundhouse-and-uppercut.aspx</link><pubDate>Fri, 01 Jan 2010 21:04:21 GMT</pubDate><guid isPermaLink="false">40756a8b-6212-4073-9d98-6c26781577de:54860</guid><dc:creator>Rob Reynolds</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://devlicio.us/blogs/rob_reynolds/rsscomments.aspx?PostID=54860</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://devlicio.us/blogs/rob_reynolds/commentapi.aspx?PostID=54860</wfw:comment><comments>http://devlicio.us/blogs/rob_reynolds/archive/2010/01/01/two-major-milestones-for-roundhouse-and-uppercut.aspx#comments</comments><description>&lt;p&gt;This last year I had a focus to get more involved in Open Source (OSS). The year before I had been involved a little by submitting a patch here and there, but 2009 was a big year for me in OSS. I now manage 4 open source projects that have solved a need for me and others. Coming up on the end of the year it was important for me to get some final touches into at least two projects to finish out the year.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h4&gt;&lt;a href="http://devlicio.us/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rob_5F00_reynolds/image_5F00_587E2919.png"&gt;&lt;img style="border-right-width:0px;margin:0px 5px 0px 1px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="UppercuT, http://projectuppercut.org" border="0" alt="UppercuT, http://projectuppercut.org" align="left" src="http://devlicio.us/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rob_5F00_reynolds/image_5F00_thumb_5F00_5AF7350A.png" width="244" height="174" /&gt;&lt;/a&gt; &lt;/h4&gt;  &lt;h4&gt;&lt;strong&gt;&lt;u&gt;UppercuT&lt;/u&gt;&lt;/strong&gt;&lt;/h4&gt;  &lt;p&gt;&lt;a href="http://projectuppercut.org/" target="_blank"&gt;UppercuT&lt;/a&gt; (UC), for those of you who have never heard of it, is an automated build tool that uses conventions to build your code. That means that you can have a professional build for most projects out of the box within 3 minutes! You drop it into a project, update a simple configuration and you’re done.&amp;#160; It is also extendable (to the point of steps being completely replaced) so it’s very powerful. The goals we had for UC when we started it are that it’s insanely easy to use, easy to upgrade your builds, and easy to extend. It has met all of those goals and has some features that other build tools do not have (versioning out of the box and templating for configurations, documents, sql, deployment files, etc to name a couple). Check it out at &lt;a href="http://projectuppercut.org" target="_blank"&gt;http://projectuppercut.org&lt;/a&gt;. &lt;/p&gt;  &lt;p&gt;So what &lt;strong&gt;milestone&lt;/strong&gt; did we finish for UC? When the project started, there were plans for support for multiple types of source control for versioning the assemblies. We supported Subversion (SVN) from the beginning, but the priority for other types was lower. I’m pleased to announce that in the last two months we’ve added both TFS and GIT. The GIT one is a little more interesting. It follows what is suggested for versioning by &lt;a href="http://codeprairie.net/blogs/chrisortman/default.aspx" target="_blank"&gt;Chris Ortman&lt;/a&gt;, &lt;a href="http://gitfu.wordpress.com/2008/05/25/git-describe-great-another-way-to-refer-to-commits/" target="_blank"&gt;GitFu&lt;/a&gt; and in the &lt;a href="http://www.kernel.org/pub/software/scm/git/docs/git-describe.html" target="_blank"&gt;Git&lt;/a&gt; documentation. We also go the extra mile to show the SHA1 as well so you could theoretically get to that version.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://devlicio.us/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rob_5F00_reynolds/image_5F00_1837E9D2.png"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="Git Versioning with UppercuT - two types of versioning" border="0" alt="Git Versioning with UppercuT - two types of versioning" src="http://devlicio.us/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rob_5F00_reynolds/image_5F00_thumb_5F00_3D25847E.png" width="244" height="235" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;How easy is it to do versioning with Git? Assuming you have a git repository, you crack open the configuration and change your source control to git:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://devlicio.us/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rob_5F00_reynolds/image_5F00_4729FFDC.png"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="GIT &amp;#39;er DONE!!!" border="0" alt="GIT &amp;#39;er DONE!!!" src="http://devlicio.us/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rob_5F00_reynolds/image_5F00_thumb_5F00_4C987080.png" width="644" height="56" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;If you’ve used UppercuT in the past or have been dying to try it out, set a goal to look at the &lt;a href="http://code.google.com/p/uppercut/downloads/list" target="_blank"&gt;latest verion&lt;/a&gt; this year before February.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h4&gt;&lt;a href="http://devlicio.us/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rob_5F00_reynolds/image_5F00_2987FF10.png"&gt;&lt;img style="border-right-width:0px;margin:0px 1px 0px 5px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="RoundhousE, http://projectroundhouse.org" border="0" alt="RoundhousE, http://projectroundhouse.org" align="right" src="http://devlicio.us/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rob_5F00_reynolds/image_5F00_thumb_5F00_697E42FD.png" width="244" height="232" /&gt;&lt;/a&gt; &lt;strong&gt;&lt;u&gt;RoundhousE&lt;/u&gt;&lt;/strong&gt;&lt;/h4&gt;  &lt;p&gt;&lt;a href="http://projectroundhouse.org/" target="_blank"&gt;RoundhousE&lt;/a&gt; (RH), for those of you who have not heard of it, is a database migrations tool that uses SQL Scripts. RH is kind of like &lt;a href="http://tarantino.googlecode.com" target="_blank"&gt;Tarantino&lt;/a&gt;. We had originally wanted to contribute our ideas to Tarantino, but some of the goals for the two didn’t line up nicely so RoundhousE was born. RoundhousE runs update scripts (the goal is DDL/DML only), but it also looks for other scripts in other folders (like functions, views, and sprocs). The reasoning for the separation is so that versioning and seeing version history is much cleaner in source control. RH also versions databases the way you want. We prefer to &lt;a href="http://ferventcoder.com/archive/2009/11/19/roundhouse-version-your-database.aspx" target="_blank"&gt;version our databases based on source control&lt;/a&gt;, but it is extendable to be versioned in any way (or not at all). RH has an MSBuild task, a NAnt task, but most importantly, a command line console (rh.exe). Everything is &lt;a href="http://ferventcoder.com/archive/2009/11/15/roundhouse-configuration.aspx" target="_blank"&gt;configurable&lt;/a&gt; (including the version and scripts run tables).&amp;#160; Check it out at &lt;a href="http://projectroundhouse.org" target="_blank"&gt;http://projectroundhouse.org&lt;/a&gt;. RH has quite an extensive roadmap for where it is going (we are moving it to be a total migration package, not just a migration runner).&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;So what &lt;strong&gt;milestone&lt;/strong&gt; did we finish for RH? Making RH environment aware so you can execute environment specific scripts. Why would you want to do that? What if you wanted to insert a bunch of test data into your database but didn’t want that to get into production? What if you want to grant permissions to different users in different environments? &lt;/p&gt;  &lt;p&gt;Here I have a set of permissions scripts. Notice they are environment specific. &lt;/p&gt;  &lt;p&gt;&lt;a href="http://devlicio.us/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rob_5F00_reynolds/image_5F00_3B444743.png"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="Couple of scripts" border="0" alt="Couple of scripts" src="http://devlicio.us/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rob_5F00_reynolds/image_5F00_thumb_5F00_4CB4A81B.png" width="388" height="84" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Notice also that they have two things. They have “&lt;strong&gt;.ENV.&lt;/strong&gt;” in the name to let RH know they are environment scripts. Then they also have the name of the specific environment (&lt;strong&gt;LOCAL, TEST&lt;/strong&gt;) they should be run in. By the way, If you use UC and templating, you only maintain one file in source control and the file per environment is generated at build time (I digress). So we have some environment files and now I run RH to migrate my database.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://devlicio.us/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rob_5F00_reynolds/image_5F00_52FB7EA9.png"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="Lots of RH automated goodness here." border="0" alt="Lots of RH automated goodness here." src="http://devlicio.us/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rob_5F00_reynolds/image_5F00_thumb_5F00_3D8DA374.png" width="644" height="369" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;We can see from the log notes below that it only runs the LOCAL environment script in the LOCAL environment.&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;LOCAL.GrantRobDataReaderDataWriterPermissions.ENV.sql is an environment file. We are in the LOCAL environment. This will run based on this check.      &lt;br /&gt;Running LOCAL.GrantRobDataReaderDataWriterPermissions.ENV.sql on (local) - TestRoundhousE.       &lt;br /&gt;TEST.GrantRobDataReaderDataWriterPermissions.ENV.sql is an environment file. We are in the LOCAL environment. &lt;strong&gt;This will NOT run based on this check.&lt;/strong&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;And to be sure, let’s take a peek in the database:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://devlicio.us/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rob_5F00_reynolds/image_5F00_5CC0247A.png"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="View of ScriptsRun table with run output" border="0" alt="View of ScriptsRun table with run output" src="http://devlicio.us/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/rob_5F00_reynolds/image_5F00_thumb_5F00_364E1B62.png" width="644" height="283" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;If you’ve looked at RoundhousE in the past or haven’t yet looked at it, it’s worth &lt;a href="http://code.google.com/p/roundhouse/downloads/list" target="_blank"&gt;downloading&lt;/a&gt; and running the sample to see what it can do.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;By the way, you’ve probably noticed that have a definite theme with our developer automation tool suite (&lt;a href="http://codebetter.com/blogs/dru.sellers/archive/2009/09/25/warmup.aspx" target="_blank"&gt;WarmuP&lt;/a&gt;, &lt;a href="http://projectuppercut.org/" target="_blank"&gt;UppercuT&lt;/a&gt;, &lt;a href="http://projectroundhouse.org/" target="_blank"&gt;RoundhousE&lt;/a&gt;, &lt;a href="http://codebetter.com/blogs/dru.sellers/archive/2009/05/29/dropkick-an-idea-for-deployments.aspx" target="_blank"&gt;DropkicK&lt;/a&gt;, &lt;a href="http://github.com/drusellers/headlock" target="_blank"&gt;HeadlocK&lt;/a&gt;, and &lt;a href="http://sidepop.googlecode.com/" target="_blank"&gt;SidePOP&lt;/a&gt;). We are still not solid on the library name, but pretty close. Each of the tools are designed to be enjoyable to use and free. We respond to inquiries and fix problems quickly. Once we have a name for the library, we may offer enterprise support for those that would require that.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://devlicio.us/aggbug.aspx?PostID=54860" width="1" height="1"&gt;</description><category domain="http://devlicio.us/blogs/rob_reynolds/archive/tags/RoundhousE/default.aspx">RoundhousE</category><category domain="http://devlicio.us/blogs/rob_reynolds/archive/tags/UppercuT/default.aspx">UppercuT</category><category domain="http://devlicio.us/blogs/rob_reynolds/archive/tags/Development/default.aspx">Development</category><category domain="http://devlicio.us/blogs/rob_reynolds/archive/tags/Git/default.aspx">Git</category><category domain="http://devlicio.us/blogs/rob_reynolds/archive/tags/Tools/default.aspx">Tools</category><category domain="http://devlicio.us/blogs/rob_reynolds/archive/tags/.NET/default.aspx">.NET</category></item></channel></rss>