Perl构建和打包自己的模块
|
当写好一个或多个模块后,可以将它构建、打包成"tar.gz",以便让别人安装或者上传到CPAN(如果愿意的话)。对于模块的使用者来说,也不用再使用 Module::Starter在很早以前,使用h2xz工具,但它实在太古老了。现在很多人使用 先安装: $ cpan -i Module::Starter
例如,构建一个名为 $ module-starter --module "My::Number::Utilities" --author="ma long shuai" --email="[email?protected]" 上面第一条命令将会创建如下的目录树: $ tree My-Number-Utilities
My-Number-Utilities
├── Changes
├── ignore.txt
├── lib
│?? └── My
│?? └── Number
│?? └── Utilities.pm
├── Makefile.PL
├── MANIFEST
├── README
├── t
│?? ├── 00-load.t
│?? ├── manifest.t
│?? ├── pod-coverage.t
│?? └── pod.t
└── xt
└── boilerplate.t
其中:
上面的文件可能已经包含了一些内容,例如 $ head -n 10 My-Number-Utilities/lib/My/Number/Utilities.pm package My::Number::Utilities; use 5.006; use strict; use warnings; =head1 NAME My::Number::Utilities - The great new My::Number::Utilities! 默认情况下, $ module-starter --builder=Module::Build --module "My::Number::Utilities" --author="ma long shuai" --email="[email?protected]" $ module-starter --mb --module "My::Number::Utilities" --author="ma long shuai" --email="[email?protected]" 因为每次在 author: ma long shuai email: [email?protected] builder: Module::Build verbose: 1 以后再执行module-stater时,只需一个 module-starter --module=My::Module 现在,只需将自己写的pm模块文件拷贝覆盖到 perl Makefile.PL make make test make install # 或者 perl Build.PL ./Build ./Build test ./Build install 上面的过程中,只要不是error,出现了warning可以忽略。 最后,执行下面两种命令,可将模块打包成".tar.gz"格式的文件。 make dist ./Build dist 例如,生成Build格式的包: $ ./Build dist Created META.yml and META.json Creating Cat-New-0.01 Creating Cat-New-0.01.tar.gz Makefile.PL和Build.PL虽然Makefile.PL和Build.PL不建议修改,但小心翼翼点也可以修改。 Makefile.PL先看Makefile.PL文件的前几行: use 5.006;
use strict;
use warnings;
use ExtUtils::MakeMaker;
WriteMakefile(
NAME => 'My::Number::Utilities',AUTHOR => q{ma long shuai <[email?protected]>},VERSION_FROM => 'lib/My/Number/Utilities.pm',ABSTRACT_FROM => 'lib/My/Number/Utilities.pm',LICENSE => 'artistic_2',PL_FILES => {},MIN_PERL_VERSION => '5.006',CONFIGURE_REQUIRES => {
'ExtUtils::MakeMaker' => '0',},BUILD_REQUIRES => {
'Test::More' => '0',PREREQ_PM => {
#'ABC' => '1.6',#'Foo::Bar::Module' => '5.0401',dist => { COMPRESS => 'gzip -9f',SUFFIX => 'gz',clean => { FILES => 'My-Number-Utilities-*' },);
主要是其中的 此外,如果想要安装一些perl程序文件,而非模块文件,可以如下书写: WriteMakefile(
...
EXE_FILES => [ qw( scripts/barnyard.pl ) ],...
);
上面的要求是将barnyard.pl程序文件放在scripts目录下。通过这种方式,即使是没有包含任何模块,也能构建perl程序包。在安装模块的时候,这个文件会放进/usr/local/bin目录下。 Build.PL再看Build.PL文件的前几行: use 5.006;
use strict;
use warnings;
use Module::Build;
my $builder = Module::Build->new(
module_name => 'Cat',license => 'artistic_2',dist_author => q{ma long shuai <[email?protected]>},dist_version_from => 'lib/Cat.pm',release_status => 'stable',configure_requires => {
'Module::Build' => '0',build_requires => {
'Test::More' => '0',requires => {
#'ABC' => '1.6',add_to_cleanup => [ 'Cat-*' ],);
$builder->create_build_script();
主要是其中的 此外,如果想要安装一些perl程序文件,而非模块文件,可以如下书写: my $builder = Module::Build?>new(
...
script_files => [ qw(scripts/barnyard.pl) ],...
);
上面的要求是将barnyard.pl程序文件放在scripts目录下。 当执行 构建多个模块如果想一次性构建多个模块,且知道各模块名称,则可以: $ module-starter ??module=Animal,Cow,Horse,Mouse 它会以第一个模块名称作为顶级目录,然后在lib中创建各模块文件。 参考如下目录结构: $ tree Animal/
Animal/
├── Changes
├── lib
│?? ├── Animal.pm
│?? ├── Cow.pm
│?? ├── Horse.pm
│?? └── Mouse.pm
├── Makefile.PL
├── MANIFEST
├── README
├── t
│?? ├── 00-load.t
│?? ├── manifest.t
│?? ├── pod-coverage.t
│?? └── pod.t
└── xt
└── boilerplate.t
如果模块是多层次的(包含双冒号的),则构建的目录结构如下: $ module-starter --module=Animal::Rule,Cow::Rule,Mouse
$ tree Animal-Rule
Animal-Rule/
├── Changes
├── lib
│?? ├── Animal
│?? │?? └── Rule.pm
│?? ├── Cow
│?? │?? └── Rule.pm
│?? ├── Horse.pm
│?? └── Mouse.pm
├── Makefile
├── Makefile.PL
├── MANIFEST
├── MYMETA.json
├── MYMETA.yml
├── README
├── t
│?? ├── 00-load.t
│?? ├── manifest.t
│?? ├── pod-coverage.t
│?? └── pod.t
└── xt
└── boilerplate.t
添加新模块如果想要向已有模块目录添加一个新模块,需要使用 $ cpan -i Module::Starter::AddModule 然后在 author: ma long shuai email: [email?protected] verbose: 1 plugins: Module::Starter::AddModule # 新加此行 然后就可以添加新模块: $ module-starter --module=Sheep --dist=Animal-Rule 其中 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
