如何用Dist::Zilla的dist.ini为兼容Mojo::SQLite/Pg的模块设置可选依赖?
处理兼容Mojo::SQLite/Mojo::Pg的Perl模块依赖配置(Dist::Zilla)
这类兼容多数据库驱动的模块,核心是把数据库驱动作为可选依赖,而非强制运行时依赖——毕竟用户可能只需要用到其中一种数据库,没必要强制安装所有驱动。以下是具体的dist.ini配置和配套代码逻辑:
1. Dist::Zilla配置(dist.ini)
核心依赖声明
只把模块运行必需的核心依赖放进[Prereqs],不要包含Mojo::SQLite或Mojo::Pg:
name = Your::Mojo::DB::Module author = Your Name <your@email.com> license = Perl_5 copyright_holder = Your Name [Prereqs] perl = 5.010 Mojolicious = 8.00 # 其他核心依赖,比如Moo::Role/Moose::Role(如果用Role实现)
可选依赖声明
用RuntimeSuggests段声明建议依赖,告诉用户这些模块是可选但能解锁对应数据库支持的:
[Prereqs / RuntimeSuggests] Mojo::SQLite = 3.00 Mojo::Pg = 4.00
这个配置会在模块的META.json/META.yml里标记这些依赖为"suggests",CPAN工具会识别但不会强制安装。
测试依赖配置(可选)
如果你的测试用例需要验证两种数据库的兼容性,可以把它们放进TestSuggests(非强制测试依赖),或者TestRequires(强制测试依赖,仅在用户运行make test时安装):
[Prereqs / TestRequires] Test::More = 0.98 Test::Mojo = 0.90 [Prereqs / TestSuggests] Mojo::SQLite = 3.00 Mojo::Pg = 4.00
如果是仅作者需要运行的完整测试,可以把相关依赖放进xt/目录的测试文件,并用[Prereqs / DevelopRequires]声明:
[Prereqs / DevelopRequires] Mojo::SQLite = 3.00 Mojo::Pg = 4.00
2. 代码层面的运行时检查
因为没有强制依赖,必须在代码里做运行时检查,确保用户尝试使用对应数据库时能得到明确提示:
sub setup_db { my ($self, $db_type) = @_; if ($db_type eq 'sqlite') { eval { require Mojo::SQLite; Mojo::SQLite->import; 1 } or die "请先安装Mojo::SQLite以使用SQLite支持: $@"; # 后续Mojo::SQLite的初始化逻辑 } elsif ($db_type eq 'pg') { eval { require Mojo::Pg; Mojo::Pg->import; 1 } or die "请先安装Mojo::Pg以使用PostgreSQL支持: $@"; # 后续Mojo::Pg的初始化逻辑 } else { die "不支持的数据库类型: $db_type"; } }
为什么同类模块这么做?
Mojo::DB::Results::Role::Struct这类模块本质是一个Role,需要依附于Mojo::SQLite或Mojo::Pg的Results对象才能工作,因此没必要强制依赖任何一个数据库驱动——把选择权交给用户,用户用哪个数据库就安装对应的驱动,模块只在实际使用时做检查提示。
内容的提问来源于stack exchange,提问作者simone
相关产品推荐
相关产品推荐

