跳转到内容
搜索 Fedora 文档

    浏览当前文档目录

    dnf 模块流(modules):Fedora 45 上已经没有模块了

    如果你搜到一篇讲 dnf module enable nodejs:20 的教程,在 Fedora 45 上会失败——不是因为命令写错,而是因为 Fedora 已经没有模块流了。

    先给结论,再讲来龙去脉。

    Terminal window
    sudo dnf module list
    Updating and loading repositories:
    Fedora 45 - x86_64 - Updates 100% | 33.0 KiB/s | 6.0 KiB | 00m00s
    Fedora 45 - x86_64 100% | 143.5 KiB/s | 27.4 KiB | 00m00s
    Repositories loaded.
    No matches found: no module streams exist.

    no module streams exist 不是”你没启用”,是仓库里根本没有模块元数据。

    再试一个常见的:

    Terminal window
    sudo dnf module enable nodejs:20
    No match for argument: nodejs:20
    You can try to add to command line:
    --skip-unavailable to skip unavailable packages

    F45 上实测 dnf module list 直接返回 no module streams exist;dnf module enable nodejs 返回 No match for argument

    dnf5 的 module 子命令还在,但只剩五个

    Section titled “dnf5 的 module 子命令还在,但只剩五个”
    Terminal window
    dnf module --help
    Query Commands:
    list List module streams
    info List module streams
    Stream Management Commands:
    enable Enable module streams and make their packages available.
    reset Reset module state so it's no longer enabled or disabled.
    disable Disable modules including all their streams.

    对比 dnf4 时代最常用的那条:

    Terminal window
    dnf module install nodejs
    Unknown argument "install" for command "module". Add "--help" for more information about the arguments.

    dnf5 里没有 module install——dnf4 的 module install / module remove / module update / module switch-to 都没有对应的子命令。这些命令留着 enable、reset、disable,是为了让旧脚本不至于连”语法”都不对,但实际没有模块可操作。

    模块流同一时间只能启用一条;Fedora 45 的仓库里已经没有模块元数据

    一句话:在同一个发行版里提供同一个软件的多个版本线。

    概念含义例子
    module一组包nodejs
    stream一条版本线nodejs:20、nodejs:22
    profile安装子集nodejs:20/minimal
    default默认启用的流不写版本时用哪条

    它想解决的是「系统要 Python 3.12,我的项目要 3.11」这类冲突——同一时间只能启用一条流,这就是它的根本限制。

    Fedora 放弃模块流之后,版本选择回到了更直接的机制:

    需求现在怎么做
    要另一个语言版本用发行版给的版本,项目侧用 venv / Toolbx / 容器隔离(见工具链)
    要并存的多个版本装版本化的包名,例如 python3.13、php8.3 这类独立包
    要上游最新自建仓库或容器镜像,不要动系统包
    要 EL 那种稳定性用 CentOS Stream / RHEL,模块流在那边还活着
    Terminal window
    dnf search python3.1 # 找版本化的包名
    dnf search php8 # PHP 也是同样的套路

    关键区别:模块流是”切换系统里那一个版本”;版本化包名是”同时装多个版本”。后者对开发环境更友好。

    从旧系统或旧文档过来时,按这四条对齐:

    1. dnf module list 有没有输出——没有模块就是没有,别硬找;
    2. 脚本里有没有 dnf module install——改成 dnf install <包名>;
    3. 有没有 dnf module enable nodejs:xx——改成装对应版本化的包,或用容器;
    4. 配置文件里有没有 /etc/dnf/modules.d/——F45 上这个目录通常不存在,残留的 .module 文件可以清掉。
    Terminal window
    ls /etc/dnf/modules.d/ 2>/dev/null || echo "no module state"

    模块流在 Fedora 里一直有争议:它让仓库元数据变复杂、让”装了哪个版本”变得不直观,而且和容器化的方向重复。Fedora 逐步把内容从模块迁回普通包,最终在近几个版本里清空。

    这个决定的影响是降低了复杂度:dnf install 就是装最新,想知道装了什么看 rpm -q 就够,不用再查”当前启用的是哪条流”。