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

2022-08-01 08:45:28 +08:00
 sigoden

为什么需要任务执行器

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

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

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

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

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

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

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

跨平台

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

2244 次点击
所在节点    分享创造
7 条回复
Aumujun
2022-08-01 08:54:37 +08:00
jenkins 好像有这些功能[手动狗头
sigoden
2022-08-01 08:57:50 +08:00
@Aumujun jenkins 是 CI ,我这个类似 make 或 npm scripts ,平时开发项目中用,当然 CI 中也是可以使用的。
weimo383
2022-08-01 09:55:22 +08:00
我觉得换个名字更好,让人一下子就能联想到 npm scripts 的那种
agagega
2022-08-04 01:08:25 +08:00
这种需求我常写一个 Makefile 解决..
sigoden
2022-08-04 08:09:52 +08:00
@agagega

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

argc 为那些不喜欢 make/makefile 人送去了一个新的选项。
ihwbunny
135 天前
这个的确不错的想法,赞一个
fz420
72 天前
看有人写了个 just

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/869855

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX