如何配置uv以防止未被管理的包被移除并将uv sync --inexact --frozen设为默认行为
如何配置uv以防止未被管理的包被移除并将uv sync --inexact --frozen设为默认行为
嘿,我刚好也遇到过类似的困扰——uv 默认的 sync 操作确实会清理掉未在 pyproject.toml 里声明的包,尤其是子项目场景下,很容易误删父项目安装的依赖,每次手动加参数又太麻烦。不过咱们有两种实用的方法来解决这个问题,把 uv sync --inexact --frozen 设成默认行为,同时保住那些未被管理的包:
方法一:通过 uv 配置文件全局/项目级生效
uv 支持用配置文件设置命令的默认参数,步骤很简单:
- 如果你想让这个配置只在当前项目生效,就在项目根目录创建
.uv.toml文件;如果想全局所有项目都生效,就把文件放在用户主目录下(比如~/.uv.toml)。 - 在文件里添加以下内容:
[commands.sync] default_args = ["--inexact", "--frozen"]
之后你每次运行 uv sync,都会自动带上这两个参数,完全等同于执行 uv sync --inexact --frozen。
方法二:用 Shell 别名/函数替换默认命令
如果你不想修改配置文件,也可以给 Shell 设置别名或者函数:
- 简单别名方式(适合快速使用):打开你的 Shell 配置文件(比如 Bash 的
~/.bashrc,Zsh 的~/.zshrc),添加一行:
alias uv-sync='uv sync --inexact --frozen'
之后运行 uv-sync 就相当于执行带参数的命令。
- 进阶函数方式(彻底替换
uv sync命令):如果想让输入uv sync就自动触发带参数的操作,可以用 Shell 函数:
uv() { if [[ "$1" == "sync" ]]; then command uv sync --inexact --frozen "${@:2}" else command uv "$@" fi }
这个函数会判断你输入的 uv 命令是不是 sync,如果是就自动加上参数,其他 uv 命令则正常执行原生命令。
补充说明这两个参数的作用
--frozen:让 uv 严格遵循已有的uv.lock文件,不会更新依赖版本,也不会移除 lock 文件中记录的任何包——这正是防止未被管理的包被删除的关键;--inexact:允许 uv 使用 lock 文件里记录的具体版本,而不是强制匹配pyproject.toml里的版本约束,避免因为版本不匹配而误删已安装的包。
就拿你举的例子来说,父项目依赖 abc,当你在子项目里运行配置后的 uv sync 时,uv 会参考 lock 文件保留 abc,不会因为子项目的 pyproject.toml 里没声明它就把它删掉。
备注:内容来源于stack exchange,提问作者Ge-CDU
相关产品推荐
相关产品推荐

