如何使用cabal2nix打包Cabal项目的资源文件(含桌面文件)?
为NixOS的Cabal项目添加桌面文件、图标等资源的方法
你不需要完全重写installPhase,通过overrideAttrs扩展postInstall阶段是更稳妥的方式——既保留callCabal2nix处理Haskell项目的原有逻辑,又能追加额外资源的安装步骤。
完整的default.nix示例
假设你的项目目录结构如下:
. ├── myapp.cabal ├── default.nix ├── myapp.desktop └── icons/ └── hicolor/ └── 48x48/ └── apps/ └── myapp.png
修改后的default.nix内容:
{ pkgs ? import <nixpkgs> { }, ... }: pkgs.haskellPackages.callCabal2nix "myapp" ./. { } .overrideAttrs (oldAttrs: rec { # 添加所需的额外依赖,比如处理桌面文件和图标缓存的工具 buildInputs = oldAttrs.buildInputs ++ [ pkgs.desktop-file-utils pkgs.gtk3 # 用于gtk-update-icon-cache ]; postInstall = '' # 安装桌面文件:先创建目录,再用desktop-file-install验证并安装 mkdir -p $out/share/applications desktop-file-install \ --dir=$out/share/applications \ ${./myapp.desktop} # 安装图标:按hicolor图标主题规范放置 mkdir -p $out/share/icons/hicolor/48x48/apps cp ${./icons/hicolor/48x48/apps/myapp.png} $out/share/icons/hicolor/48x48/apps/ # 更新图标缓存 gtk-update-icon-cache -f $out/share/icons/hicolor # 如果有其他资源(比如配置文件、数据文件),可以类似复制 # mkdir -p $out/share/myapp # cp -r ./data/* $out/share/myapp/ ''; })
关键细节说明
- 桌面文件规范:你的
myapp.desktop里的Exec字段要写Exec=$out/bin/myapp(Nix构建后二进制会放在$out/bin下),确保系统能找到可执行文件。 - 图标放置:遵循Freedesktop图标主题规范,把不同尺寸的图标放到对应
hicolor/[size]/apps目录下,这样桌面环境能正确识别。 - 依赖添加:
desktop-file-utils提供desktop-file-install工具,用于验证桌面文件格式并安装;gtk3提供图标缓存更新工具,确保图标能被系统立即识别。 - postInstall的作用:这个阶段是在原有
installPhase完成之后执行,不会干扰Cabal原本的二进制、库文件安装流程。
内容的提问来源于stack exchange,提问作者amkhlv
相关产品推荐
相关产品推荐

