V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
sigoden
V2EX  ›  分享创造

基于 Shell 脚本跨平台任务执行器/脚本管理器/构建工具

  •  
  •   sigoden · 2022-08-01 08:45:28 +08:00 · 2222 次点击
    这是一个创建于 627 天前的主题,其中的信息可能已经有所发展或是发生改变。

    为什么需要任务执行器

    项目通常会有很多操作,比如编译,测试,代码检查,代码格式规整,打包发布等。

    操作还有很多细分项,比如编译分调试版,发布版;测试包含单元测试,集成测试,覆盖率测试等。

    这种种情况造成了我们需要记忆并调用大量的命令,通过一个文件把这些命令记录下来,并分类标注,能减少重复输入,节省调用时间,避免输入错误,方便新人上手...

    Argc 作为任务执行器什么优势

    Argc 即是一个用注释写 shell 命令行应用的框架,也是一款任务执行器。

    你如果你不通过--argc-*选项激活它的其他模式,Argc 启动后会进入任务执行器模式。

    在该模式下,Argc 会先定位 bash, 然后在当前项目及其父目录中搜索 argcfile 文件,最后调用 bash 执行 argcfile

    task runner

    跨平台

    Argc 采用 rust 编写,跨平台,不到 1M 的单可执行文件,无任何依赖,下载下来放到 $PATH 目录下就可以使用

    windows 下 argc 自动定位并使用 git 内置的 bash 。

    基于 shell

    argcfile 就是一个普通的 shell 脚本。

    与其他方案 make/makefile, just/Justfile, task/taskfile.yaml 比,你不需要再学一门语言、语法。

    你还能自由地使用 ls, rm, grep, find, sed, awk 等 GNU 工具。不用担心 windows 不兼容。

    编写简单

    shell 出现了这么多年,为什么没多少人用它做任务管理? 因为 shell 的参数处理太繁琐了。

    Argc 独创地引入了注释标签机制,解决了这个问题。

    你只需要编写一个普通的函数,在这个函数上面添加注释 # @cmd [可选帮助信息] ,就定义了一个任务(子命令)。

    # @cmd Build project
    build() {
      echo Build...
    }
    

    灵活传参

    • 可以透传位置变量到任务
    # @cmd Run tests
    # @alias t
    test() {
        cargo test $@
    }
    
    • 可以命名参数,添加帮助信息,并设置可选值
    # @cmd Run app
    # @arg mode[=dev|prod]  Run mode
    run() {
      if [[ "$argc_mode" = "prod" ]]; then
        echo "prod mode"
      else
        echo "dev mode"
      fi
    }
    
    • 可以使用选项
    # @cmd Start server
    # @option --port=5000 Listening port
    start() {
      PORT=$argc_prot node server.js
    }
    

    自动补全

    Argc 提供了 bashzshpowershell 补全脚本来提示 argcfile 中任务和选项。

    任务别名

    有时候任务名太长,输入麻烦,你可以定义任务别名。

    # @cmd Run tests
    # @alias t,tst
    test() {
    }
    

    语义组

    可以使用符号对任务进行分组,例如 foo:bar foo.bar foo@bar

    基于执行顺序

    # @cmd
    build() { :; }
    # @cmd
    build:pre() { :; }
    # @cmd
    build:post() { :; }
    

    基于类别、分组

    # @cmd
    build@all() { :? }
    # @cmd
    build@backend() { :? }
    # @cmd
    build@frontend() { :? }
    

    基于名称空间、范围

    # @cmd
    app.test() { :? }
    # @cmd
    app.build() { :? }
    

    函数调用实现任务依赖

    比如我们希望在执行 run 之前先执行 install,之后再执行 clean,可以这样实现:

    # @cmd
    install() {
      echo "install deps"
    }
    
    # @cmd
    run() { install;
      echo "run app"
    clean; }
    
    # @cmd
    clean() {
      echo "clean build"
    }
    

    打印帮助

    argc 会自动生成完善的帮助信息

    $ argc -h
    argcfile 
    
    USAGE:
        argcfile <SUBCOMMAND>
    
    OPTIONS:
        -h, --help    Print help information
    
    SUBCOMMANDS:
        run      Run app
        start    Start server
        test     Run tests [aliases: t]
    

    你还可以查看单个任务的帮助信息

    $ argc run -h
    argcfile-run 
    Run app
    
    USAGE:
        argcfile run [MODE]
    
    ARGS:
        <MODE>    Run mode [default: dev] [possible values: dev, prod]
    
    OPTIONS:
        -h, --help    Print help information
    

    项目地址: https://github.com/sigoden/argc

    7 条回复    2024-02-17 20:24:05 +08:00
    Aumujun
        1
    Aumujun  
       2022-08-01 08:54:37 +08:00 via Android
    jenkins 好像有这些功能[手动狗头
    sigoden
        2
    sigoden  
    OP
       2022-08-01 08:57:50 +08:00   ❤️ 1
    @Aumujun jenkins 是 CI ,我这个类似 make 或 npm scripts ,平时开发项目中用,当然 CI 中也是可以使用的。
    weimo383
        3
    weimo383  
       2022-08-01 09:55:22 +08:00
    我觉得换个名字更好,让人一下子就能联想到 npm scripts 的那种
    agagega
        4
    agagega  
       2022-08-04 01:08:25 +08:00 via iPhone
    这种需求我常写一个 Makefile 解决..
    sigoden
        5
    sigoden  
    OP
       2022-08-04 08:09:52 +08:00
    @agagega

    1. makefile 的学习新语法(多少人隔段时间还记得 makefile 强制 tab 缩进)
    2. make 在 windows 下并不好用
    3. make 任务传参不灵活
    4. make 不带补全和打印任务列表,你需要自己额外处理

    argc 为那些不喜欢 make/makefile 人送去了一个新的选项。
    ihwbunny
        6
    ihwbunny  
       125 天前
    这个的确不错的想法,赞一个
    fz420
        7
    fz420  
       62 天前
    看有人写了个 just
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1304 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 17:37 · PVG 01:37 · LAX 10:37 · JFK 13:37
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.