Nixpkgs 中 Krita 插件安装指南:pykrita 与二进制插件(binaryPlugins)的配置与实现解析
【免费下载链接】nixpkgsNix Packages collection & NixOS项目地址: https://gitcode.com/GitHub_Trending/ni/nixpkgs
导读
Krita 是 NixOS / nixpkgs 中一款由 KDE 社区维护的专业开源数字绘画软件。本文以 nixpkgs 官方文档 doc/packages/krita.section.md 为主线,系统讲解两类 Krita 插件的安装方式:面向脚本编写的Python 插件(pykrita)与面向原生编译的二进制插件(binary plugins)。读完本文,你将掌握 pykrita 插件的目录部署方法,理解 nixpkgs 中binaryPlugins属性的语义,并能通过override在不替换既有插件的前提下自由增删二进制插件,同时了解其背后的symlinkJoin合并实现与环境变量注入原理。
Python 插件(pykrita)的安装
Krita 支持通过 Python 脚本扩展功能,这类插件通常称为pykrita插件。按照 Krita 官方手册 的说明,pykrita 插件应当按以下方式安装:
- 从插件作者处获取插件压缩包(zip 等格式);
- 将压缩包解压到用户目录下的固定位置
~/.local/share/krita/pykrita/; - 重启 Krita 后,在设置 → 配置 Krita → Python 插件管理器中启用对应的插件脚本。
该目录是 Krita 在用户主目录下约定的 Python 插件根目录,插件作者通常会按“一个插件一个子目录”的方式组织结构,例如~/.local/share/krita/pykrita/my_script/内含__init__.py等脚本文件与可选资源。
注意:这种安装方式是用户级、无 Nix 包装的常规做法,插件脚本直接落在主目录下,不经过 nix store,也不受
binaryPlugins机制管理。它适用于一切发行版,是 Krita 官方推荐的自定义脚本分发路径。
二进制插件:什么是 kritaplugins
与 Python 插件不同,二进制插件(binary plugins)是编译好的动态链接库(Dynamically Linked Libraries,即.so文件),由 Krita 在启动时加载。它们与 Krita 主程序共享同一套 Qt/KDE 运行环境与内部 API,通常用于性能敏感的图像处理、文件格式支持或复杂的滤镜算法。
nixpkgs 文档给出了一条非常实用的提示:绝大多数情况下你并不需要手工处理二进制插件——所有已知的官方插件都已经随 Krita 打包并被默认启用。因此,只有当你需要安装自定义/第三方二进制插件时,才需要阅读下面的内容。
使用binaryPlugins属性安装二进制插件
nixpkgs 中的krita包暴露了一个可覆盖(override)的构造参数binaryPlugins,它决定最终安装的二进制插件集合。查看 krita 的 package.nix 可知其默认值为:
binaryPlugins ? [ # Default plugins provided by upstream appimage krita-plugin-gmic ]即默认捆绑了GMic 插件(krita-plugin-gmic,一个提供 GMic 滤镜集合的知名 Krita 插件)。
追加插件(推荐做法)
直接覆盖binaryPlugins会整体替换默认列表。如果你只是想追加自己的插件,可以读取当前的插件列表pkgs.krita.binaryPlugins,然后拼接新插件。文档给出的标准写法如下:
(pkgs.krita.override (old: { binaryPlugins = old.binaryPlugins ++ [ your-plugin ]; }))其中:
old是覆盖前的krita派生体,old.binaryPlugins即当前默认插件列表(至少包含krita-plugin-gmic);your-plugin是你自己的二进制插件包,必须满足下述目录结构约定;- 拼接得到的完整列表会传入
krita.override,最终全部插件与 Krita 主程序一起被合并安装。
由于binaryPlugins是通过passthru透传的(见 package.nix 第 33-36 行),你始终可以借助pkgs.krita.binaryPlugins这一通道读取当前列表,从而安全地做“追加”而非“替换”操作。
自定义插件包的目录结构
被追加到binaryPlugins的插件包,其安装产物必须符合 Krita 期望的目录布局,即插件的动态库需要位于包内lib/kritaplugins/目录下。文档给出的标准结构示例:
/nix/store/00000000000000000000000000000000-krita-plugin-example-1.2.3 └── lib └── kritaplugins └── krita_example.so也就是说,一个合格的二进制插件包在 nix store 中的形态是:
- 包根目录包含
lib/kritaplugins/子目录; - 该子目录内放置编译好的
.so动态库(如krita_example.so); - Krita 启动时会扫描并加载
lib/kritaplugins下的全部动态库。
仓库内的krita-plugin-gmic正是按此约定构建的示例:其源码来自 GitHub 上的vanyossi/gmic仓库的gmic-qt子目录,通过 CMake 以GMIC_QT_HOST=krita-plugin模式编译,产物即为 Krita 可加载的插件动态库(参见 krita-plugin-gmic/package.nix)。
源码视角:插件是如何被“合并”进 Krita 的
了解了使用方法后,再来看 nixpkgs 是如何实现这种插件合并的,这有助于你调试自定义插件。
krita包的实现基于symlinkJoin,其核心逻辑在 pkgs/by-name/kr/krita/package.nix:
symlinkJoin { pname = "krita"; paths = [ krita-unwrapped ] ++ binaryPlugins; ... }关键点解读:
paths = [ krita-unwrapped ] ++ binaryPlugins:最终安装的krita是一个“合并视图”,底层包含未包装的 Krita 主程序krita-unwrapped(当前版本为 6.0.3,见 krita-unwrapped/package.nix)以及全部二进制插件。symlinkJoin会把所有这些包的内容统一软链接到一个输出目录中,这正是为什么各个插件包内需要约定统一的lib/kritaplugins/相对路径——只有目录结构一致,symlinkJoin才能把它们正确合并在同一位置。--set KRITA_PLUGIN_PATH "$out/lib/kritaplugins":包装脚本通过wrapQtApp显式设置环境变量KRITA_PLUGIN_PATH,指向合并后输出中的$out/lib/kritaplugins。Krita 据此得知二进制插件的加载目录。如果你的自定义插件没有被加载,优先检查它的.so是否真的被合并进了该目录。passthru.unwrapped = krita-unwrapped:包同时暴露未包装的原始 Krita 派生体(krita.unwrapped),便于需要深度定制或调试的场景直接使用底层包。Qt/GApps 包装:
nativeBuildInputs中追加了wrapGAppsHook3,并在postBuild中调用wrapQtApp,同时注入PYTHONPATH前缀,确保 Krita 在 Nix 环境下能找到 Qt 插件、GIO 模块与 Python 运行库,这是 Nix 沙盒式分发所必需的运行时修补。
实用建议与注意事项
- 优先追加而非替换:使用
old.binaryPlugins ++ [ your-plugin ]的写法,可以避免丢掉默认的 GMic 插件。 - 确认目录结构:
your-plugin的.so必须位于其包内lib/kritaplugins/下,且.so的链接依赖(如 Qt6、KDE Frameworks)必须完整声明在buildInputs中,否则会出现加载失败或符号缺失。 - Python 插件不受此机制管理:pykrita 脚本插件始终走
~/.local/share/krita/pykrita/的用户目录路线,binaryPlugins只作用于编译型.so插件。 - 排查加载问题:可运行
krita.unwrapped(底层未包装版本)并结合KRITA_PLUGIN_PATH手工验证插件是否能被扫描到,再回到包装版本中对比环境差异。
结语
Krita 在 nixpkgs 中的插件体系清晰地将“脚本插件”与“二进制插件”两条路径分离:前者沿用 Krita 官方的用户目录约定,后者则通过binaryPlugins参数与symlinkJoin的合并机制实现可声明式、可复现的插件集成。理解KRITA_PLUGIN_PATH的注入逻辑与默认插件列表(GMic)后,你就能在 NixOS 或 nix-darwin 环境中轻松定制属于自己的 Krita 插件集合。
【免费下载链接】nixpkgsNix Packages collection & NixOS项目地址: https://gitcode.com/GitHub_Trending/ni/nixpkgs
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考