1 个不稳定版本
0.1.2 | 2022年11月6日 |
---|---|
0.1.1 |
|
0.1.0 |
|
#558 在 配置
在 nickelodeon 中使用
24KB
222 行
配置查找器
自动搜索您的应用程序的配置文件和目录 <dirs>/.config/my-app
,包括仅本地文件。
有关入口点的详细信息,请参阅 ConfigDirs
。
问题
遵循“先展示门,再展示钥匙”的谚语,以下是对为什么存在这个包的解释。
我们假设的CLI应用程序,让我们称它为“Pear”,将本地机器的目录透明地连接到远程服务器,并保持同步。
它有一个全局配置,应用于所有连接,但也需要特定于目录的配置,例如 dir-perso
指向 server-perso
,而 dir-work
指向 server-work
。公司使用默认配置指向工作服务器,并期望开发者使用自己的凭据进行连接。
因为“Pear”是一个遵循良好CLI实践的优秀应用程序,它将存储库范围配置放在 repo/.config/pear/...
文件中。
所以结构如下
$HOME
|- .config/ (or where $XDG_CONFIG_HOME is pointing to)
| +- pear/
| +- config.kdl
|
|- perso/project-A
| |- .config/
| | +- pear/
| | +- config.kdl
| |- Cargo.toml
| +- src/..
|
+- work/
|- .config/
| +- pear/
| |- config.kdl
| +- config.local.kdl
|- Cargo.toml
+- src/..
我们如何找到所有配置文件呢?
有 $XDG_CONFIG_HOME
,$HOME/.config
如果前者未设置,各种存储库中的 .config
目录,config.local.kdl
与 config.local
,很难找到所有内容,而且容易遗漏。
解决方案
显然,您正在查看 config-finder
包的文档,所以这是(唯一的)解决方案。
以下是一个工作配置的示例
# fn main() { wrapped(); }
# fn wrapped() -> Option<()> {
use std::path::Path;
use config_finder::ConfigDirs;
std::env::set_var("XDG_CONFIG_HOME", "/configs/user-1");
let mut cd = ConfigDirs::empty();
let mut files = cd.add_path("~/work") // `.config` is automatically added
.add_platform_config_dir() // `.config` is not added for this
// Takes a reference to the original `ConfigDirs` so you can create
// multiple iterators to search for multiple files or directories
.search("pear", "config", "kdl");
let with_local = files.next()?;
assert_eq!(with_local.path(), Path::new("~/work/.config/pear/config.kdl"));
assert_eq!(with_local.local_path(), Path::new("~/work/.config/pear/config.local.kdl"));
let with_local = files.next()?;
assert_eq!(with_local.path(), Path::new("/configs/user-1/pear/config.kdl"));
assert_eq!(with_local.local_path(), Path::new("/configs/user-1/pear/config.local.kdl"));
assert_eq!(files.next(), None);
# Some(()) }
更多详细信息
您的应用程序接下来如何处理本地和正常形式的配置文件和目录完全取决于您。您可以合并本地和正常配置,如果存在本地配置,则完全忽略正常配置,只接受非本地配置,这是您的选择。
由于此库无法了解您系统的形状或您应用程序的需求,因此在给定的路径上不会进行任何检查。
由于需要文件系统访问,路径的规范化也未执行。如果您只想使用规范化的路径,请包装此库公开的类型。
MSRV
当前MSRV是 Rust 1.56.0。我预计这不会随着时间的推移而改变很多,但如果需要,它将至少在次版本(至少)中完成,并且不会向后移动超过3个版本(例如,如果当前Rust版本是1.65,它将不会跳到1.62之后的版本)。
依赖关系
~19–475KB