nix-flatpak终极指南:如何在NixOS上声明式管理Flatpak应用
【免费下载链接】nix-flatpakInstall flatpaks declaratively项目地址: https://gitcode.com/gh_mirrors/ni/nix-flatpak
nix-flatpak是一款专为NixOS设计的声明式Flatpak管理器,灵感源自declarative-flatpak和nix-darwin的homebrew模块。它提供了NixOS和home-manager模块,支持系统级或用户级Flatpak应用安装,让你轻松实现Flatpak应用的声明式管理。
什么是nix-flatpak?
nix-flatpak采用了一种"收敛模式"的包管理方法,目标系统状态描述并非详尽无遗,允许在构建和回滚过程中存在一定差异。对于许多桌面应用,我们希望能够跟踪最新版本或允许它们自动更新,这种收敛方法在系统可重现性方面是一个合理的权衡。
Flatpak应用由systemd oneshot服务在系统激活时触发安装。根据要安装的应用数量,这可能会显著增加激活时间。
快速开始:安装nix-flatpak
使用Flakes安装(推荐)
Flakes是推荐且官方支持的安装方法。你可以在flake配置中添加nix-flatpak输入:
{ inputs = { # ... nix-flatpak.url = "github:gmodena/nix-flatpak/?ref=latest"; # 使用最新稳定版 }; outputs = { nix-flatpak, ... }: { nixosConfigurations.<host> = nixpkgs.lib.nixosSystem { modules = [ nix-flatpak.nixosModules.nix-flatpak ./configuration.nix ]; }; }; }手动安装
如果你不使用Flakes,也可以手动下载并导入nix-flatpak模块。Nixpkgs用户可以使用fetchFromGithub获取器:
let # Fetch nix-flatpak nix-flatpak = pkgs.fetchFromGitHub { owner = "gmodena"; repo = "nix-flatpak"; rev = "v0.7.0"; hash = "sha256-7ZCulYUD9RmJIDULTRkGLSW1faMpDlPKcbWJLYHoXcs="; }; in imports = [ # 导入nix-flatpak NixOS模块以系统级安装应用 # HomeManager用户应在适当位置导入${nix-flatpak}/modules/home-manager.nix "${nix-flatpak}/modules/nixos.nix" ];配置Flatpak应用
启用Flatpak服务
首先在configuration.nix中启用flatpak服务:
services.flatpak.enable = true;配置远程仓库
默认情况下,nix-flatpak会添加flathub远程仓库。你可以通过services.flatpak.remotes选项手动配置远程仓库:
services.flatpak.remotes = lib.mkOptionDefault [{ name = "flathub-beta"; location = "https://flathub.org/beta-repo/flathub-beta.flatpakrepo"; }];使用lib.mkOptionDefault可以将声明的远程仓库与默认的flathub合并,而不是覆盖它。
声明要安装的应用
使用services.flatpak.packages选项声明要安装的Flatpak应用:
services.flatpak.packages = [ { appId = "com.brave.Browser"; origin = "flathub"; } "com.obsproject.Studio" "im.riot.Riot" ];你还可以通过设置commit=<hash>属性来固定特定的提交版本。
安装Flatpakref文件
你可以通过设置flatpakref属性来安装Flatpakref文件:
services.flatpak.packages = [ { flatpakref = "<uri>"; sha256="<hash>"; } ];sha256哈希是必需的,可以使用nix-prefetch-url <uri>生成。
安装Flatpak捆绑包
可以直接安装捆绑文件(.flatpak),方法是将bundle指向URI并提供匹配的sha256:
services.flatpak.packages = [ rec { appId = "<appId>"; sha256 = "<hash>"; bundle = "${pkgs.fetchurl { url = "<bundle-uri>"; inherit sha256; }}"; } ];管理Flatpak应用更新
激活时更新
设置以下选项可在系统激活时启用更新:
services.flatpak.update.onActivation = true;默认值为false,以确保nixos-rebuild switch的重复调用是幂等的。固定到特定提交哈希的应用不会被更新。
定期自动更新
可以通过设置以下选项启用定期更新:
services.flatpak.update.auto = { enable = true; onCalendar = "weekly"; # 默认值 };自动更新在系统激活时触发。底层使用systemd计时器调度更新,onCalendar接受systemd的日历表达式。
配置Flatpak覆盖
Flatpak覆盖允许你修改应用权限和环境变量。nix-flatpak提供了两种管理覆盖的方式:内联settings和外部files。
内联配置
使用services.flatpak.overrides.settings直接在Nix配置中声明覆盖:
{ services.flatpak.overrides.settings = { global = { # 默认强制使用Wayland Context.sockets = ["wayland" "!x11" "!fallback-x11"]; Environment = { # 修复某些Wayland应用中的光标主题问题 XCURSOR_PATH = "/run/host/user-share/icons:/run/host/share/icons"; # 为某些GTK应用强制正确的主题 GTK_THEME = "Adwaita:dark"; }; }; "com.visualstudio.code".Context = { filesystems = [ "xdg-config/git:ro" # 暴露用户Git配置 "/run/current-system/sw/bin:ro" # 暴露NixOS管理的软件 ]; sockets = [ "gpg-agent" # 暴露GPG代理 "pcsc" # 暴露智能卡(如YubiKey) ]; }; }; }外部覆盖文件
使用services.flatpak.overrides.files从外部INI文件加载覆盖:
{ services.flatpak.overrides = { files = [ ./overrides/com.visualstudio.code ./overrides/org.gnome.Terminal ]; }; }文件名称必须与应用ID匹配(例如com.visualstudio.code),文件应采用标准Flatpak覆盖INI格式。
高级设置
管理未声明的包和远程仓库
默认情况下,nix-flatpak只会管理在services.flatpak.packages中声明的包和在services.flatpak.remotes中声明的仓库。通过命令行或应用商店安装的Flatpak包和仓库不会受到影响。
设置services.flatpak.uninstallUnmanaged = true可以改变此行为,让nix-flatpak管理所有Flatpak包和仓库的生命周期。
存储位置
Flatpak存储在Nix存储之外,系统级安装(nixosModules)位于/var/lib/flatpak,用户级安装(homeManagerModules)位于${HOME}/.local/share/flatpak/。Flatpak安装不是分代的:系统重建和回滚时,包声明的更改将导致重新下载应用。
系统d服务错误重试
在网络连接不稳定的情况下,nix-flatpak安装脚本可能会失败。restartOnFailure选项控制flatpak-managed-install服务遇到失败时的行为:
restartOnFailure = { enable = true; restartDelay = "60s"; exponentialBackoff = { enable = false; steps = 10; maxDelay = "1h"; }; };示例配置
你可以在testing-base/flatpak.nix找到示例配置:
{ lib, ... }: { # 添加新的远程仓库,保留默认的flathub services.flatpak.remotes = lib.mkOptionDefault [{ name = "flathub-beta"; location = "https://flathub.org/beta-repo/flathub-beta.flatpakrepo"; }]; services.flatpak.update.auto.enable = false; services.flatpak.uninstallUnmanaged = false; # 在这里添加你想要安装的flatpaks services.flatpak.packages = [ #{ appId = "com.brave.Browser"; origin = "flathub"; } #"com.obsproject.Studio" #"im.riot.Riot" ]; }结语
nix-flatpak为NixOS用户提供了一种简单而强大的方式来声明式管理Flatpak应用。通过本文介绍的方法,你可以轻松配置、安装和更新Flatpak应用,同时保持系统的可管理性和可重现性。无论你是NixOS新手还是有经验的用户,nix-flatpak都能帮助你更好地管理桌面应用。
开始使用nix-flatpak,体验在NixOS上声明式管理Flatpak应用的便捷吧!你可以通过克隆仓库开始:git clone https://gitcode.com/gh_mirrors/ni/nix-flatpak
【免费下载链接】nix-flatpakInstall flatpaks declaratively项目地址: https://gitcode.com/gh_mirrors/ni/nix-flatpak
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考