In a previous post I mentioned how I was going to show you how UppercuT (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, “Why YES, they can!” How about just filling out the information for the gemspec, running a build and having a nice, shiny new gem ready for publishing?
Rock The Gems
Basically you want to get the latest release of UppercuT. You can download it or grab the source and compile.
There are already instructions out there for how to get UC in your project, so I’m not going to concentrate on that.
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).
In that gems folder you are going to find a file named something like the file below. Rename that file to your new gemname.gemspec.
Note: Once you have a gemspec file in a gems folder, your build server NOW needs to also have ruby and gems installed.
Open that file in your favorite text editor and fill in the details. Here’s a good post on how to do that.
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/projectname folder is brought over to code_drop/gems/lib folder).
Removing All of the Other Output After the Gem is Built
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’t have one? create it right next to the build folder) folder and create a file named gemsBuild.post.step.
Let’s open the file and insert this:
<?xml version="1.0" encoding="utf-8"?>
<project name="CUSTOM POST GEMSBUILD" default="go">
<!-- Project UppercuT - http://projectuppercut.org -->
<property name="build.config.settings" value="__NONE__" overwrite="false" />
<include buildfile="${build.config.settings}" if="${file::exists(build.config.settings)}" />
<property name="dirs.current" value="${directory::get-parent-directory(project::get-buildfile-path())}" />
<property name="path.to.toplevel" value=".." />
<property name="folder.code_drop" value="code_drop" overwrite="false" />
<property name="dirs.drop" value="${dirs.current}\${path.to.toplevel}\${folder.code_drop}" overwrite="false" />
<property name="folder.gems" value="gems" overwrite="false" />
<target name="go" depends="run_tasks" />
<target name="run_tasks">
<delete>
<fileset basedir="${dirs.drop}/${folder.gems}" >
<exclude name="*.gem" />
<include name="**/*" />
</fileset>
</delete>
</target>
</project>
Note: Don’t like NAnt? You can also use Ruby or PowerShell instead of NAnt to write your custom extensions.
Now when we run our build again, we have a nice clean folder.
What If I Want to Change What Goes Into my Gem?
Interested in influencing what goes INTO your gem in the first place? That’s a pretty good thing to be concerned with so that you don’t have all of your referenced assemblies sitting in there. Read about how to set up dependencies. Then you will create a file next to gemsbuild.post.step named gemsPrepare.post.step.
In that file, you will insert something similar to the following (roundhouse file):
<copy todir="${dirs.drop}\${folder.gems}\lib">
<fileset basedir="${dirs.drop}\${folder.gems}\lib\MSBuild">
<include name="**/*.*" />
</fileset>
</copy>
<copy todir="${dirs.drop}\${folder.gems}\lib">
<fileset basedir="${dirs.drop}\${folder.gems}\lib\NAnt">
<include name="**/*.*" />
</fileset>
</copy>
<delete>
<fileset basedir="${dirs.drop}\${folder.gems}\lib" >
<include name="ConsoleApp/**" />
<include name="MSBuild/**" />
<include name="NAnt/**" />
</fileset>
</delete>
Learn More
With this knowledge, you shall build. Interested in more UppercuT? Check out the ChuckNorris framework and join the group.
Related Posts
Before you comment about “cluttering” the ruby community, please be sure to read this (we’re with you on this): http://devlicio.us/blogs/rob_reynolds/archive/2010/07/19/gems-for-net-community-response.aspx
Gems - Package Management for .NET
How To – Gems & .NET & How To – Gems & .NET - Dependencies (References)