#fern #command-runner #cli #give #monorepo #run #different

app fern-run

命令运行器。它为你的单一代码库的不同部分提供了统一接口来运行特定任务。

1 个不稳定版本

0.0.2 2020年3月23日
0.0.1 2020年3月23日

#1 in #fern

MIT 许可证

19KB
385

Fern

build Coverage License

fern 不是一个构建工具,它更像是命令运行器。它为你的单一代码库的不同部分提供了一个统一接口来运行特定任务。可以参考 Jeff Ramnani 的这篇博客来了解核心思想 项目构建工具

唯一的一个技巧是,就像现实中的蕨类植物一样,它是分形/递归的。

上下文 - 合适的文件

假设你有一个较大的项目,由多个较小的部分组成。这些部分可能使用不同的语言编写。比如,你的后端可能用 Rust 编写,邮件服务是一个 Python 应用程序,而前端是用 ELM 编写的。

现在,你可以编写一个 Makefile 来协调所有应用程序,在正确的文件夹中启动 cargopipelm。我觉得烦人的是,一个 Makefile 规则了所有事情。这个 Makefile 混合了多种语言和构建工具的关注点,并且它需要用文件夹做些聪明的事情,比如 cd ui && npm install

fern 有所不同——并且比 make 弱得多——但它更简单。 fern 可以找到散布在代码库中的 fern.yaml 文件。在我们的例子中,我们会为 Rust 后端、ELM 前端和单独的 Python 各有一个。如果你想知道 fern 会考虑哪些文件,请运行 fern leaves。因为蕨类植物有无数“叶子”😄。

叶子构成蕨类植物

我把 fern.yaml 文件称为 leaves,这也是列出它们的命令的名称。在这样一个蕨类植物的 fern.yaml 文件中,你可以定义以下 4 个目标之一

  • fmt 用于任何与格式化相关的内容
  • build 用于与构建应用程序相关的一切
  • test 用于运行任何类型的测试
  • check 用于类型检查或构建检查等

您可以编写类似这样的单行

fmt: cargo fmt
test: cargo test

或者使用列表执行多个步骤

fmt:
 - npm run fmt
 - prettier --write src/css/*.css
test: npm test
check:
 - tsc
 - prettier --check {src,test}/**/*.tsx
 - prettier --check src/css/*.css

就是这样。目前无法描述相互依赖关系(尚不支持)或更复杂的功能。

运行它

命令与您在 fern 文件中编写的内容完全匹配

  • fern fmt 用于与格式化相关的一切
  • fern build 用于与构建应用程序相关的一切
  • fern test 用于运行任何类型的测试
  • fern check 用于类型检查或构建检查等

增加了一个命令

leaves 显示它将找到哪些 fern 文件。您可以提供参数 -p--porcelain 以获取单行中的所有文件,这对于在 vim 中一次性打开所有文件很有用

vim -p $(fern leaves -p)

这里是我的另一个仓库中 fern 运行的一个演示:asciicast

播种 fern 和配置

使用 fern 应尽可能少地需要配置,特别是由于其功能集很小。不过,有一个功能需要全局配置文件: fern seed $nameseed 会为您创建一个基于 $name 和全局配置的 fern.yaml 文件。配置文件预期在 $HOME/.fern.config.yaml$HOME 会根据操作系统而变化)中,但您可以使用环境变量 FERN_CONFIG 来更改它。

以下是一个示例配置文件

seeds:
  rust:
     fmt: cargo fmt
     test: cargo test
     build: argo build --release
  elixir:
     fmt: mix format .
     test: mix test

seeds 键下,您可以命名类似于 fern.yaml 文件的块。然后,运行 fern seed rust 将将此块复制到本地 fern.yaml。如果您有多个需要类似配置的项目,这将很有用。

安装和贡献

目前,使用它的最佳方法是克隆源代码,并使用最新的 Rust 编译它。

贡献非常欢迎

  • 目前还没有测试,所以您可以随意编写任何测试
  • 您认为有哪些轻量级的功能可能会使 fern 更有用?请打开问题或 PR

依赖项

~6–15MB
~186K SLoC