You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 10:48:22