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 其中 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |