http://perlchina.org/advent/2009/dzil.html
=for advent_year 2009 =for advent_day 17 =for advent_title dzil =for advent_author Fayland Lam A<Dist::Zilla> 对模块作者来说是件利器。 它与 M<ExtUtils::MakeMaker>, M<Module::Build>, M<Module::Install> 不同,它不是安装模块。它们的共同点是都可以打包一个 CPAN .tar.gz 它与 M<Module::Starter> 不同。它不仅仅可以构建模块的框架。 它与 M<ShipIt> 不同。它不仅仅可以发布代码。 它是所有的综合体。它可以构建框架,打包代码并且发布代码,它最大的优点在于节省您的时间。让你专心编写代码而无需考虑多余的事情。 以下是一个简单的流程例子。 通常我们会在我们的 home 目录下创建一个 .dzil/config.ini 来保存模块配置的基本资料。 =begin pre $ mkdir ~/.dzil $ vi ~/.dzil/config.ini # Windows 一般是 C:\Documents and Settings\Administrator>perl -e "mkdir '.dzil'" C:\Documents and Settings\Administrator>cd .dzil C:\Documents and Settings\Administrator\.dzil>notepad config.ini =end pre config.ini 里的内容(可以添加更多的,下文会提到) =begin pre [=Dist::Zilla::App::Command::new] author = Fayland Lam <[email protected]> license = Perl_5 copyright_holder = Fayland Lam =end pre 最好基本个人资料配置之后,我们就可以创建一个新的 dist.ini 模块了。 =begin pre $ dzil new TestModule-A =end pre 打开 TestModule-A 目录,会有一个 dist.ini 文件 =begin pre name = TestModule-A version = 1.000 author = Fayland Lam <[email protected]> license = Perl_5 copyright_holder = Fayland Lam [...@classic] =end pre 与 Module::Starter 不同,它并不创建任何目录或其他文件。大部分的文件都将通过 dist.ini 来配置生成。 比如 Makefile.PL, 默认的 [...@classic] 会在 dzil build 的时候自动生成。 比如 README, 我们可以用默认的 [...@classic] 来生成一个简单的,或者也可以通过 M<Dist::Zilla::Plugin::ReadmeFromPod> 来从 POD 生成。 比如 POD 里的 NAME, AUTHOR 和 COPYRIGHT AND LICENSE,都将通过 M<Dist::Zilla::Plugin::PodWeaver> 来生成。 比如一些 Repository 的资料,可以通过 M<Dist::Zilla::Plugin::Repository> 来生成。 比如 t/00-compile.t 可以通过 M<Dist::Zilla::Plugin::CompileTests> 生成。 想想看,如果上面的文件都将默认生成,你还需要做什么呢?您只需要写真正有意义的代码了,而不需要关心这些枝节。 =begin pre $ mkdir lib/TestModule/A.pm $ vi lib/TestModule/A.pm package TestModule::A; # ABSTRACT: [[Abstract of module]] use strict; use warnings; use Module::A; use Module::B; [[YOUR CODE]] 1; __END__ =head1 SYNOPSIS [[YOUR SYNOPSIS]] =head1 DESCRIPTION [[YOUR DESCRIPTION]] =cut =end pre ABSTRACT 将是 NAME head1 的描述。 最后您可以还忘记了 Changes =begin pre $ vi Changes Revision history for TestModule::A 0.01 2009.12.15 First version, released on an unsuspecting world. =end pre 是不是写 Changes 有点繁琐?您可以写一个 plugin 来自动生成 Changes. 是不是经常会在发布前忘记更新 Changes, 可以使用 M<Dist::Zilla::Plugin::CheckChangeLog> 来提醒你。 最后的 dist.ini 可能是这样的 =begin pre name = TestModule-A version = 1.000 author = Fayland Lam <[email protected]> license = Perl_5 copyright_holder = Fayland Lam [...@classic] [Prereq] Module::A = 0 Module::B = 0 [PodWeaver] [Repository] [ReadmeFromPod] [CheckChangeLog] =end pre 在更改模块完毕后,您可以 =begin pre $ dzil test $ dzil build $ dzil release =end pre 来测试,打包和发布代码。 如果上述对您来说还是太繁琐的话,您可以写 Dist::Zilla 的插件。Dist::Zilla 里有个插件的技巧 =begin code $_->before_build for $self->plugins_with(-BeforeBuild)->flatten; $_->gather_files for $self->plugins_with(-FileGatherer)->flatten; $_->prune_files for $self->plugins_with(-FilePruner)->flatten; $_->munge_files for $self->plugins_with(-FileMunger)->flatten; $_->setup_installer for $self->plugins_with(-InstallTool)->flatten; =end code 可以让你分步骤来编写对应的插件。目前 CPAN 上有很多插件如 M<Dist::Zilla::Plugin::Git>, M<Dist::Zilla::Plugin::PerlTidy>, M<Dist::Zilla::Plugin::Prepender>, M<Dist::Zilla::Plugin::Release> 等,都是非常有用和尝试的。 谢谢。 -- Fayland Lam // http://www.fayland.org/ -- 您收到此邮件是因为您订阅了 Google 网上论坛的“PerlChina Mongers 讨论组”论坛。 要向此网上论坛发帖,请发送电子邮件至 [email protected]。 要取消订阅此网上论坛,请发送电子邮件至 [email protected]。 若有更多问题,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问此网上论坛。
