After over 7 years, a new release of Bloom::Filter is out! Thanks to Maciej Ceglowski (MCEGLOWS / @baconmeteor), who was kind enough to give me co-maint permissions. If you don’t know what bloom filter is1, please read “Using Bloom Filters” (article written by Maciej in 2004, but still up-to-date and very interesting). Instead of writing about bloom filters, in this blog post I’d like to concentrate on Perl module release process, as a part of my personal “diving into Perl” process.

First, just a quick summary what’s included new version of Bloom::Filter:

As you can see – only minor changes, no new features or optimizations. Still, it was hard for me to deal with “legacy” distibution – written by someone else in 2004, last released in 2007, when Perl was in different shape and some tools didn’t exist yet. Bloom::Filter is my third module I uploaded on CPAN, but first managed by ExtUtils::MakeMaker (EUMM). Previously I used Dist::Zilla (dzil) and Dist::Milla (milla) to create a module from scratch and release it, which was quite overwhelming in case of Dist:Zilla (even with great documentation and tutorial), and very easy in case of Dist::Milla.3

However, what should I do to make a realease of EUMM module was not very obvious to me. Despite I had read few blog posts and tutorials dealing with “How to bootstrap release and manage a Perl module?” topic, none of them actually compared side by side and explained differences between dzil, milla, EUMM and other tools such as Module::Build, Module::Install, CPAN::Uploader4. It was quite confusing for a newbie like me and I had to read documentation of each of these modules to find out if I needed that module or not. As it turned out, managing distribution created with EUMM is harder comparing to Dist::[ZM]illa, because one has to do many things manually. EUMM documentation says it’s just an utility designed to write a Makefile for an extension module from a Makefile.PL. Bearing that in mind, next steps involved digging in EUMM documentation and hacking Makefile.PL. In particular, these are some problems I had to deal with (each of these should actually begin with “Contrary to dzil / milla, …”):

  • To maintain compatibility with older EUMM version, I had to remove some features by hand in Makefile.PL. I guess I expected that MakeMaker is actually MakeMakerMaker, which it isn’t, obviously.
  • README and LICENCE were not autogenerated and I had to maintain cohesion between Makefile.PL and these files.
  • After doing make dist there’s no next step to do actual release – tag, push and upload, another tool must be used for that (I used CPAN::Uploader).

So I found out EUMM is not a distribution making swiss knife, just a tool for managing Makefile creation process. That said, I don’t see a reason to use “raw” ExtUtils::MakeMaker or Module::Build plus some release tool instead of Dist::Milla – for my needs it’s more than enough, it takes care of all boilercode I don’t need to write, does all git-related release stuff, and changes version all over module.5

Speaking of versioning – according to David Golden’s article, it should be a boring task. It wasn’t, at least this time. I had to face two (actually three, third was, as always in Perl, TIMTOWTDI) issues here:

  • There was already 1.1 release on BackPAN (How is that possible?)
  • What is proper next development release for 1.0? I tried

    my $version = Perl::Version->new('1.0');
    say $version;

    which is unexpectedly 1_01, not 1.0_01 but for Perl::Version->new('1.1') it’s actually 1.1_01.

I’ve decided to just do one release for 1.1, without any dev releases. Luckilly, it worked without any problem, although it takes a while to see the release on (Meta)CPAN. Now, when this post is finished, I have to contact some downstream authors, which I know have been using patched version of Bloom::Filter and point them to the new release.

Oh, there’s this question which I am asking myself: should I move an old (i.e. co-maintained) module to Dist::Milla, or should it stay on EUMM forever?

  1. In few words: bloom filter is a space-efficient probabilistic data structure, which is used to test whether an element is a member of a set (from Wikipedia).

  2. Actually I don’t know how to filter closed issues which were fixed in 1.1 on RT… Any help?

  3. I have to write a blog post about my dzil and milla experiences eventually…

  4. I deliberately listed tools which aren’t used to same tasks, although my first impression was different.

  5. Dist::Milla is also contributor-friendly.