boxxy
boxxy(区分大小写)是一个用于约束不守规矩的 Linux 应用程序的工具,它可以强制这些应用程序将文件和目录放在正确的位置,而无需使用符号链接!
boxxy 是 amyware discord 服务器 的一部分。
如果你喜欢我的作品,可以考虑在 Patreon 上支持我:
仅限 Linux!boxxy 使用 Linux 命名空间来实现其功能。
例如,考虑 tmux。它想要将其配置文件放在 ~/.tmux.conf
中。使用 boxxy,你可以将其配置文件放在 ~/.config/tmux/tmux.conf
中:
# ~/.config/boxxy/boxxy.yaml
rules:
- name: "将 tmux 配置从 ~/.tmux.conf 重定向到 ~/.config/tmux/tmux.conf"
target: "~/.tmux.conf"
rewrite: "~/.config/tmux/tmux.conf"
mode: "file"
动机
最近我不得不使用 AWS CLI。它想要将数据保存在 ~/.aws
中,但我不希望它随意地弄乱我的 $HOME
。boxxy 让我可以强制它将数据放在一个合适的位置。
特性
- 约束任何程序,强制它将文件/目录放在你想要的位置
- 上下文相关的约束,即根据你的配置,在不同的目录中应用不同的规则
- 最小化开销
- 可选的不可变文件系统(除规则重写外),即只有你在规则中指定的文件/目录是可写的
0.5.0
:boxxy 可以扫描你的主目录,自动为你推荐规则!0.6.0
:boxxy 可以使用项目本地的boxxy.yaml
文件,并可以为你加载.env
文件!0.6.1
:boxxy 规则可以注入环境变量:0.7.2
:boxxy 可以使用--daemon
标志将被约束的进程分叉到后台。0.8.0
:boxxy 可以通过命令行使用--rule
传递规则,并使用--no-config
禁用加载配置文件。0.8.2
:解释如何正确运行 AppImages:
潜在缺点
- 新项目,版本号为 0.x.y,附带所有相关警告
- 无法在容器内使用 sudo(参见 #6)
- 主要针对我的使用场景进行测试
使用示例
git:(mistress) | ▶ cat ~/.config/boxxy/boxxy.yaml
rules:
- name: "将 AWS CLI 配置存储在 ~/.config/aws 中"
target: "~/.aws"
rewrite: "~/.config/aws"
git:(mistress) | ▶ boxxy aws configure
INFO boxxy > 加载了 1 条规则
INFO boxxy::enclosure > 应用规则 '将 AWS CLI 配置存储在 ~/.config/aws 中'
INFO boxxy::enclosure > 重定向:~/.aws -> ~/.config/aws
INFO boxxy::enclosure > 已约束 "aws" ♥
AWS Access Key ID [****************d]: a
AWS Secret Access Key [****************c]: b
Default region name [b]: c
Default output format [a]: d
git:(mistress) | ▶ ls ~/.aws
git:(mistress) | ▶ ls ~/.config/aws
config credentials
git:(mistress) | ▶ cat ~/.config/aws/config
[default]
region = c
output = d
git:(mistress) | ▶
建议用法
alias aws="boxxy aws"
(对其他工具重复此操作)- 使用上下文将项目配置分开存储在磁盘上
- 点文件!
- 停止使用符号链接!!!
- 编写代码时不再有开发配置文件
配置
boxxy 配置文件位于 ~/.config/boxxy/boxxy.yaml
。如果不存在,将为你创建一个空的配置文件。
rules:
# 规则名称。用户友好的名称,供你参考
- name: "将 aws-cli 从 ~/.aws 重定向到 ~/.config/aws"
# 规则的目标,即将被重写覆盖的文件/目录。
target: "~/.aws"
# 规则的重写,即将替代目标使用的文件/目录。
rewrite: "~/.config/aws"
- name: "在 ~/Projects/my-cool-startup 中使用不同的 k8s 配置"
target: "~/.kube/config"
rewrite: "~/Projects/my-cool-startup/.kube/config"
# 规则的上下文。上下文中列出的任何路径都是此规则适用的路径。
# 如果未指定上下文,则规则全局适用。
context:
- "~/Projects/my-cool-startup"
# 此规则的模式,可以是 `directory` 或 `file`。默认为 `directory`。
# 当目标是文件时必须指定以获得正确的行为。
# 需要指定是因为目标文件/目录可能还不存在。
mode: "file"
# 此规则适用的命令列表。如果未指定命令,
# 则规则适用于所有使用 boxxy 运行的程序。
only:
- "kubectl"
语法
rules:
- name: "任何有效字符串" # 必需
target: "路径" # 必需
rewrite: "路径" # 必需
context: # 可选
- "路径"
- "路径"
mode: "directory | file" # 可选
only: # 可选
- "二进制名称"
- "二进制名称"
env: # 可选
KEY: "值"
开发
- 设置 pre-commit:
pre-commit install
- 确保它能构建:
cargo build
- 开始开发!
- 使用你选择的命令进行测试,例如
cargo run -- ls -lah ~/.config
它是如何工作的?
- 在 /tmp 中创建临时目录
- 设置新的用户/挂载命名空间
- 将
/
绑定挂载到临时目录 - 以读写方式绑定挂载规则挂载点,以便目标程序可以使用它们
- 将
/
重新挂载为只读 - 运行!
致谢
fixtures/helloworld-appimage-x86_84.AppImage
:https://github.com/ClonedRepos/hello-world-appimage