Skip to content

Handle XDG Directories

コマンドラインまたは TUI アプリケーションでファイルとディレクトリを正しく処理すると、アプリケーションがユーザーのワークフローにシームレスに適合し、確立された規則に準拠することが保証されます。Linux ベースのシステムにおける重要な規則の 1 つは、XDG ベース ディレクトリ仕様です。

なぜXDGベースディレクトリの仕様があるのですか?

XDG ベース ディレクトリ仕様は、ユーザー ファイルの保存場所を定義する一連の標準であり、ホーム ディレクトリの整理と、より整理されたストレージ規則を保証します。この標準に従うことで、アプリケーションは期待されるディレクトリにファイルを保存するため、予測可能でユーザー フレンドリになります。

パス解決に directories-rs を使用する

directories-rs ライブラリは、XDG ベース ディレクトリ仕様などの確立された規則に基づいて、一般的なディレクトリ (config ディレクトリや data ディレクトリなど) を見つけるための Rust 対応のインターフェイスを提供します。

  1. Cargo.tomldirectories-rs を追加します
Terminal window
cargo add directorys
  1. ProjectDirs 構造体を使用して、プロジェクトのドメインとプロジェクト名に基づいてパスを取得し、data_dirconfig_dir を取得するためのヘルパー関数を作成します。

  2. ユーザーが環境変数を使用してカスタムの場所を指定できるようにします。この柔軟性は、独自のディレクトリ構造を持つユーザーやテストにとって非常に重要です。

  3. 構成ディレクトリとデータ ディレクトリの場所をユーザーに通知することをお勧めします。テンプレートの例では、ユーザーが --version コマンドライン引数を呼び出すと、これらの場所が出力されます。コマンドライン引数の解析 のセクションを参照してください。

参照のために、 get_data_dir() および get_config_dir() の機能を次に示します。

use std::path::PathBuf;
use color_eyre::eyre::{self, WrapErr};
use directories::ProjectDirs;
pub fn get_data_dir() -> eyre::Result<PathBuf> {
let directory = if let Ok(s) = std::env::var("RATATUI_TEMPLATE_DATA") {
PathBuf::from(s)
} else if let Some(proj_dirs) = ProjectDirs::from("com", "kdheepak", "ratatui-template") {
proj_dirs.data_local_dir().to_path_buf()
} else {
return Err(eyre::eyre!("Unable to find data directory for ratatui-template"));
};
Ok(directory)
}
pub fn get_config_dir() -> eyre::Result<PathBuf> {
let directory = if let Ok(s) = std::env::var("RATATUI_TEMPLATE_CONFIG") {
PathBuf::from(s)
} else if let Some(proj_dirs) = ProjectDirs::from("com", "kdheepak", "ratatui-template") {
proj_dirs.config_local_dir().to_path_buf()
} else {
return Err(eyre::eyre!("Unable to find config directory for ratatui-template"));
};
Ok(directory)
}

kdheepak をユーザー名または会社名 (または任意の一意の名前) に置き換え、ratatui-app を CLI の名前に置き換えます。

私は https://kdheepak.com を所有しているので、プロジェクト ディレクトリには com.kdheepak.ratatui-app を使用する傾向があります。