在GitHub Actions中以缓存友好的方式使用uvx
本文介绍了一种在GitHub Actions工作流中缓存友好地使用`uvx tool-name`命令的方法。通过设置`UV_EXCLUDE_NEWER`环境变量为特定日期,并将该日期作为缓存键的一部分,可以避免每次运行工作流时都从PyPI重新下载工具及其依赖。通过更新该日期,可以轻松升级工具并清除缓存。
在GitHub Actions工作流中,当需要快速运行Python工具时,uvx tool-name命令是一个极佳选择。uv是一个新兴的Python包管理工具,以其速度著称,而uvx则类似于Node.js的npx,允许无需安装即可直接运行工具。然而,默认情况下,每次运行工作流都会从PyPI下载最新版本的工具及其所有依赖,这导致不必要的网络请求和等待时间。
为了优化这一过程,Simon Willison在2026年7月14日分享了一个缓存友好的技巧。该技巧的核心是在工作流的开始处设置一个环境变量UV_EXCLUDE_NEWER,例如UV_EXCLUDE_NEWER: "2026-07-12"。这个环境变量告诉uv仅考虑该日期之前发布的包版本,从而固定了工具版本。接着,将这个日期作为GitHub Actions缓存键的一部分,例如使用uv-cache-${{ env.UV_EXCLUDE_NEWER }}作为缓存键。这样,第一次运行时会下载工具并缓存,后续运行直接从缓存读取,完全避免了网络请求。
当需要升级工具时,只需更新UV_EXCLUDE_NEWER的日期,比如改为2026-08-01,缓存键自动变化,旧缓存失效,工作流将重新下载新版本。这个过程完全自动化,开发者只需修改一个环境变量即可。
Willison指出,他的主要目标是确保Python工具在GitHub Actions中的使用不会每次都消耗网络资源。这个技巧不仅适用于Python工具,任何通过uvx调用的工具都可以受益。对于频繁运行的CI/CD流程,这一方法可以显著缩短执行时间,并节省带宽成本。此外,它易于实施——只需在工作流中添加一行环境变量设置,并调整缓存键配置。
在实践中,开发者可以根据自己的需求选择日期。例如,可以设定为当天的日期,这样工具版本会固定至该日期的最后版本;或者设定为某次测试通过的时间点,以确保稳定性。结合GitHub Actions的缓存功能,这一方案为自动化工作流提供了一种高效、可靠的工具管理方式。
总之,Simon Willison的这条技巧为GitHub Actions用户提供了一个优雅的解决方案,用最小的改动换来了显著的性能提升。它体现了在CI/CD中缓存策略的巧妙应用,值得所有使用Python或uvx的开发者借鉴。