Perl 完全指南 / 第 15 章:CPAN 深度使用
第 15 章:CPAN 深度使用
“站在巨人的肩膀上” — 牛顿
CPAN 是 Perl 的核心竞争力。本章深入讲解如何高效使用 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 |
上传到 CPAN |
cpanm CPAN::Uploader |
| dzil |
Dist::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::XS |
JSON 编解码(最快) |
| Path::Tiny |
文件操作 |
| Try::Tiny |
异常处理 |
| autodie |
自动错误处理 |
| Moo |
轻量 OOP |
| Carp |
错误报告 |
| Scalar::Util |
标量工具 |
| List::Util |
列表工具 |
Web 开发
| 模块 |
用途 |
| Mojolicious |
Web 框架 |
| Dancer2 |
轻量 Web 框架 |
| Plack |
PSGI 工具集 |
| LWP::UserAgent |
HTTP 客户端 |
| HTTP::Tiny |
轻量 HTTP 客户端 |
| Mojo::UserAgent |
非阻塞 HTTP 客户端 |
数据处理
| 模块 |
用途 |
| Text::CSV |
CSV 解析 |
| XML::LibXML |
XML 解析 |
| YAML::XS |
YAML 解析 |
| DBI |
数据库接口 |
| DBIx::Class |
ORM 框架 |
| 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)
本章小结
| 要点 |
内容 |
| MetaCPAN |
CPAN 搜索和浏览 |
| cpanm |
推荐的模块安装器 |
| cpm |
更快的并行安装器 |
| carton |
项目依赖管理 |
| Dist::Zilla |
模块打包发布 |
| PAUSE |
CPAN 模块上传平台 |
| cpanfile |
依赖声明文件 |
练习
- 使用 cpanm 安装 5 个常用的 CPAN 模块
- 创建一个 cpanfile,声明项目依赖
- 使用
cpan-outdated 检查你的过期模块
- 研究 MetaCPAN API(https://api.metacpan.org)
- 创建一个简单的 CPAN 模块骨架(使用 Dist::Zilla 或手动创建)
扩展阅读