This is part III of my blog on versions. Last time we discussed
the question of what version of perl
to use for development.
Conclusion: In most cases, the choice will be made for you,
especially in maintenance and legacy migration situations. If you have
the luxury and ability to use a more version of perl
, use it. Let’s continue:
perl
should I be using for development?perl
should I
support?perl
should I support?For me, this has become more than just an academic question. Several years I ago I petitioned the Pause administrators to allow me to adopt Amazon::S3. It had been a long time since the module was updated and it needed a little TLC to support new features and fix some deficiencies. The adoption process took a lot longer than I had imagined. Between the time I requested co-maintainer rights and the time it was actually granted the urgency and desire to adopt the module waned. Recently the need to update this module has re-appeared so I began making some much needed improvements. My first release to CPAN of the updated module was 0.49 and thus began my introduction to CPAN Testers Reports.
Version | Max Version Passing | Min Version Passing | First Failure | O/Ss With Passing Version |
---|---|---|---|---|
0.49 | 5.36.0 | 5.14.4 | 5.32.1 | darwin, freebsd, linux, mswin, openbsd, solaris |
0.50 | 5.37.1 | 5.14.4 | 5.34.1 | darwin, freebsd, linux, mswin, openbsd, solaris |
0.51 | 5.37.1 | 5.14.4 | 5.18.4 | darwin, freebsd, linux, mswin, openbsd, solaris |
0.52 | 5.37.1 | 5.14.4 | 5.8.9 | darwin, freebsd, linux, mswin, openbsd, solaris |
0.53 | 5.37.1 | 5.14.4 | NA | darwin, freebsd, linux, mswin, openbsd, solaris |
0.54 | 5.37.1 | 5.14.4 | 5.37.1 | darwin, freebsd, linux, mswin, openbsd, solaris |
My first release only passed (accidentally) on a few versions but
seemed to passs on at least 1 version of all operating systems
tested. The failures were all due to missing dependencies that I had
failed to identify in Makefile.PL
. Thus a new release (0.50) was
required - somehow I made the same mistake, however as you can see
from the report, a new max version (5.37.1) emerges due to one of the
testers adding that version to its list of perl
versions to test. I
say the tests that passed, passed accidentally, because I’m guessing
that those testers had (for some reason) the necessary modules
installed in their environment.
That’s an important point to consider - all testing environments are
not created equally. By looking at the reports, we can conclude
empircally that there must be something different about these
environments if the module fails on one tester’s version of perl
5.37.1 and another passes? Take this report for example:
Note the failed tester and the OS version. The version of the OS is
different in the failing tester’s report…however the failure was due
to XML::Simple
not being installed because it was missing from the
list of dependencies in Makefile.PL
. So why did the other’s pass?
The conclusion must be that XML::Simple
was somehow present in those
environments otherwise they would would failed there as well.
Some other oddities of the CPAN Testers Reports is what versions of
perl
are used for testing the module. After releasing 0.50 I noticed
that version 5.8.9 of perl
suddenly showed up in the testers
report. Hmmm…should I try to support that version? Is there a
reason it shouldn’t pass on 5.8.9? What versions of
perl
did the original author’s 0.45 version support? Well, as it
turns out when that module was tested in 2012, it support 5.6.2!
Should I support 5.6.2? Would it actually be possible to support
perl
5.6.2?
The answer as it turns out is no. Version 0.45 would probably not pass
version 5.14.0 due to the versions of perl
that are required by the
module’s dependencies.
Version 0.45 specifies that any version of
LWP::UserAgent::Determined
will do, which in term will require
any version of LWP
.
As I futilely attempted to see what the minimum
version of perl
my adopted module could support I attempted to
build LWP
on version 5.10.0 of perl
. Unfortunately, LWP
would
not build on 5.10.0 (actuall it was the module HTTP::HeadParser
that
is part of libwww-perl
that failed unit tests) so I dutifully
filed an issue assuming that the authors of LWP
would want to know
that the module does not build on 5.10.0.
The response to my report was suprisingly - let’s bump the required
version of perl
to 5.14. So, while LWP
successfully builds on
5.14.0, LWP::UserAgent::Determined
does not.
After a lot of useless traversing down rabbit holes I was able to
determine that installing an older version of LWP
would, in fact succeed in
building LWP::UserAgent::Determined
. The rub here however is that
other modules like XML::Simple
require yet other modules that
specifed that any version of LWP
would do. If the dependency
that required any version of LWP
is installed prior
to installing a specific older version of LWP
listed in my manifest,
well, now we’ve installed an incompatible version of LWP
because
specifying any version of LWP
will bring in the latest version.
Now, if cpanm
had done the right thing and installed specific
versions of modules specified in the dependency list first, then the
older version of LWP
would have satisfied the requirement. This is
not to say that cpanm
did the wrong thing…it got the list of
direct dependencies from the distribution and started installing them.
To be fair, the versions of perl
I have been testing against are
old. CPAN authors should not be bound to supporting older versions of
perl
at the expense of modernizing or enhancing their modules. The
point is to simply illustrate the difficulty in releasing a CPAN
module that does support older versions of perl
.
So should I then conclude that I need to bump the minimum version of
perl
that Amazon::S3 will
support to something like 5.16.3? If I still want to support older
versions of perl
would it even be possible to find the versions of
dependent modules that do not break my build? Does that even make any
sense when modules are sometimes updated to fix bugs?
As it happens, I did manage to get a working build for perl
5.10.0
and 5.14.0. Of course, it was a forensics exercise and not very
satisfying to be truthful.
By installing version 6.13 of LWP
and version 2.14 of
HTML::HeadParser
I managed to somehow get
Amazon::S3 to build
and complete all tests successfully.
The guidelines to support older versions of perl
seem to be:
perl
you plan to
supportperl
you plan to supportmore next time…