Module::Install exists because installing CPAN distributions is not always perfectly easy.
Unfortunately, it didn't help—at least, not entirely. According to
the completely unscientific process by which I install CPAN distributions,
Module::Install
accounts for a greater amount of pain than it
should, at least according to its frequency of use. (Again, this is completely
unscientific. I could guess that half of the CPAN client sessions
which encounter Module::Install require me to fix things manually, but it's
probably closer to 20%. It's more memorable because of my severe dislike for
M::I prompting to install dependencies during configuration time.)
M::I addresses a real bootstrapping problem. I want to be able to use libraries during configuration, building, testing, and installation. I don't know which versions of those libraries you have available. Bundling known-good versions of those libraries with the distribution itself solves part of that problem...
... except when it doesn't. If I were to use M::I, I would have to re-release all of my distributions for every new release of every bundled library, at least if they contain important bug fixes for the various platforms about which I care. The cheap perfume of static linking leaves its musk heavy in the air.
It's easy to fall into the trap of a false dilemma. "You fool!" you prepare to comment below. "It's either that or the chaos of trying to make do with whatever version of those dependencies users may or may not have installed on their systems!" You're right; those are two possibilities. They're not the only two possibilities.
Part of the real problem is that bootstrapping during configuration is much too late. By the time you're running the configuration system, you're already running the configuration system. If your version of the configuration system is too old or too new, you have a problem. Bail out? Revert? Upgrade? There's no good heuristic for determining this. (The CPAN itself has an opinion. That's part of the problem.)
M::I hackers do deserve credit for helping to develop the META.yml standard. (I think M::I is the wrong approach, but I intend no slight toward its users, advocates, and developers. Invention requires the courage to get things wrong sometimes, even as it requires the courage to abandon false leads.) The META.yml specification is a big step in the right direction. If most CPAN modules have static requirements and follow a standard set of conventions, there's little or no configuration necessary. A sufficiently smart CPAN client can perform the appropriate configuration without running code from the distribution itself.
You can't avoid that in all cases; distributions with XS components, for example, need to probe system information. Good luck writing a sufficiently smart CPAN client and getting the community to agree on specific standards that let you find OpenGL headers in a cross-platform fashion, for example. Yet if 80% of CPAN distributions can get by with static, upload-time configuration, a lot of complexity of installation can go away.
Yes, that would make Module::Build
and
ExtUtils::MakeMaker
unnecessary for (probably) most CPAN
distributions, at least at the point of configuration, building, and
installation. (I'm a recent fan of Dist::Zilla for
automating away tedium on behalf of distribution maintainers; there's less need
for Module::Install
in such a world. If I never write another
Build.PL again, so much the better.)
That helps, but the real problem with CPAN installations is that the CPAN itself is merely an uploading, indexing, and mirroring system. Projects such as META.yml attempt to add (and extract) meaning from the system, but they cannot work around one fundamental design feature of the CPAN. That limitation is the source of most woes for end users.
Clever readers (or experienced CPAN users) have already identified this limitation. I'll reveal it in the next installment.
If I recall correctly, META.yml was an innovation from the Module::Build community. At least, the first version of the spec dates back to 2003 and was published by Ken Williams, the author of Module::Build.
Recent efforts to improve the META.yml spec have been a joint effort by numerous toolchain maintainers and CPAN workers, building on the excellent consensus forged at the Oslo QA hackathon in 2008.
The master META.yml repository is now hosted on github and the master branch reflects the current state of the working draft towards a 2.0 release of the spec. Finalizing the spec was put on the back burner due to the rush to get CPAN Testers 2.0 finished and work on the META spec will resume later this spring.
-- dagolden
What about inc::latest etc.? With this module you can bundle (in inc/) minimal dependency, but use latest version if you have it installed...
That's how I remember it too, @dagolden -- but I don't want to give the impression that the Module::Install community exists in a vacuum. There's a larger toolchain community of which M::I is a part, and that toolchain community has done a lot of good for Perl and the CPAN.
Module::Install may take the wrong approaches in some ways, but that's out of a desire to improve the use of CPAN for everyone, just like all of the other toolchain hackers.