Dv4rune
Haixin Pang 二月 27, 2025 更新: 四月 02, 2025 #PRO介绍
这个工具主要功能是用来方便的执行一系列操作,如:自动化任务、文件拷贝、应用管理、执行命令等。
由于自定义执行逻辑以配置文件的形式呈现过于复杂,本工具选择与Rune结合,以Module形式嵌入,可以在Rune代码中直接调用dv-api的功能。
API
外部类型
| type | description |
|---|---|
Config | 用户配置 |
Os | 操作系统 |
Packages | 包 |
Dv | API |
Config
成员函数
| sig | description |
|---|---|
fn cur() -> Config | 创建当前用户的Config,默认设置HID为local,MOUNT为~/.local/share/dv,OS为linux |
fn ssh(host: &str) -> Config | 创建ssh用户的Config,默认设置HOST为host参数,MOUNT为~/.local/share/dv,OS为linux |
fn index_set(&mut self, key: &str, value: &str) | 设置Config的成员变量 |
成员变量
| name | type | description |
|---|---|---|
is_system | Option<bool> | 设置用户是否为系统用户,如果不设置则当前用户自行探测,ssh目前为为TODO状态 |
Example:
let cur = cur;// 创建当前用户的配置
cur = "local_machine";// 修改当前用户的`HID`为`local_machine`
let ssh = ssh;// 创建ssh用户的配置
ssh.is_system = Some;// 设置`ssh`用户为`root`用户
Os
成员函数
| sig | description |
|---|---|
fn compat(&self, oth: &str) -> bool | 判断Os是否兼容于oth,如linux兼容于unix |
fn as_str(&self) -> String | 将Os转换为字符串 |
Example:
let os = dv.os?;// 获取`this`用户的`Os`
os.compat; // 判断`os`是否兼容于`linux`
dbg!; // 打印`os`的字符串表示
Packages
成员函数
| sig | description |
|---|---|
fn new() -> Packages | 创建一个新的Packages |
fn add_assign(&mut self, pkg: &Packages) | 合并另一个Packages |
fn index_set(&mut self, key: &str, value: &str) | 设置包管理器对应的包 |
Example:
let pkg = new;// 创建一个新的`Packages`
pkg = "zellij";// 设置`apt`包管理器对应的包为`zellij`
pkg = "zellij";// 设置`pacman`包管理器对应的包为`zellij`
let pkg2 = new;// 创建另一个新的`Packages`
pkg2 = "alacritty";// 设置`apt`包管理器对应的包为`alacritty`
pkg += pkg2;// 合并两个`Packages`
Dv
成员函数
| sig | description | link |
|---|---|---|
async fn add_user(id: &str, user: Config) -> Result<(), Error> | 添加用户 | link |
async fn auto(id: &str, service: &str, action: &str, args: Option<&str>) -> Result<bool, Error> | 自动化任务 | link |
async fn copy(id: &str, src:(&str, &str), dst:(&str, &str), confirm: Option<&str>) -> Result<bool, Error> | 拷贝文件 | link |
async fn exec(id: &str, shell: Option<&str>, cmd: &str) -> Result<bool, Error> | 执行命令 | link |
load_src(id: &str, path: &str) -> Result<Vec, Error> | 加载源文件 | link |
async fn once(id: &str, tid: &str, f: fn() -> Future<Result<(),Error>>) -> Result<bool, Error> | 执行一次 | link |
fn os(id: &str) -> Result<Os, Error> | 获取用户的操作系统 | link |
async fn pm(id: &str, pkg: Package) -> Result<bool, Error> | 包安装器 | link |
async fn refresh(id: &str, key: &str) -> Result<(), Error> | 刷新某些内置的机制 | link |
add_user
添加一个用户,用户的配置可以是当前用户或ssh用户。
Example:
dv.add_user.await?;
dv.add_user.await?;
auto
对指定的服务执行指定的动作,动作可以是setup,reload,destroy。
平台支持:
-
current-
linux: 使用systemd作为后端实现action description setup 理解为 enablereload 理解为 reload_or_restartdestroy 理解为 disable -
windows: 使用system service作为后端实现(实验)action description setup 理解为 install enable startreload 理解为 stop startdestroy 理解为 stop uninstall -
macos: TODO
-
-
ssh-
linux: 使用systemd作为后端实现(systemctl)action description setup 理解为 enablereload 理解为 reload_or_restartdestroy 理解为 disable -
windows: TODO -
macos: TODO
-
Example:
dv.auto.await?;
copy
copy文件到指定的用户,confirm参数可以是y,u,n,分别表示覆盖,更新,不变。如果不指定confirm参数,则运行时会询问用户。
路径规则
~会展开为用户的home目录- 尝试使用
variable与环境变量展开,格式为${var} - 相对路径会尝试使用
MOUNT展开 - 格式如下:
| src | dst | action | description |
|---|---|---|---|
| a/ | b/ | a/* -> b/* | 拷贝目录下所有文件到目标目录 |
| a/ | b | a/* -> b/* | 拷贝目录下所有文件到目标目录 |
| a | b/ | a -> b/a | 拷贝目录/文件到目标目录 |
| a | b | a -> b | 拷贝目录(文件)到目标路径 |
注意:实际上是通过两个文件的mtime来判断文件是否需要更新
- 源文件
mtime变化则尝试覆盖 - 目标文件
mtime变化则尝试更新
exec
执行命令或脚本,shell参数可以是None或shell的路径,如果shell为None,则直接执行命令,如果shell不为None,则将命令作为脚本传入shell执行。
Example:
dv.exec.await?;
dv.exec.await?;
load_src
加载源文件,返回一个Vec,每个元素为一个String,表示源文件的内容。
once
确保某个函数只执行一次,tid参数为任务的id,f参数为函数指针,函数指针的返回值为Future<Result<(),Error>>类型。
Example:
let pkg = new;// 创建一个新的`Packages`
pkg = "zellij";// 设置`apt`包管理器对应的包为`zellij`
dv.once.await?;// 这里会执行一次`pm`函数
os
获得用户的操作系统,返回一个Os类型的对象,包含了操作系统的名称。
Example:
let os = dv.os?;// 获取`this`用户的`Os`
pm
安装某个包,pkg参数为一个Packages类型的对象,表示要安装的包。
Example:
let pkg = new;// 创建一个新的`Packages`
pkg = "zellij";// 设置`apt`包管理器对应的包为`zellij`
pkg = "zellij";// 设置`pacman`包管理器对应的包为`zellij`
dv.pm.await?;// 安装`zellij`
refresh
刷新某些内置的机制,key参数为要刷新的键值。如果key为空,则会刷新所有的键值。
| key | description |
|---|---|
path | 则会删除对应的path的mtime记录 |
once_id | 则会删除对应的once_id的记录 |
使用
cli命令行工具的使用方法如下:
相关文件
| file | description |
|---|---|
.cache | 缓存文件,默认路径为$directory/.cache,可通过-b指定 |
config.rn | 配置文件,默认路径为$directory/config.rn,可通过-c指定 |
__build.rn | 单独运行的rune文件,路径为$directory/__build.rn |
Example:
// __build.rn
// 这是一个简单的示例
// 加载配置文件
pub async
// r:~/.local/share/dv/rune/lib.rn
pub async
pub async
// config.rn
路线图
执行脚本
-
执行命令
-
执行内嵌脚本
-
指定脚本文件
文件操作
-
拷贝文件
-
拷贝目录
-
修改文件
服务管理
-
linux服务管理 -
windows服务管理 -
更多后端支持
应用(包)管理
platform支持:
-
apt -
pacman -
yay -
paru
基础操作
- 安装
- 卸载等其他操作