#template #codegen #generation #scaffolding #module #cli-tool #file

app brix

Brix 是一个用 Rust 编写的 CLI 工具,用于搭建和代码生成

6 个版本

0.4.2 2024 年 1 月 25 日
0.4.1 2023 年 12 月 29 日
0.3.4 2023 年 8 月 22 日
0.3.3 2022 年 7 月 29 日
0.3.2 2022 年 2 月 18 日

#163 in 命令行实用程序

42 每月下载量

MIT 许可证

115KB
2K SLoC

Brix

Brix 是一个用 Rust 编写的 CLI 工具,用于搭建和代码生成。

致谢

特别感谢 Caleb Cushing 提供原始 Java 版本、早期界面设计和内部架构。

安装

Brix 可在 crates.io 和 Arch Linux 的 AUR 上获取。

使用 cargo 安装

cargo install brix

Arch Linux (使用 AUR 辅助工具,如 yaytrizen)

yay -S brix-git

运行

用法

brix [LANGUAGE] [CONFIG NAME] [PROJECT] [MODULE]
brix [OPTIONS] --config-dir | -d [CONFIG DIRECTORY]
brix [OPTIONS] --workdir | -w [WORKING DIRECTORY]

本地构建

要求
  • Cargo 和至少 Rust 版本 1.43.1
运行
  • 运行 cargo build
  • 运行 cargo run
测试

运行 cargo test --all 测试整个工作空间。

生成文档

运行 cargo doc --no-deps --workspace --document-private-items --open

使用 Brix

语言目录

要在项目中开始使用 Brix,请在你的项目目录中创建一个 .config/brix 目录。此目录将包含你的配置文件。运行 brix 后指定第一个参数将告诉它使用哪个子目录。例如,使用 brix java 启动 Brix 将在项目目录中的 .config/brix/java 目录中查找配置文件。此参数称为 语言。如果找不到配置文件,Brix 将向上移动到父目录,直到找到包含 .config/brix/java 的目录。此参数不一定必须限制为编程语言,它存在是为了将使用方式相似的配置文件分组,例如用于启动特定项目。

配置名称

当然,在未指定特定配置文件的情况下运行 brix [language] 是有点无用的。第二个参数指定要使用的文件名。运行 brix java tutorial 将在 .config/brix/java 中搜索名为 tutorial.brix.ymltutorial.brix.yaml 的文件。目前,文件必须以 YAML 编写,但将来将支持更多选项,如 JSON 和 TOML。

项目和模块

这两个参数特定于你的配置文件,你可以随意使用它们,所以让我们先看看配置文件的结构。

配置文件

Brix 提供了各种命令,供你用于构建和生成项目。在最顶层,配置文件只是一个命令列表,因此我们可以从声明 commands 属性开始

# example.brix.yml
commands:
  - search_replace:
    # ...
  - exec:
    # ...

你列出的命令将按从上到下的顺序依次执行。以下命令受支持:

  • copy

    将文件或目录复制到新位置。

  • search_replace

    在文件中搜索字符串或正则表达式,并用另一个字符串替换它。

  • exec

    执行一系列命令。

  • mkdir

    创建目录。

  • template

    将文件模板到新位置。

让我们从最基本的 copy 命令开始,并使用 Brix 简单地复制一个 .gitignore 文件。我们的配置文件可能看起来像这样

# .config/brix/js/gitignore.brix.yml
commands:
  - copy:
      source: .gitignore
      destination: app/.gitignore

源代码目录始终相对于配置文件的位置。在这种情况下,它将是 .config/brix/js/.gitignore。目标目录相对于您运行 brix 的位置,这通常称为工作目录,可以使用 --workdir-w 标志来覆盖。现在,如果我们要在项目目录中运行 brix js gitignore,实际上会得到一个错误。这是因为 Brix 需要指定 projectmodule 参数。在我们的情况下,我们还没有使用它们,因此可以指定任何内容。现在,运行 brix js gitignore project module 将会执行命令。如果您还没有 app 目录,Brix 会为您创建一个,并将 .gitignore 文件复制到其中。

但是,如果我们想将文件放在 app 之外的位置,这对我们的项目来说就不太方便了。假设现在我们除了 app 之外还有一个 backend 文件夹。要将 .gitignore 文件复制到 backend,我们必须每次都更改配置文件中的目标。相反,这正是项目参数和模块参数派上用场的地方。让我们将配置文件更改为

# .config/brix/js/gitignore.brix.yml
commands:
  - copy:
      source: .gitignore
      destination: {{project}}/.gitignore

在这里,我们在目标中使用 project 参数。运行 brix js gitignore backend module 现在会将文件复制到 backend/.gitignore。如果我们想将其复制到其他地方,我们只需运行 brix js gitignore somewhere_else module

我们还可以使用模块参数来,例如,采样不同的 gitignore 文件。

