强曰为道

与天地相似,故不违。知周乎万物,而道济天下,故不过。旁行而不流,乐天知命,故不忧.
文档目录

第 15 章:CPAN 深度使用

第 15 章:CPAN 深度使用

“站在巨人的肩膀上” — 牛顿

CPAN 是 Perl 的核心竞争力。本章深入讲解如何高效使用 CPAN、管理依赖以及发布自己的模块。


15.1 MetaCPAN — CPAN 搜索引擎

网站

评估模块质量

指标说明参考值
版本号最近更新时间< 2 年为活跃
下载量月度下载次数> 1000 较为成熟
测试结果CPAN Testers 通过率> 95% 为可靠
Bug 列表未解决的 Bug 数量少于 5 个为健康
依赖数量依赖的模块数量越少越好
Kwalitee代码质量评分> 95% 为优秀
# 查看模块信息
cpanm --info Mojolicious

# 查看模块依赖
cpanm --showdeps Mojolicious

# 查看已安装模块
perldoc -l Mojolicious
perl -MMojolicious -e 'print $Mojolicious::VERSION, "\n"'

15.2 cpanm 高级用法

# 从 GitHub 安装
cpanm git://github.com/user/repo.git

# 从 URL 安装
cpanm https://example.com/Module-1.00.tar.gz

# 安装开发版本
cpanm --dev Module::Name

# 只下载不安装
cpanm --look Module::Name    # 下载并进入目录

# 强制重新安装
cpanm --force Module::Name

# 使用特定镜像
cpanm --mirror https://mirrors.aliyun.com/CPAN/ Module::Name

# 测试后安装
cpanm --test-only Module::Name

# 从本地目录安装
cpanm ./My-Module-1.00.tar.gz

# 安装指定版本
cpanm Module::[email protected]

# 从 cpanfile 安装所有依赖
cpanm --installdeps .

# 详细输出
cpanm -v Module::Name

# 仅安装缺失的依赖
cpanm --with-develop --installdeps .

cpanm 输出解读

--> Working on Module::Name
Fetching http://cpan.metacpan.org/authors/id/A/AU/AUTHOR/Module-Name-1.00.tar.gz
Configuring Module-Name-1.00 ... OK  ← 配置成功
Building and testing Module-Name-1.00 ... OK  ← 构建测试成功
Installing /home/user/perl5/lib/perl5/Module/Name.pm  ← 已安装
Successfully installed Module-Name  ← 安装成功

15.3 常用 CPAN 工具

工具用途安装
cpanm模块安装系统自带或 curl -L https://cpanmin.us
cpan传统 CPAN 客户端系统自带
cpm并行安装(更快)cpanm App::cpm
carton项目依赖管理cpanm Carton
cpan-outdated检查过期模块cpanm App::cpan-outdated
cpan-upload上传到 CPANcpanm CPAN::Uploader
dzilDist::Zilla 发行管理cpanm Dist::Zilla

cpm — 快速并行安装

# 安装 cpm
cpanm App::cpm

# 并行安装(比 cpanm 快 5-10 倍)
cpm install Module::Name

# 从 cpanfile 安装
cpm install --cpanfile cpanfile

cpan-outdated — 检查过期模块

cpanm App::cpan-outdated

# 列出所有过期模块
cpan-outdated

# 一键升级
cpan-outdated | cpanm

15.4 模块安装流程

1. 下载 → 2. 解压 → 3. 配置 → 4. 构建 → 5. 测试 → 6. 安装
   ↓           ↓           ↓           ↓          ↓          ↓
  tar.gz     执行目录    Makefile.PL  make     make test  make install

手动安装流程

# 1. 下载
wget https://cpan.metacpan.org/authors/id/A/AU/AUTHOR/Module-1.00.tar.gz

# 2. 解压
tar xzf Module-1.00.tar.gz
cd Module-1.00

# 3. 配置
perl Makefile.PL
# 或者
perl Build.PL

# 4. 构建
make
# 或者
./Build

# 5. 测试
make test
# 或者
./Build test

# 6. 安装
sudo make install
# 或者(用户目录)
make install PREFIX=~/perl5

15.5 本地模块目录

