Dist::Zilla makes developing modules much easier by generating all kinds of boilerplate files, saving
authors from having to write them by hand, but in some cases this can make developing more inconvenient.
The most prominent example of this is with "Makefile.PL" files - although the majority of distributions
can be hacked on just by editing the files in a source control checkout and using "prove" for testing,
for some this isn't sufficient. In particular, distributions which use an auto-generated test suite and
distributions which use XS both need special handling at build time before they will function, and with
Dist::Zilla, this means running "dzil build" and rebuilding after every change. This is tedious!
This module provides an alternative. Create a minimal "Makefile.PL" in source control which handles just
enough functionality for basic development (it can be as minimal as just what is in the "SYNOPSIS", but
can also contain commands to generate your test suite, for example), and tell Dist::Zilla to replace it
with a real "Makefile.PL" when you're actually ready to build a real distribution. To do this, make sure
you're still using the MakeMaker plugin, either directly or through a pluginbundle like @Basic, and add
the "exclude_filename = Makefile.PL" option to your dist.ini where you use "[GatherDir]".
In addition, this module also intercepts the "install" and "dist" rules in the generated Makefile to run
the appropriate Dist::Zilla commands ("dzil install" and "dzil build"). This allows users to continue to
use the "perl Makefile.PL && make && make install" set of commands, and have the correct thing continue
to happen.
Note that if you're using this module to ease testing of an XS distribution, you'll need to account for
your module not containing a $VERSION statement (assuming you're using the PkgVersion plugin). To do
this, you should use an XSLoader invocation similar to this:
BEGIN {
XSLoader::load(
'Foo::Bar',
$Foo::Bar::{VERSION} ? ${ $Foo::Bar::{VERSION} } : ()
);
}
This ensures that the $Foo::Bar::VERSION glob isn't created if it didn't exist initially, since this can
confuse XSLoader.