# .config/brix/js/gitignore.brix.yml
commands:
  - copy:
      source: {{module}}/.gitignore
      destination: {{project}}/.gitignore

运行 brix js gitignore dashboard default 将会使用 .config/brix/js/default/.gitignore 并将其复制到 dashboard/.gitignore

现在,让我们全面看看所有的命令。

复制

commands:
  - copy:
      source: file.txt
      destination: output/file.txt
      overwrite: true # Optional, will ask by default to overwrite if the file already exists

搜索替换

搜索替换在 search 字段中使用 fancy regex 进行正则表达式,并支持回溯。语法最好在这里解释 这里

commands:
  - search_replace:
      destination: file-to-search-replace.txt
      search: search string # fancy-regex supported
      replace: replace string

执行

按顺序执行命令。

commands:
  - exec:
      commands:
        - 'echo "Hello World!"'
        - "prettier --write ."
        - "cargo --version"
      stdout: true # Optional

创建目录

创建目录。

commands:
  - mkdir:
      destination: output/directory

模板

模板化文件。

commands:
  - template:
      source: file.ex.hbs
      destination: output/file.ex
      overwrite: true # Optional
      context: # Optional
        first: {{project}}Service
        second: {{module}}

file.ex.hbs 可能看起来像

defmodule App.{{first}.{{second}} do
  # ...
end

当模板化时,output/file.ex

defmodule App.UsersService.Store do
  # ...
end

上下文和模板化

Brix 使用 Handlebars,特别是 Rust 版本,在 template 命令和配置文件中一般都使用。命令中的 context 参数不是必需的,因为如果模板文件中指定了,{{project}}{{module}} 会自动处理。

在配置文件中还可以指定全局上下文

context:
  edition: 2022
  name: {{project}}
commands:
  - template:
      source: file.txt.hbs
      destination: output/file-{{edition}}.txt
  - copy:
      source: {{edition}}/notes.txt
      destination: output/notes.txt

在这种情况下,参数 editionnameprojectmodule 都可以在配置文件本身以及 template 命令中引用的所有模板文件中使用。全局上下文对于声明在多个命令之间共享的常量也非常有用。

模板辅助工具

Brix 还提供了一些有用的辅助工具来操作这些变量,特别是用于更改大小写和格式。以下是一些辅助工具:

  • to-upper
  • to-lower
  • to-title
  • to-case
  • to-flat
  • to-java-package
  • to-java-package-path

所有这些都可以用来替换,例如,使用 {{project}}

context:
  project: 'foo BAR 40'
{{to-upper              project}} # FOO BAR 40
{{to-lower              project}} # foo bar 40
{{to-title              project}} # Foo Bar 40
{{to-flat               project}} # foobar40
{{to-java-package       project}} # foo.bar40
{{to-java-package-path  project}} # foo/bar40

重用模板

Brix 有一个额外的优点,即不需要在语言目录中使用特定的文件夹结构。模板和其他文件与配置文件完全独立。这意味着重用模板变得容易得多,因为所有内容都仅通过路径进行引用。如果您需要在两个不同的配置文件中使用相同的模板,只需在两个文件中引用文件路径并使用不同的上下文即可。

完整示例

最后,让我们看一下使用 Brix 引导 Java 项目的完整示例。将 .config/brix 目录放置在 HOME 目录中,以便可以从任何地方运行 brix 并创建这样的项目。

commands:
  - copy: # Copy all of the shared files to the project directory
      source: project/shared
      destination: .
      overwrite: true
  - template: # Template build.gradle.kts
      source: module/build.gradle.kts.hbs
      destination: "module/{{module}}/build.gradle.kts"
      overwrite: false
  - template: # Template module-info.java
      source: module/src/main/java/module-info.java.hbs
      destination: "module/{{module}}/src/main/java/module-info.java"
      overwrite: false
  - template: # Teplate package.json
      source: project/templates/shared/package.json.hbs
      destination: "package.json"
      overwrite: false
  - template: # Template settings.gradle.kts.hbs
      source: project/templates/shared/settings.gradle.kts.hbs
      destination: "settings.gradle.kts"
      overwrite: false
  - mkdir: # Create the main directory for the module
      destination: "module/{{module}}/src/main/java/com/example/{{module}}"
  - mkdir: # Create the test directory for the module
      destination: "module/{{module}}/src/test/java/com/example/{{module}}"
  - exec: # Run the following commands with no stdout
      commands:
        - git init
        - git add .
        - git commit -m initial
        - yarn up
      stdout: false

更多示例

一些额外的示例位于 ./config/brix/rust

  • copy cargo run -- rust copy brix foo
  • exec cargo run -- rust exec foo foo
  • mkdir cargo run -- rust mkdir brix foo
  • search_replace cargo run -- rust search_replace brix foo
  • template cargo run -- rust template brix foo

依赖项

~10–21MB
~303K SLoC