# 使用 local::lib 设置本地模块路径
cpanm local::lib
eval $(perl -I ~/perl5/lib/perl5 -Mlocal::lib)

# 添加到 .bashrc
echo 'eval $(perl -I ~/perl5/lib/perl5 -Mlocal::lib)' >> ~/.bashrc

PERL5LIB 环境变量

# 添加额外的模块搜索路径
export PERL5LIB="$HOME/mylibs:$PERL5LIB"

# 脚本内添加
use lib "/home/user/mylibs";
use lib "/opt/perl/site/lib";

15.6 发布模块到 CPAN

步骤概览

1. 注册 PAUSE 账号 → https://pause.perl.org
2. 创建发行版(Dist::Zilla 或 Module::Build)
3. 编写代码和文档
4. 打包为 .tar.gz
5. 通过 PAUSE 上传
6. 等待 CPAN 索引

使用 Dist::Zilla

cpanm Dist::Zilla
dzil new My-New-Module

# 生成的目录结构
My-New-Module/
├── lib/
│   └── My/
│       └── New/
│           └── Module.pm
├── t/
│   └── basic.t
├── dist.ini          ← Dist::Zilla 配置
├── Changes
├── LICENSE
└── README.md

dist.ini 示例

name    = My-New-Module
author  = Your Name <[email protected]>
license = Perl_5
copyright_holder = Your Name

[@Basic]

[Prereqs]
Moo             = 2.0
JSON::XS         = 4.0

[Prereqs / TestRequires]
Test::More       = 0.96

[AutoPrereqs]
[PodWeaver]
[NextRelease]

发布命令

# 检查发行版
dzil test

# 构建
dzil build

# 发布到 CPAN
dzil release

15.7 推荐模块列表

核心必备

模块用途
JSON::XSJSON 编解码(最快)
Path::Tiny文件操作
Try::Tiny异常处理
autodie自动错误处理
Moo轻量 OOP
Carp错误报告
Scalar::Util标量工具
List::Util列表工具

Web 开发

模块用途
MojoliciousWeb 框架
Dancer2轻量 Web 框架
PlackPSGI 工具集
LWP::UserAgentHTTP 客户端
HTTP::Tiny轻量 HTTP 客户端
Mojo::UserAgent非阻塞 HTTP 客户端

数据处理

模块用途
Text::CSVCSV 解析
XML::LibXMLXML 解析
YAML::XSYAML 解析
DBI数据库接口
DBIx::ClassORM 框架
Template::Toolkit模板引擎

15.8 业务场景:依赖管理最佳实践

# cpanfile — 项目依赖声明

# 核心依赖
requires 'perl', '5.026';
requires 'Mojolicious', '>= 9.0';
requires 'JSON::XS';
requires 'DBI';
requires 'DBD::SQLite';
requires 'Log::Log4perl';

# 可选依赖
recommends 'EV';              # 更快的事件循环
recommends 'IO::Socket::SSL'; # HTTPS 支持

# 开发依赖
on 'develop' => sub {
    requires 'Perl::Tidy';
    requires 'Perl::Critic';
    requires 'Dist::Zilla';
};

# 测试依赖
on 'test' => sub {
    requires 'Test::More', '>= 0.96';
    requires 'Test::Deep';
    requires 'Test::Exception';
    requires 'Test::Mojo';
};
# 安装生产依赖
carton install

# 安装所有依赖(含开发)
carton install --with-develop

# 使用本地依赖运行
carton exec perl myapp.pl

# 锁定依赖版本
carton install
# 生成 cpanfile.snapshot(提交到 Git)

本章小结

要点内容
MetaCPANCPAN 搜索和浏览
cpanm推荐的模块安装器
cpm更快的并行安装器
carton项目依赖管理
Dist::Zilla模块打包发布
PAUSECPAN 模块上传平台
cpanfile依赖声明文件

练习

  1. 使用 cpanm 安装 5 个常用的 CPAN 模块
  2. 创建一个 cpanfile,声明项目依赖
  3. 使用 cpan-outdated 检查你的过期模块
  4. 研究 MetaCPAN API(https://api.metacpan.org)
  5. 创建一个简单的 CPAN 模块骨架(使用 Dist::Zilla 或手动创建)

扩展阅读