このリポジトリを維持したくないので、アーカイブします。
nix-desktop 、NIXプロジェクトのLinuxデスクトップ統合を定義できます。このスクリプトを使用すると、XDGデスクトップメニューエントリとSystemDユニットをnixを使用して宣言的に定義し、iDempotentの方法で適用できます。
私はホームマネージャーのユーザーです。プログラム実行可能ファイル、構成ファイル、SystemDサービス、その他のファイルを含むユーザー(HOME)構成全体を管理できますが、その構成方法は集中化されます。それは(明らかに)ホームディレクトリごとに1つの構成のみを許可します。時々、私は少し分散化されたものが欲しかった。たとえば、データを含むプライベートGITリポジトリがいくつかあり、リポジトリに関連するアプリケーションを関連するマシンにのみインストールしたいと考えています。私は彼らの存在を一般から隠したいので、彼らは私の公開構成で言及すべきではありません。
Nix Flakesを使用すると、プロジェクトリポジトリ内のパッケージとアプリを定義できます。ただし、そのようなアプリをLinuxデスクトップと統合する方法は見つかりませんでした。端末を開かずに開始するために、プロジェクト内で定義されたアプリのメニューエントリをインストールしたかったのです。これは、一貫した方法でそれを実装する試みです。注:これはnixフレークに依存しません。
nix-envを使用した構成ファイルの素朴なアドホックインストールとは異なり、 nix-desktopシステム状態を更新します。デスクトップメニューエントリの更新が通知され、リロード/enable/(re)インストールされたSystemDユニットを起動します(およびアンインストールされていないユニットを停止および無効にします)。これは、一連のデスクトップアプリケーションとサービスを削除するための便利で信頼できるソリューションです。
nixを使用してこのリポジトリをインストールします。
nix-env -if .または、既にNIXフレークを有効にしている場合は、プログラムをインストールせずに使用できます。
nix run ' github:akirak/nix-desktop ' リポジトリにdesktop.nixという名前のファイルを作成して、構成を定義できます。以下は例です。
let
pkgs = import <nixpkgs> { } ;
thisDir = builtins . toString ./. ;
in
{
name = "my-config" ;
# Run Doom Emacs inside a sandboxed nix-shell session.
xdg . menu . applications . doom-emacs = {
Name = "Doom Emacs" ;
Icon = "emacs" ;
TryExec = " ${ builtins . getEnv "HOME" } /.config/doom-runner/emacs/bin/doom" ;
Exec = " ${ pkgs . nix } /bin/nix-shell ${ builtins . toString ./. } /doom/shell.nix --command emacs" ;
StartupWMClass = "Emacs" ;
} ;
# Automatically set up an overlayfs directory in the repository.
systemd . services . overlayfs-repos = {
enable = true ;
start = true ;
restart = false ;
text = ''
[Unit]
Description=Example overlayfs service
ConditionPathIsDirectory= ${ thisDir } /repos-src
ConditionPathIsDirectory= ${ thisDir } /repos-overlay
ConditionPathIsDirectory= ${ thisDir } /.repos-work
ConditionPathIsDirectory= ${ thisDir } /repos
[Service]
Type=oneshot
ExecStart= ${ pkgs . fuse-overlayfs } /bin/fuse-overlayfs -o lowerdir= ${ thisDir } /repos-src,upperdir= ${ thisDir } /repos-overlay,workdir= ${ thisDir } /.repos-work ${ thisDir } /repos
RemainAfterExit=yes
ExecStop= ${ pkgs . fuse } /bin/fusermount -u ${ thisDir } /repos
[Install]
WantedBy=default.target
'' ;
} ;
}ファイルは属性セットをエクスポートし、プロジェクトを一意に識別するために使用される必須のnameフィールドを含める必要があります。これは、構築されるnix派生の一部になるため、ファイル名は安全である必要があります。
xdg.menu.applications.* XDGメニューエントリを定義します。一部のフィールドには賢明なデフォルトがありますが、 Name 、 Icon 、 Exec 、およびStartupWMClassを指定する必要があります。
systemd.TYPE.*ユーザーSystemDサービスを定義します。 TYPE 、SystemDによってサポートされているユニットタイプを表すためのservices 、 timers 、およびその他の複数形です。
ユニットファイルのコンテンツになるtextフィールドを含める必要があります。
また、次のオプションフィールドもサポートしています。
enable (bool):インストール後にユニットを有効にします。start (bool):インストールがない場合は、インストール後にユニットを起動します。restart (bool):ユニットが変更された場合、ユニットを再起動します。このオプションを使用しても、変更されていないユニットは再起動しません。 nix-desktopコマンドには次の概要があります。
nix-desktop [install | uninstall | build] DIRまたはnixフレークで:
nix run ' github:akirak/nix-desktop ' [install | uninstall | build] DIR DIRは必須の引数であり、 desktop.nixを含むディレクトリに設定する必要があります。
コマンドは、次の操作モードをサポートします。これは、ディレクトリに加えられたオプションの最初の引数で示される必要があります。
installと、ディレクトリに定義されたアプリケーションをインストールします。このモードはデフォルトであるため、subcommand installを省略し、唯一の引数としてディレクトリを指定できます。uninstallと、アプリケーションをアンインストールします。build installのようなものですが、構成のみをビルドし、構成ファイルをインストールしたり、システムを更新したりしません。他のプロジェクトで定義されているアプリケーションとの競合を検出するため、エラーメッセージを確認してください。
インストールされているプロジェクトのリストを閲覧できます。
nix-desktop list --verifyフラグを使用すると、リストコマンドはソースディレクトリが存在するかどうかを確認します。
nix-desktop list --verify単一のコマンドでインストールされているすべてのプロジェクトを更新することもできます。
nix-desktop update