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命令行工具

Apache-2.0

200KB
4.5K SLoC

目录

文档

简介

haku 是一个简单的命令执行器,类似于 make,但并非 make 的替代品。它提供了一组有限的内部命令(如 forifwhile 等),允许任何人为跨平台任务文件编写脚本。如果这些还不够,haku 还提供类似 Rust 的属性来标记脚本块以运行,例如仅在特定平台上运行。

注意:平台特定的属性是在编译时检测的,而不是在运行时。所以,假设你在 Windows 32 位系统上构建 haku,然后在 Linux 64 位系统上运行它(例如,使用 Wine)。应用程序将继续以带有标志的脚本执行:platform=windowsbit=32

命令存储在以下命名的文件中

  • Windows: HakufileTaskfile
  • 其他操作系统: HakufileTaskfilehakufiletaskfile

haku 启动而没有任务文件名时,首先查找 Taskfile。如果不存在,haku 将查找 Hakufile

所有命令要么是自由命令(必须位于文件开头),要么按部分分组 - 部分称为 recipe。文件的语法是宽松和简化的 makefile 语法。

在内部,haku 在 Windows 上使用 powershell,在其他任何操作系统上使用 sh 来执行外部命令。您可以使用内置的 shell 函数覆盖默认设置。

Vim 支持

为了更方便地在 Vim 中使用 Hakufiles,包含了基本的 Vim 支持:只需将 vim/* 中的所有内容复制到您的 Vim 文件目录(根据操作系统,可以是 ~/.vimfiles%USERPROFILE%/vimfiles)。Vim 支持基本的语法高亮和文件检测。以下是在 gVIM 中的语法高亮示例

Haku syntax hightlight in gVim using gruvbox colorscheme and Fantasque Sans Mono font

许可

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)中详细的 hakujust 的比较。至于与 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