#git-hook #hook #git-workflow #git #workflow #husky

sloughi

一个微小、无依赖项的crate,用于简化Rust项目中Git钩子的共享和应用

2个不稳定版本

0.3.0 2022年3月28日
0.2.0 2022年3月28日
0.1.0 2022年3月27日

#1096 in 开发工具

Apache-2.0

9KB
125

Sloughi

Crates.io

Sloughi Dog

一个微小的crate,用于简化Rust项目中Git钩子的共享和应用。灵感来自Husky

  • 无依赖。
  • 无魔法,使用Git的config core.hooksPath来设置自定义钩子路径。使用原生的/常规的shell脚本作为git钩子。
  • 使用Cargo的构建脚本
  • 与IDE/代码编辑器无关。
  • 可自定义的设置。

Sloughi是一种古老的非洲家犬品种(例如阿尔及利亚,我就在那里👋)。

安装

  • 将sloughi添加到你的build-dependencies(不是dev-dependencies

    [build-dependencies]
    sloughi = "0.3.0"
    
  • 在项目的根目录下创建一个build.rs文件来安装Sloughi(除了Cargo.toml,不要放在src/中)

    use sloughi::Sloughi;
    
    fn main() {
        let _ = Sloughi::new().install(); // This will fail silently. Won't interrupt the build.
    }
    

就这样!

下次触发cargo build(由VSCode触发,或通过运行cargo run/cargo test)时,你将注意到创建了一个包含示例pre-commit钩子的.sloughi文件夹。

自定义安装

此crate使用构建者模式,你可以在::new()上链选项来调整安装

let _ = Sloughi::new()
    .custom_path(".git_hooks").   // Choose a custom Git hooks relative path (default is ".sloughi")
    .ignore_env("CI").            // Ignore setup when `CI` environment variable is set (like in CircleCI ..etc)
    .ignore_env("GITHUB_ACTIONS") // Do not run in Github Actions as well
    .install();

构建失败

上述build.rs片段在Sloughi安装失败的情况下不会中断构建(例如,不是git仓库,权限错误等)。它被显式静音,你可以按照自己的方式处理错误,或者只是大喊大叫

Sloughi::new().install().expect("Sloughi install failed");

常见问题解答

为什么使用build.rs

货物缺少安装钩子(例如npm中package.json中的postinstall),这使得在上游仓库中自动共享git钩子变得具有挑战性。

Cargo的构建脚本是一种优雅且透明的

  • 在构建/编译时对项目进行操作的方式。
  • 无需额外配置文件和格式即可自定义设置。

当多次运行cargo build会发生什么?

install()调用是幂等的。它不会修改现有的设置和钩子。

这会减慢我的构建速度吗?

不会

  • build.rs本身仅在更改时(默认情况下)进行构建。
  • 设置将首先检查你是否已经创建了.sloughi(或自定义路径)。如果是,它将跳过安装。

它是否在发布模式下运行?

不,发布模式是一个空操作。

待办事项

  • 可选功能标志。例如,将常规提交作为pre-commit,将rustfmt作为pre-commit。
  • 一个用于管理钩子的可选辅助二进制文件。
  • 检查Cargo工作区兼容性。
  • uninstall()调用引入到导出的Sloughi结构体中。
  • 集成测试。

无运行时依赖