husky-rs: Rust 版 Git Hooks 工具 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
purplemystic
V2EX    程序员

husky-rs: Rust 版 Git Hooks 工具

  •  
  •   purplemystic
    pplmx 2024-09-30 15:35:22 +08:00 3150 次点击
    这是一个创建于 412 天前的主题,其中的信息可能已经有所发展或是发生改变。
    19 条回复    2024-10-02 19:53:51 +08:00
    ShaunHu
        1
    ShaunHu  
       2024-09-30 15:52:26 +08:00   1
    优秀阿
    purplemystic
        2
    purplemystic  
    OP
       2024-09-30 15:53:09 +08:00
    @ShaunHu Try it :)
    shakukansp
        3
    shakukansp  
       2024-09-30 17:17:55 +08:00   1
    感觉这玩意跑多久取决于跑的命令……而不是本身用什么写
    RangerWolf
        4
    RangerWolf  
       2024-09-30 17:46:22 +08:00   1
    感觉楼上两个人的头像的风格跟 op 的风格是一样的,你们是托么?

    ps: 并没有贬低 op 的意思,只是好奇~ 另外我也很菜,不知道 git hooks 是干啥的
    zsh2517
        5
    zsh2517  
       2024-09-30 18:23:52 +08:00   1
    @RangerWolf #4 git hook 是位于 .git/hooks 里面的东西,用来定义 git 发生某些行为(如 commit )时(/前/后)执行一系列命令的配置工具。

    常见的比如提交前格式化、跑单测和 lint 、生成提交信息等。

    husky 是一个独立于 git 的、管理 git hook 配置的工具( git hook 本身好像是不能提交到代码仓库的,如果项目内想共享一些 git hook 配置就需要 husky 一类的工具)

    [zsh2517@VM-20-7-ubuntu|~/workSpace/hexo-test/.git/hooks|2.7.0p0|3.10.3] master ls
    applypatch-msg.sample* post-update.sample* pre-merge-commit.sample* pre-rebase.sample*
    commit-msg.sample* pre-applypatch.sample* prepare-commit-msg.sample* pre-receive.sample*
    fsmonitor-watchman.sample* pre-commit.sample* pre-push.sample* update.sample*
    purplemystic
        6
    purplemystic  
    OP
       2024-09-30 18:28:24 +08:00
    @RangerWolf 不是哒
    purplemystic
        7
    purplemystic  
    OP
       2024-09-30 18:30:59 +08:00
    @shakukansp 不是解决快慢的问题, 主要是想要一个像 husky 的功能, 就是其他人 clone 项目后, 一定会被执行到的 hooks, pre-commit 依赖使用者主动去 pre-commit install, husky-rs 利用了 rust 的 build.rs 功能, 只要引用这个库, 使用者使用时, 就一定会将 hooks 加载到本地.git
    purplemystic
        8
    purplemystic  
    OP
       2024-09-30 18:33:05 +08:00
    @zsh2517 husky 其实依赖于 node 生态
    lisongeee
        9
    lisongeee  
       2024-10-01 12:23:37 +08:00
    可能我接触的项目较少

    我发现只有 前端 项目会用 git-hooks ,因为前端项目的创建脚手架基本都会一键配置好

    接触的 java/kotlin/python 都没有
    jqtmviyu
        10
    jqtmviyu  
       2024-10-01 13:30:29 +08:00
    @lisongeee #9

    有些人配置 eslint 不装, Prettier 不装. 说不定还开保存自动格式化.

    一改一大片, history 全乱了, 头疼.

    特别还有什么换行, 分号 两个空格, 4 个空格之类的.

    不过如果把 hooks 放在 git 服务器那边, 应该就没本地的这些事了.
    purplemystic
        11
    purplemystic  
    OP
       2024-10-01 23:08:58 +08:00
    @lisongeee 所以我觉得前端的 husky 就很好, 它于 npm 生态绑定, 你只要运行(install/build/test)这个项目, 那么项目已经设置的 hooks 必定被执行, 项目开发者的最初定的规则, 后来者必定强制执行, 这样就有了一个很多统一性

    我实现的这个 husky-rs, 也期望在 rust 的 cargo 下实现类似的效果
    purplemystic
        12
    purplemystic  
    OP
       2024-10-01 23:09:57 +08:00
    @purplemystic #11 "很多统一性" ==> "很好的统一性"
    purplemystic
        13
    purplemystic  
    OP
       2024-10-01 23:19:29 +08:00
    @lisongeee 为什么只有前端会用呢? 因为其他语言类似工具集成的都不是很好.
    你会发现很多其他语言的开源项目, 都会使用 pre-commit.com 虽然没有 husky 集成的那么紧密, 但是无奈只有这一个方案
    总结: 大家(尤其是更大开源项目)是有 git hooks 需求的, 只不过前端的方案最好(愚见), 所以使用更广泛; 其他语言的开源项目, 退而求其次, 通常会使用 pre-commit
    purplemystic
        14
    purplemystic  
    OP
       2024-10-01 23:20:23 +08:00
    @purplemystic #13 "更大开源项目" ==> "很多开源项目"
    lisongeee
        15
    lisongeee  
       2024-10-02 01:56:35 +08:00   1
    #11

    我现在已经不用 husky 了,它太过底层化,会出现一些配置问题

    我现在用的 https://github.com/toplenboren/simple-git-hooks

    同时它也是 vue 源码管理在使用的 https://github.com/vuejs/core/blob/29de6f8b0bb1a604f247b0712daac29e93aa6f3e/package.json#L45

    ---

    #13

    我觉得主要是前端有被广泛使用的 eslint/prettier/stylelint 这类代码工具,并且它们自带 --fix

    其他语言基本就没有这种东西,也没有形成一个使用的基本意识
    lisongeee
        16
    lisongeee  
       2024-10-02 02:05:27 +08:00   1
    @jqtmviyu

    > 有些人配置 eslint 不装, Prettier 不装. 说不定还开保存自动格式化.

    呃呃,跟这个有啥关系,eslint/prettier 以及它们的 check/fix 都是直接声明在 package.json 里的

    别人 git clone xxx 然后 pnpm install 就啥都初始化好了

    后续就算你修改的任意 commit 全部都会走 check/fix 了,自动格式化和自动修复都会全走一遍

    跟编辑器装什么代码插件使用什么代码风格完全没有任何关系,就算有在后续 commit 的时候也会被自动修正回来
    purplemystic
        17
    purplemystic  
    OP
       2024-10-02 18:45:31 +08:00
    @lisongeee #15 是的
    jqtmviyu
        18
    jqtmviyu  
       2024-10-02 18:51:49 +08:00
    @lisongeee #16 如果每位项目参考者把 eslint/prettier 插件都装上, 让项目里的配置文件生效, 不就没强制 hooks 这事了. 我的意思先有的 eslint/prettier 插件的这些尝试解决格式化的方案, 然而并不能强制每个人都执行, 才有的 hook 检查和处理. 而且就算有了 hooks 检查, 那也是发生在提交时了, 插件在编辑时就能预览了.
    lisongeee
        19
    lisongeee  
       2024-10-02 19:53:51 +08:00
    @jqtmviyu

    > 如果每位项目参考者把 eslint/prettier 插件都装上, 让项目里的配置文件生效, 不就没强制 hooks 这事了

    想法很没好,但是不可能的,就算装上也有版本差异,ide/vscode 自己也有版本差异,最好的方式就是直接作为项目依赖安装,和编辑器无关,有的人编辑器插件都懒得用或者装都装不明白,只会 npm i ,只有集成到项目里才是最好的方式
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2713 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 23ms UTC 08:18 PVG 16:18 LAX 00:18 JFK 03:18
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86