golang基于模板运行命令和生成文件的插件库Orbit的使用

Golang基于模板运行命令和生成文件的插件库Orbit的使用

orbit's logo

Orbit简介

Orbit是一个跨平台的任务运行器,用于从模板执行命令和生成文件。它提供了比传统make和sed命令更优雅的跨平台解决方案。

安装

从最新版本下载Orbit,支持多种操作系统和架构。

Linux/MacOS安装:

tar -xzf orbit*.tar.gz orbit
sudo mv ./orbit /usr/local/bin && chmod +x /usr/local/bin/orbit

Windows安装:

  1. 右键点击文件选择"全部解压"
  2. 将二进制文件移动到如C:\Orbit的文件夹
  3. 将文件夹添加到系统环境变量Path中

验证安装:

orbit version

从模板生成文件

Orbit使用Go的text/template包作为模板引擎,并提供了Sprig库和三个自定义函数:

  • os - 返回当前操作系统名称
  • verbose - 如果日志级别为info则返回true
  • debug - 如果日志级别为debug则返回true

基本命令

orbit generate [flags]

主要参数

  • -f --file - 模板文件路径(必需)
  • -o --output - 输出文件路径
  • -p --payload - 数据源,格式为"key,value"
  • -t --templates - 附加模板文件
  • --delimiters - 自定义模板分隔符
  • -v --verbose - 设置日志级别为info
  • -d --debug - 设置日志级别为debug

完整示例

模板文件(template.yml):

companies:

{{- range $company := .Orbit.Values.companies }}
  - name: {{ $company.name }}
    launchers:
  {{- range $launcher := $company.launchers }}
    - {{ $launcher }}
  {{ end }}
{{- end }}

数据源文件(data-source.yml):

companies:
  - name: SpaceX
    launchers:
      - Falcon 9
      - Falcon Heavy
      
  - name: Blue Origin
    launchers:
      - New Shepard
      - New Glenn

agencies:
  - name: ESA
    launchers:
      - Ariane 5
      - Vega

生成命令:

orbit generate -f template.yml -p "Values,data-source.yml" -o companies.yml

输出文件(companies.yml):

companies:
  - name: SpaceX
    launchers:
      - Falcon 9
      - Falcon Heavy
      
  - name: Blue Origin
    launchers:
      - New Shepard
      - New Glenn

定义和运行任务

Orbit可以像make一样定义和运行任务。

基本命令

orbit run [tasks] [flags]

任务配置文件(orbit.yml)示例:

tasks:
  - use: prepare
    run:
     - orbit generate -f configuration.template.yml -o configuration.yml -p "Data,config.json"
     - echo "configuration.yml has been succesfully created!"

运行任务:

orbit run prepare

高级任务示例:

tasks:
  - use: task
    run:
      - {{ run "subtask_1" "subtask_2" }}

  - use: subtask_1
    run:
      - command [args]
     
  - use: subtask_2
    run:
      - command [args]

平台特定任务示例:

tasks:
  - use: script
    run:
    {{ if ne "windows" os }}
      - my_script.sh
    {{ else }}
      - .\my_script.bat
    {{ end }}

Orbit会自动检测您使用的shell(在POSIX系统上使用SHELL环境变量,在Windows上使用COMSPEC)。


更多关于golang基于模板运行命令和生成文件的插件库Orbit的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于golang基于模板运行命令和生成文件的插件库Orbit的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


Orbit - Golang模板化命令执行与文件生成库

Orbit 是一个用于基于模板运行命令和生成文件的 Go 库,它提供了一种灵活的方式来执行模板化的命令操作和文件生成。下面我将介绍 Orbit 的基本用法和示例代码。

安装 Orbit

go get github.com/gsoc2/orbit

基本概念

Orbit 主要提供两种功能:

  1. 基于模板执行命令
  2. 基于模板生成文件

示例代码

1. 基于模板执行命令

package main

