John Peacock wrote:
Michael G Schwern wrote:
That is why I would not recommend Module::Install. Its new interface sits on top of MakeMaker and thus contains all its underlying flaws. Worse, it is a customization of MakeMaker. There is no safe way to customize MakeMaker. Module::Install will eventually fail.

It doesn't even support all of the EU::MM methods that /do/ work:

    https://rt.cpan.org/Ticket/Display.html?id=20375

Not surprisingly, after filing that ticket (and getting no response), I converted SVN::Notify::(Config|Snapshot) to use Module::Build and I haven't looked back.

Because Module::Install ships copies of itself in each distribution this will cause a widespread CPAN cascade failure. Individual users will not be able to fix this by just upgrading their installed copy of Module::Install. Each author has to rebuild and release their distribution to fix it. This will take months.

I can understand and even appreciate the impulse to have an install tool that contains within itself all of the pieces needed, so that any module using said tool doesn't require anything external at all. Sadly, Module::Install clearly isn't it that tool. Module::Build isn't either, but now that it is in Perl 5.10.0 (i.e. it comes free just like EU::MM did), this isn't really a problem that needs to be solved that way any more.

There is a happy medium. A bundled Module::Install will only ever use the bundled copy. The rationale is that it guarantees that the same version of the build environment which the author used will run on the user's machine. This allows the author to customize their build modules by simply hacking the code, but it ignores that there's more to building a module then Module::Install. MakeMaker changes. perl changes. Compilers change. make changes. New environments come into being. Some old ones the author wasn't aware of might never have worked in the first place.

That leads to the CPAN cascade failure nightmare scenario when something in the environment changes (probably perl or MakeMaker, but maybe a core module changes and MI wasn't using it quite right) and all the bundled versions suddenly stop working. Users have to wait for authors to update, they can't even do it themselves since they don't know what customizations the author has done.

A simple solution is to add easy module bundling to Module::Build which will honor a higher external version. MakeMaker already does just this for itself with things like ExtUtils::Install and ExtUtils::Manifest. This allows the author to bundle their dependencies, but it also future proofs the distribution.


The other attraction to Module::Install is the interface. People seem to like it. It might make sense to emulate the good stuff in a wrapper over Module::Build, sans the auto-install stuff.


--
E: "Would you want to maintain a 5000 line Perl program?"
d: "Why would you write a 5000 line program?"

Reply via email to