5 个版本
0.3.5 | 2020 年 8 月 20 日 |
---|---|
0.3.4 | 2020 年 8 月 20 日 |
0.3.3 | 2020 年 3 月 25 日 |
0.3.2 | 2020 年 3 月 21 日 |
0.3.1 | 2020 年 3 月 18 日 |
#1628 在 命令行工具
200KB
4.5K SLoC
目录
简介
haku
是一个简单的命令执行器,类似于 make
,但并非 make
的替代品。它提供了一组有限的内部命令(如 for
、if
、while
等),允许任何人为跨平台任务文件编写脚本。如果这些还不够,haku
还提供类似 Rust 的属性来标记脚本块以运行,例如仅在特定平台上运行。
注意:平台特定的属性是在编译时检测的,而不是在运行时。所以,假设你在 Windows 32 位系统上构建 haku
,然后在 Linux 64 位系统上运行它(例如,使用 Wine)。应用程序将继续以带有标志的脚本执行:platform=windows
和 bit=32
。
命令存储在以下命名的文件中
- Windows:
Hakufile
和Taskfile
- 其他操作系统:
Hakufile
、Taskfile
、hakufile
和taskfile
当 haku
启动而没有任务文件名时,首先查找 Taskfile
。如果不存在,haku
将查找 Hakufile
。
所有命令要么是自由命令(必须位于文件开头),要么按部分分组 - 部分称为 recipe
。文件的语法是宽松和简化的 makefile
语法。
在内部,haku
在 Windows 上使用 powershell
,在其他任何操作系统上使用 sh
来执行外部命令。您可以使用内置的 shell
函数覆盖默认设置。
Vim 支持
为了更方便地在 Vim 中使用 Hakufiles,包含了基本的 Vim 支持:只需将 vim/*
中的所有内容复制到您的 Vim 文件目录(根据操作系统,可以是 ~/.vimfiles
或 %USERPROFILE%/vimfiles
)。Vim 支持基本的语法高亮和文件检测。以下是在 gVIM 中的语法高亮示例
许可
Haku 在 Apache License Version 2.0 许可下发布
类似项目
Haku
深受两个优秀项目的启发:[GNU make](https://www.gnu.org/software/make/) 和 [just](https://github.com/casey/just)。它们都做得很好,但有些地方对我来说仍然有些不方便。这促使我实现了自己的命令执行器。
- 上述两个实用程序都对空白符和缩进很挑剔。而
make
有时会有令人困惑的要求 - 创建跨平台的 makefiles 并不容易。虽然
just
提供了一种方法,但这种方法是有限的 - 一组内置函数用于操作文件路径:替换扩展名、添加、创建带当前时间的名称等
同时,haku
缺少一些其他工具拥有的功能。请参阅[文档](https://github.com/docs/comparison.md)中详细的 haku
与 just
的比较。至于与 make
的比较,由于 haku
不检查时间戳也不尝试最小化构建时间,因此不应将 haku
作为构建系统使用。因此,这两个工具用于不同的目的,比较它们没有太多意义。
安装
您可以从源代码编译应用程序,或使用 cargo 进行安装
$ cargo install haku
您需要支持 Rust 2018 版本(Rust 1.38 或更高版本)的 Rust 编译器来完成此操作。如果您想升级现有的 haku,请执行以下命令
$ cargo install haku --force
对于 rust 1.41 及更高版本,可以省略标志 --force
预编译的二进制文件
对于 Windows 和 Ubuntu,您可以从[发布页面](https://github.com/VladimirMarkelov/haku/releases)下载预编译的二进制文件。
- Windows 二进制文件已在 Windows 10 上进行了测试。
- Ubuntu 二进制文件已在 Ubuntu 18 上进行了测试。
- musl-Linux 构建
语法高亮
适用于 Vim 和 Neovim
在这里获取它 haku-vim.
适用于 KSyntaxHighlighting
为使用 KSyntaxHighlighting:Kate,KDevelop,Qt Creator 等 的编辑器提供语法高亮。
带注释的示例
// Script header starts.
// select the correct name of the utility "rm" depending on OS type
#[not family(windows)]
rm = "rm"
#[family(windows)]
rm = "del"
app-name = "myapp"
// set flags for the "rm" utility. Use a bit different way: first, intialize with default
// value, and override if OS is windows
rm-flags = "-f"
#[os(windows)]
rm-flags = "/F"
// Script recipe section starts.
// Let's assume we support only linux 64-bit, and windows 64-bit.
// Stop execution in all other cases.
// "!" and "not" are synonyms
// This recipe does not have dependencies
#[!os(linux,windows)]
precheck-two:
error "Only Windows and Linux are supported"
// default empty recipe for the rest cases: linux and windows 64-bit.
// This recipe has dependencies to do additional check for 32/64-bit
precheck: precheck-two
// it can be written shorter: "#[bit(32)]" because we are here only if parent recipe, that
// activates only on windows and linux, is executed. I wrote a full condition to make an
// example of how to do a few checks in one condition
#[os(linux,windows), bit(32)]
precheck-two:
error "Only 64-bit OS is supported"
// empty default recipe. It is important to put default recipes without attrubutes last
precheck-two:
// build recipes
## linux build - this line is shown by command "--list"
#[os(linux), bit(64)]
@build: precheck
println("Building on ", os(), "...")
make -f linux.make
## this comment is doc comment but it is not show by "--list", only the last one is shown
## windows build - this line is shown in "--list" output
#[os(windows), bit(64)]
@build: precheck
make -f win-gnu.make
// one script for all platforms. It is a bit wordy and has redundant operations that are
// used only as examples of haku features
@clean:
rm_cmd = "${rm} ${rm-flags}"
app-name = app
// windows binary always has exe extension
#[platform(windows)]
app-name = add-ext($app-name, "exe")
// prepend "-" to ignore any errors
-${rm_cmd} *.o
-${rm_cmd} *.obj
-${rm_cmd} ${app-name}
上述脚本可以在任何平台上无需更改地运行
$ haku build
Building on Linux...
<here goes make output>
$ haku clean
rm -f *.o
<other rm calls displayed>
依赖关系
~6.5–9MB
~150K SLoC