8 个版本
0.1.8 | 2023 年 10 月 20 日 |
---|---|
0.1.7 | 2023 年 10 月 11 日 |
0.1.3 | 2023 年 9 月 27 日 |
#180 在 模板引擎
每月 66 次下载
52KB
1K SLoC
Jintemplify
jintemplify
是一个 CLI(命令行界面)工具,允许用户将 Jinja2(rust Tera 库)模板与 YAML 变量相结合,以任何所需的格式生成文件,包括 Dockerfiles 和 Makefiles。设计上具有灵活性,jintemplify
可无缝集成到现代 DevOps 工作流程中的 Jenkins、Tekton 和其他 CI(持续集成)系统。应用程序还支持基于 shell 脚本和 Webassembler(WASM)模块的插件系统,使用户能够通过熟悉的脚本技术扩展其功能。
功能
- 模板渲染:使用 Jinja2 模板定义文件的结构。
- 变量支持:将模板与 YAML 定义的变量相结合。
- 插件系统(基于 shell 脚本):使用基于 shell 脚本的插件扩展应用程序的功能。这允许使用熟悉的脚本方法和 Wasm 模块的性能优势进行广泛的扩展。
高级模板功能
访问环境变量和命令行参数
在 Jinja2 模板中,您可以使用 vars 对象访问环境变量或使用 --env 命令行选项传递的任何值。这为根据环境或运行时条件将动态值无缝地纳入模板提供了一种方法。
{{ vars.my_environment_variable }}
{{ vars.my_cli_argument }}
在上面的示例中,my_environment_variable
可以是环境变量,而 my_cli_argument
可以是通过 --env
传递的值。
插件
对于那些想要通过插件扩展应用程序功能的人来说,以下是对插件配置的基本结构
functions:
- name: "function_name"
params:
- name: parameter_name
env:
CC: clang
MAKEVARS: ...
script: your_shell_script_command_here
- name: ...
wasm:
path: path/to/myplugin.wasm
import: your_function
在此配置中
name
:代表您要添加的函数的名称,可以直接在您的 Jinja2 模板中调用。params
:列举了您的函数或过滤器所必需的参数。对于过滤器,使用$(input)
访问默认输入(表示要过滤的值)。env
:指定了在执行时shell命令可以访问的环境变量。当根据环境调整脚本行为时,这一点至关重要。script
:包含在函数调用时执行的shell命令。wasm
:指定Wasm插件配置。在这个path
:指向包含插件函数的wasm二进制文件。import
:表示封装在wasm二进制中的特定插件函数。
过滤器和函数
使用 jintemplify
,您不仅限于基本的Jinja2模板。我们引入了专门的过滤器和函数,以提供更大的灵活性
函数
- 直接读取文件:使用read_file函数,您可以直接将文件的內容读入Jinja2模板中。这对于包含大量数据或内容而不必手动将其复制到模板中非常有用。
- 将数组转换为对象:使用
to_object
过滤器,您可以将交替键和值的数组(例如,[key1, value1, key2, value2]
)转换为Jinja2可访问的对象({key1: value1, key2: value2}
)。 - 执行shell命令:使用
shell
函数,您可以直接在Jinja2模板中执行shell命令。这对于根据命令输出动态生成内容特别有用。例如,shell("echo hello", world="Jinja")
将在执行echo hello
命令之前将环境变量world
设置为"Jinja"。
过滤器
- 从字符串中读取:如果您在模板中将数据作为字符串嵌入,可以使用以下过滤器将它们转换为可用的Jinja2对象
from_read_json
:解析JSON字符串并将其转换为Jinja2对象。from_read_yaml
:解析YAML字符串并将其转换为Jinja2对象。from_read_toml
:解析TOML字符串并将其转换为Jinja2对象。
通过使用这些过滤器,您可以将内联数据无缝集成到模板中,然后使用Jinja2强大的模板功能进行操作。
示例:使用my_read_file在plugin.yaml.j2中使用JSON解析
在jintemplify
中,您可以结合使用的一个强大功能是直接读取文件并解析其内容。以下是一个快速示例
{# plugin.yaml.j2 #}
functions:
- name: my_read_file
params:
- name: file_path
description: file path
script: cat $(file_path)
- name: my_echo
env:
my_var: "hello plugin"
script: echo ${my_var}
filters:
- name: my_indent
params:
- name: prefix
description: "description for my filter"
script: |
#!/bin/bash
echo -e $(input) | sed 's/^/$(prefix)/'
{# main.yaml.j2 #}
{% set conf = my_read_file(file_path='./examples/test.json') | from_json %}
{{conf.hello}}
在这个例子中,我们使用read_file
函数读取test.json
的内容。然后,我们利用from_json
过滤器解析读取的JSON字符串,将其转换为可用的Jinja2对象。这使得您可以直接访问JSON的属性,如上面的例子中的conf.hello
。
安装
使用Cargo
如果您已安装Rust和Cargo,则可以使用以下命令安装jintemplify
cargo instll jintemplify
手动安装
- 克隆仓库
git clone https://github.com/your_username/jintemplify.git
- 导航到项目目录并使用Cargo构建
cd jintemplify
cargo build --release
使用
jintemplify -t <template_path> -v <variables_path> --plugin <plugin_path>
jintemplify --help
jintemplify allows you to combine Jinja2 templates with YAML variables to produce files in any desired format. Use the --template argument to specify the main Jinja2 template and the --variables argument (optional) to specify the YAML variables template.
Usage: jintemplify [OPTIONS] --template <template>
Options:
-e, --env <env>
Environment variables in the format key=value
--default-env <default-env>
Optional environment variables in the format key=default_value
-t, --template <template>
Template file: main.yaml.j2, main.txt.j2, main.json.j2
-v, --variables <variables>
Variables file: variables.yaml.j2
-p, --plugin <plugin>
Path to the plugin configuration: plugin.yaml
--output-file <FILE>
Sets an output file, stdout if not set
--disable-builtin-functions
Disables the registration of built-in functions
--include-dir <include-dir>
Include directory for templates. Format: /path/to/dir:alias or /path/to/dir. Use '{}' for direct naming without an alias.
-h, --help
Print help (see a summary with '-h')
-V, --version
Print version
开发
要添加新过滤器,请修改filter.rs
。有关添加或修改插件的说明,请参阅plugin.rs
。
贡献
欢迎提交拉取请求。对于重大更改,请先开启一个issue来讨论您希望进行哪些更改。
支持的平台
https://rust-lang.github.io/rustup-components-history/
许可协议
依赖项
~24–36MB
~586K SLoC