Ant Best Practices: Use ZipFileSet
• Julian Simpson
(image taken from the superbly named MasochismTango's photostream)
Welcome to the lucky thirteenth edition of Ant Best Practices. You probably guessed this one: Use the ZipFileSet type when you make a zip file in Ant.
This one slipped past me recently. We were working on a web project and the developers added a cache-busting feature to stop CSS stylesheets being cached by the reader's browser. So they wrote build targets to:
- fetch the static content
- lay it out in a directory, nested under an arbitrary kind of key
- zip it all up for deployment later
It looked something like this:
<project name="web" default="zipfile">
<property name="build.dir" value="build" />
<property name="tmp" value="${build.dir}/tmp" />
<target name="zipfile">
<copy todir="${tmp}/static/random_token">
<fileset dir="code" />
</copy>
<!-- more static files, you getthe idea -->
<zip file="${build.dir}/static.zip">
<fileset dir="${tmp}" />
</zip>
</target>
</project>
Sounds fine, right?
Hmm. Actually, no. The approach gets top marks for actually working, but where I should have intervened was the copying of the files about to make the paths that were desired. In this case, the <zipfileset> lets you pluck files from wherever they might be, and put them into the right place:
<project name="web" default="zipfile">
<property name="build.dir" value="build" />
<target name="zipfile">
<zip file="${build.dir}/static.zip">
<zipfileset prefix="random_token" dir="code"/>
</zip>
</target>
</project>
Really, that's it. I was originally quite surprised that it made Eric's original list of practices: It's quite a simple change to make. But on writing about it I'm thinking this should be a refactoring. It'd be great to invoke an automated refactoring and introduce a zipfileset whenever you saw tedious copying and zipping operations. Anyway. Do this, and it will make your build faster and easy to read. Result.