import (
	"fmt"
	"log"
	"os"

	"github.com/gsoc2/orbit"
)

func main() {
	// 创建新的 Orbit 实例
	o := orbit.New()

	// 定义模板数据
	data := map[string]interface{}{
		"Name":   "Alice",
		"Age":    30,
		"Action": "greet",
	}

	// 定义命令模板
	command := `echo "Hello {{.Name}}, you are {{.Age}} years old. This is a {{.Action}}."`

	// 执行模板化命令
	output, err := o.ExecuteCommand(command, data)
	if err != nil {
		log.Fatalf("Failed to execute command: %v", err)
	}

	fmt.Println("Command output:", output)
}

2. 基于模板生成文件

package main

import (
	"fmt"
	"log"
	"os"

	"github.com/gsoc2/orbit"
)

func main() {
	// 创建新的 Orbit 实例
	o := orbit.New()

	// 定义模板数据
	data := map[string]interface{}{
		"Name":    "Bob",
		"Version": "1.0.0",
	}

	// 定义文件模板
	fileTemplate := `# Welcome to {{.Name}}'s Project

Version: {{.Version}}

This file was generated automatically by Orbit.
`

	// 生成文件
	err := o.GenerateFile("welcome.md", fileTemplate, data, 0644)
	if err != nil {
		log.Fatalf("Failed to generate file: %v", err)
	}

	fmt.Println("File generated successfully!")
}

3. 从文件加载模板

package main

import (
	"fmt"
	"log"

	"github.com/gsoc2/orbit"
)

func main() {
	o := orbit.New()

	data := map[string]interface{}{
		"ProjectName": "Orbit Demo",
		"Author":      "John Doe",
	}

	// 从文件加载模板并执行命令
	output, err := o.ExecuteCommandFromFile("command.tmpl", data)
	if err != nil {
		log.Fatalf("Error executing command from template: %v", err)
	}

	fmt.Println("Command output:", output)

	// 从文件加载模板并生成文件
	err = o.GenerateFileFromTemplate("output.txt", "template.tmpl", data, 0644)
	if err != nil {
		log.Fatalf("Error generating file from template: %v", err)
	}

	fmt.Println("File generated from template successfully!")
}

高级功能

自定义模板函数

package main

import (
	"fmt"
	"log"
	"strings"

	"github.com/gsoc2/orbit"
)

func main() {
	o := orbit.New()

	// 添加自定义模板函数
	o.AddTemplateFunc("toUpper", strings.ToUpper)
	o.AddTemplateFunc("toLower", strings.ToLower)

	data := map[string]interface{}{
		"Message": "Hello World",
	}

	command := `echo "{{toUpper .Message}} and {{toLower .Message}}"`

	output, err := o.ExecuteCommand(command, data)
	if err != nil {
		log.Fatal(err)
	}

	fmt.Println(output)
}

批量处理

package main

import (
	"fmt"
	"log"

	"github.com/gsoc2/orbit"
)

func main() {
	o := orbit.New()

	items := []map[string]interface{}{
		{"Name": "Item1", "Value": 100},
		{"Name": "Item2", "Value": 200},
		{"Name": "Item3", "Value": 300},
	}

	for _, item := range items {
		output, err := o.ExecuteCommand(`echo "Processing {{.Name}} with value {{.Value}}"`, item)
		if err != nil {
			log.Printf("Error processing %s: %v", item["Name"], err)
			continue
		}
		fmt.Println(output)
	}
}

最佳实践

  1. 模板管理:将常用模板存储在文件中,便于维护和重用
  2. 错误处理:始终检查命令执行和文件生成的错误
  3. 安全考虑:当处理用户提供的模板数据时,注意防范注入攻击
  4. 日志记录:记录重要的模板渲染和命令执行操作

Orbit 提供了一种简洁的方式来处理模板化的命令执行和文件生成,特别适合需要动态生成配置或执行命令的自动化工具开发。

回到顶部