#git-hook #config-file #pre-commit #generator #toml-config #generate #command

app nomgen

命令行工具,帮助根据命令生成文件,并在 pre-commit git 钩子中保护生成的文件免受手动修改

2 个版本

0.1.1 2023年9月22日
0.1.0 2023年9月22日

1126开发工具

MIT 许可证

26KB
406

Nomgen: 修改 生成

Nomgen 是一个工具,可以帮助您根据命令生成文件,并在 pre-commit git 钩子中保护生成的文件免受手动修改。

功能

  • 使用 TOML 格式的配置文件定义文件生成器。
  • 根据配置的命令自动生成和修改文件。
  • 运行检查以确保与配置的模式匹配的文件没有手动修改。
  • 与 Git pre-commit 钩子集成,在提交之前进行自动化检查(除非由 nomgen 本身进行提交)。

安装

要安装 Nomgen,请确保您已安装 Rust 和 Cargo,然后运行

cargo install nomgen

配置

Nomgen 使用配置文件(nomgen.toml)来定义文件生成器和检查模式。以下是一个配置示例

[[generators]]
command = "protoc --rust_out=experimental-codegen=enabled,kernel=upb:. foo.proto"
patterns = [ "*.pb.rs" ]

[[generators]]
command = "cargo run -- generate-hook"
patterns = [ "pre-commit-hook.*" ]

使用方法

Nomgen 提供了几个命令来管理文件生成和检查

nomgen generate [选项] 根据指定的配置生成或修改文件。

命令将首先检查是否存在手动修改,只有当存储库状态有效时,才会运行生成器。

选项

-c, --config <文件>:TOML 格式配置文件的路径(默认:自动定位最近的 nomgen.toml)。示例

nomgen generate -c nomgen.toml

nomgen 钩子[选项]

生成 Git pre-commit 钩子以在提交之前强制进行检查。

选项

-t, --target <目录>:钩子脚本的目标目录(默认:自动定位最近的 .git/hooks)。示例

nomgen hook -t .git/hooks

nomgen 检查[选项]

检查工作目录中的文件是否包含受保护的模式的修改。

命令会验证所有与 nomgen.toml 中配置的模式匹配的文件 - 已暂存或未暂存。如果找到任何修改,则退出并返回错误代码 1。通常应从钩子中调用,但也可以手动调用以进行故障排除。

选项

-c, --config <文件>:TOML 格式配置文件的路径(默认:自动定位最近的 nomgen.toml)。示例

nomgen check -c nomgen.toml

入门

您应该从安装钩子开始,在您的存储库中运行 nomgen hook

然后通过指定生成器来设置 nomgen.toml 文件。

每个生成器都可以有一个用于生成内容的命令。除了命令之外,您可能还想设置一个模式来匹配生成的文件,以防止手动编写。

可以有一个只包含命令的生成器 - 如果您不介意防止手动编写。您也可以有一个只包含模式的生成器,如果您不想将生成调用委托给 nomgen,但仍想使用它来定位不需要的更改。

因此,以下所有 nomgen.toml 示例都是有效使用

[[generators]]
# Configures `nomgen generate` to run protoc 
command = "protoc"
args = ["--rust_out=experimental-codegen=enabled,kernel=upb:.", "foo.proto"]
# Configures `nomgen check` and `nomgen generate` to prevent accidental changes to files ending on `.pb.rs`
patterns = ["*.pb.rs"]
[[generators]]
# Configures `nomgen generate` to run protoc 
command = "protoc"
args = ["--rust_out=experimental-codegen=enabled,kernel=upb:.", "foo.proto"]
# No pattern config, no protection from manual changes
[[generators]]
# Configures `nomgen check` and `nomgen generate` to prevent accidental changes to files ending on `.pb.rs`
patterns = ["*.pb.rs"]
# No command to use during `nomgen generate` 
# Generator for protobuf things
[[generators]]
# Configures `nomgen generate` to run protoc 
command = "protoc"
args = ["--rust_out=experimental-codegen=enabled,kernel=upb:.", "foo.proto"]
# Configures `nomgen check` and `nomgen generate` to prevent accidental changes to files ending on `.pb.rs`
patterns = ["*.pb.rs"]

# Generator for nomgen hook
[[generators]]
command = "nomgen"
args = ["hook", "-d", ".husky"]
patterns = [".husky/pre-commit"]

# Some other generators could follow
# [[generators]]
# ...

使用 husky 吗?

是的,上面的例子显示,如果您的设置包括已提交到存储库的钩子,那么生成 nomgen 钩子就属于 nomgen 作为其自身生成器之一的使用场景。这是一个有效场景,但请注意不同用户可能有不同版本的 nomgen - 这可能导致钩子不断重新生成。

当然,如果您想在 pre-commit 中完成多件事情,您可能想这样做

# Generator for nomgen hook
[[generators]]
command = "nomgen"
args = ["hook", "-d", ".husky", "-h", "pre-commit-nomgen"]
patterns = [".husky/pre-commit-nomgen"]

# Add some more generators
# ...

这会在 pre-commit-nomgen 文件中生成 nomgen 钩子,该钩子不会被 git 调用,这意味着现在在 pre-commit 中您会有类似以下内容

#!/bin/bash

set -e
DIR="$( dirname "${BASH_SOURCE[0]}" )"
sh "${DIR}/pre-commit-nomgen"

# Add other checks that should be run before commiting here
# ... yarn test
# ... yarn prettier

因此,现在您有一个设置,当您调用 nomgen generate 时会自动生成 nomgen 钩子,就像运行任何其他生成器一样。该钩子可以保护您免受对自动生成文件(包括 nomgen 钩子本身)的手动更改,同时您仍然可以在提交之前执行其他检查,而 husky 则负责配置 git 使用您的钩子。

其中一个例子设置了此功能,并增加了一个额外功能 - 它不是调用 check(默认),而是配置钩子调用 generate。这强制 nomgen 在提交之前重新生成文件,如果您想确保不提交过时的文件,这非常有用。

在钩子中生成吗?

运行 nomgen hook -c generate 可以得到在提交之前重新生成文件的钩子。如果您想确保不提交过时的文件,这很有用。nomgen 足够聪明,知道在这种情况下生成不会创建提交,只会暂存生成的更改,因此触发钩子的提交将包括这些更改。

以下是一个变体配置,它将 nomgen generate 配置为在 .husky/pre-commit-nomgen 文件中创建此类生成钩子

[[generators]]
command = "nomgen"
args = ["hook", "-d", ".husky", "-h", "pre-commit-nomgen", "-c", "generate"]
patterns = [".husky/pre-commit-nomgen"]

因此,稍后您可以从 husky 控制的 pre-commit 调用该脚本,如上所述。

依赖项

~14MB
~336K SLoC