第 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 或手动创建)
扩展阅读