What shall we do if we would like to use Module::Install
within Makefile.PL
?
These days I would suggest you to use ExtUtils::MakeMaker or Dist::Zilla, but if you encounter a module that use Module::Install, you will need to understand what is that.
Module::Install does not use a separate file, it uses Makefile.PL, it just has a different API. Because Module::Install does not come with standard Perl, it works differnt then ExtUtils::MakeMaker.
On the development machine, where you work on the module and where you would like to release it, you'll
need to install Module::Install but when you
package your module a part of Module::Install will be included in your distribution in the inc/
subdirectory. When someone tries to install this distribution, perl will automaticall use this copy
of Module::Install.
That's why in the Makefile.PL
we load inc::Module::Install
.
examples/module-install/Makefile.PL
use strict;
use warnings;
use 5.008;
use inc::Module::Install 1.00;
name 'App';
license 'perl';
author 'Gabor Szabo';
all_from 'lib/App.pm';
requires 'perl' => '5.008';
requires 'File::Basename'; # no version number
requires 'Win32' => '0.31' if $^O =~ /win32/i; # conditional requirement
test_requires 'Test::More' => '0.47';
homepage 'http://padre.perlide.org/';
bugtracker 'http://padre.perlide.org/trac/';
repository 'http://svn.perlide.org/padre/trunk/Padre/';
install_script 'script/app.pl';
# install_share; # will install the share/ directory from the distribution
# to be found by File::ShareDir::dist_dir('App') late on
WriteAll;
Some of the keys that you can use in the Makefile.PL
name
is the name of your distribution.
license
is the type of license the code has. perl
would mean the "perl license".
author
is the name and the e-mail of the person who created the module.
all_from
tells where to get the version number and the abstract of the distribution from. This usually points at the
main module.
requires
can be issued multiple times. Each time it gets a either a single value, a name of a module, or
a key-value pair. A name of a module and a mimimum version number.
This is the list of prerequisites. If only the name of the required module is given then we don't care which version
of that module.
One of the requirements in this example is only relevant on MS Windows. Therefore, we check
the $^O
variable that indicates the operating system, and only if it is Windows, only
then do we call the requires
function.
requires 'Win32' => '0.31' if $^O =~ /win32/i;
test_requires
helps you list the modules that are needed when testing the module even though they are not needed
for the actual use of the module.
The keywords homepage
, bugtracker
, repository
help the user declare various other resources
for this distribution. The information provided here will be added to the META files (META.yml and META.json) and
then they will be used by the various displying system, such as MetaCPAN to
link to these resources.
install_script
can be used to designate perl-scripts to be installed.
install_share
helps you add even more files (e.g. templates, images etc.)
Finally, after have declared everything we can call WriteAll
that will check everything declared
above and create the Makefile
to be used by the installer.
Comments
I'd suggest to your readers that Module::Install is highly discouraged at this point. (1) It made sense before module installers could support non-core build tools but that's all sorted now. (2) The bundling nature seemed like a good idea at the time, but it causes huge headaches now. And (3) there exist better tools for this including (though not my personal favorite) Dist::Zilla.
I am not perl programmer, but I have to publish packages. I am using module-starter which generates structure of files and folders. But generated *.pm file does not contain code - have I insert that code manually? I have a file *.pl wich contains many package definitions and the file is pretty big (over 6.6k lines). I would like to generate packages automatically using this file - is it possible? How?
I don't think so. You will need to talk to the Perl programmer who wrote that code.
There is no such person - code is autogenerated. So, I think the best solution is change code generator, to add theese extra stuff which generates module-starter in *.pm file?