2009年12月16日星期三

[PerlChina] CN Perl Advent Day 17: dzil

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 <fayland@gmail.com>
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 <fayland@gmail.com>
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 <fayland@gmail.com>
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 讨论组"论坛。
要向此网上论坛发帖,请发送电子邮件至 perlchina@googlegroups.com
要取消订阅此网上论坛,请发送电子邮件至 perlchina+unsubscribe@googlegroups.com
若有更多问题,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问此网上论坛。

没有评论: