golang通过Markdown实现目录树生成与创建插件库gtree的使用

Golang 通过 Markdown 实现目录树生成与创建插件库 gtree 的使用

gtree 是一个使用 Markdown 或编程方式生成目录树🌳和目录🗂,并验证目录🔍的工具。它提供了 CLI、Golang 库和 Web 界面。

功能特性

Web 界面

访问 gtree Web 页面可以将 Markdown 转换为目录树。该页面调用编译为 WebAssembly 的 Go 包函数。

支持的 Markdown 符号:*, -, +, #

缩进表示层级关系,可以使用任意一致的缩进模式。

CLI 工具

安装方式

# Go 安装
go install github.com/ddddddO/gtree/cmd/gtree@latest

# Homebrew
brew install gtree

# 其他安装方式详见文档

基本使用

# 输出帮助信息
gtree --help

# 输出模板
gtree template

# 从 Markdown 生成目录树
gtree template | gtree output

# 从 Markdown 创建目录和文件
gtree template | gtree mkdir -e .go -e .md -e Makefile

# 验证目录结构
gtree template | gtree verify

Go 库

安装

go get github.com/ddddddO/gtree

使用示例

  1. 从 Markdown 生成目录树:
package main

import (
	"fmt"
	"strings"

	"github.com/ddddddO/gtree"
)

func main() {
	markdown := `
- root
  - dir1
    - file1.go
  - dir2
    - file2.md
`

	r := strings.NewReader(markdown)
	if err := gtree.OutputFromMarkdown(r); err != nil {
		panic(err)
	}
}
  1. 编程方式构建目录树:
package main

import (
	"fmt"

	"github.com/ddddddO/gtree"
)

func main() {
	root := gtree.NewRoot("root")
	dir1 := root.Add("dir1")
	dir1.Add("file1.go")
	dir2 := root.Add("dir2")
	dir2.Add("file2.md")

	if err := gtree.OutputFromRoot(root); err != nil {
		panic(err)
	}
}
  1. 创建实际目录结构:
package main

import (
	"strings"

	"github.com/ddddddO/gtree"
)

func main() {
	markdown := `
- project
  - cmd
    - main.go
  - pkg
    - utils.go
  - go.mod
`

	r := strings.NewReader(markdown)
	if err := gtree.MkdirFromMarkdown(r, gtree.WithFileExtensions(".go", ".mod")); err != nil {
		panic(err)
	}
}

高级功能

多种输出格式

支持 JSON、YAML 和 TOML 格式输出:

# JSON 格式
cat sample.md | gtree output --format json | jq

# YAML 格式
cat sample.md | gtree output --format yaml

# TOML 格式
cat sample.md | gtree output --format toml

验证目录结构

package main

import (
	"strings"

	"github.com/ddddddO/gtree"
)

func main() {
	markdown := `
- project
  - README.md
  - src
    - main.go
`

	r := strings.NewReader(markdown)
	if err := gtree.VerifyFromMarkdown(r); err != nil {
		fmt.Println("目录验证失败:", err)
	}
}

遍历目录树

package main

import (
	"fmt"
	"strings"

	"github.com/ddddddO/gtree"
)

func main() {
	markdown := `
- root
  - dir1
    - file1
  - dir2
    - file2
`

	r := strings.NewReader(markdown)
	err := gtree.WalkFromMarkdown(r, func(path, name string, isDir bool) error {
		fmt.Printf("路径: %s, 名称: %s, 是目录: %t\n", path, name, isDir)
		return nil
	})
	if err != nil {
		panic(err)
	}
}

性能

gtree 针对不同规模的目录树进行了优化:

  • 少量根节点:简单实现更快
  • 大量根节点:管道实现性能更好(使用 --massive 标志或 WithMassive 选项)

文档

gtree 是一个功能强大的工具,可以简化目录结构的创建和管理,特别适合需要自动化目录生成和验证的场景。


更多关于golang通过Markdown实现目录树生成与创建插件库gtree的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于golang通过Markdown实现目录树生成与创建插件库gtree的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


使用gtree库通过Markdown生成目录树

gtree是一个Go语言库,用于根据Markdown格式的文本生成目录树结构并创建对应的文件和目录。下面我将详细介绍如何使用这个库。

基本概念

gtree的工作原理是解析Markdown格式的文本,将其中的层级结构转换为实际的目录和文件结构。Markdown中的列表项(-*)会被解析为目录或文件。

安装gtree

首先安装gtree库:

go get github.com/ddddddO/gtree

基本用法

1. 从Markdown生成目录树

package main

import (
	"fmt"
	"strings"

	"github.com/ddddddO/gtree"
)

func main() {
	markdown := `
- root/
  - dir1/
    - file1.txt
    - file2.txt
  - dir2/
    - subdir/
      - file3.txt
    - file4.txt
  - README.md
`

	// 创建解析器
	parser := gtree.NewParser(strings.NewReader(markdown))
	
	// 生成目录树
	root, err := parser.Parse()
	if err != nil {
		panic(err)
	}

	// 打印目录树结构
	fmt.Println("Directory Tree:")
	gtree.ExecuteProgrammably(root, gtree.NewDebugger())
}

2. 实际创建目录和文件

func createDirectories() {
	markdown := `
- project/
  - src/
    - main.go
    - utils/
      - helper.go
  - pkg/
    - types.go
  - go.mod
  - README.md
`

	parser := gtree.NewParser(strings.NewReader(markdown))
	root, err := parser.Parse()
	if err != nil {
		panic(err)
	}

	// 在当前目录下创建目录结构
	creator := gtree.NewCreator(gtree.WithTargetRoot("."))
	if err := creator.Create(root); err != nil {
		panic(err)
	}
	
	fmt.Println("Directory structure created successfully!")
}

高级功能

1. 自定义文件内容

func createWithContent() {
	markdown := `
- app/
  - main.go // package main\n\nfunc main() {\n\tprintln("Hello, gtree!")\n}
  - config/
    - config.yaml // app:\n  name: gtree-demo\n  version: 1.0.0
`

	parser := gtree.NewParser(strings.NewReader(markdown))
	root, err := parser.Parse()
	if err != nil {
		panic(err)
	}

	creator := gtree.NewCreator(gtree.WithTargetRoot("."))
	if err := creator.Create(root); err != nil {
		panic(err)
	}
}

2. 从文件读取Markdown

func createFromFile() {
	file, err := os.Open("structure.md")
	if err != nil {
		panic(err)
	}
	defer file.Close()

	parser := gtree.NewParser(file)
	root, err := parser.Parse()
	if err != nil {
		panic(err)
	}

	creator := gtree.NewCreator(gtree.WithTargetRoot("project"))
	if err := creator.Create(root); err != nil {
		panic(err)
	}
}

3. 验证目录结构

func validateStructure() {
	markdown := `
- docs/
  - api.md
  - design.md
`

	parser := gtree.NewParser(strings.NewReader(markdown))
	root, err := parser.Parse()
	if err != nil {
		panic(err)
	}

	validator := gtree.NewValidator(gtree.WithTargetRoot("."))
	if err := validator.Validate(root); err != nil {
		fmt.Printf("Validation failed: %v\n", err)
	} else {
		fmt.Println("Directory structure is valid")
	}
}

实际应用示例

下面是一个完整的示例,演示如何创建一个Go项目结构:

package main

import (
	"os"
	"strings"

	"github.com/ddddddO/gtree"
)

func main() {
	projectStructure := `
- myapp/
  - cmd/
    - myapp/
      - main.go // package main\n\nimport "fmt"\n\nfunc main() {\n\tfmt.Println("Hello from gtree!")\n}
  - internal/
    - app/
      - app.go // package app\n\nfunc Run() {\n\tprintln("App is running")\n}
    - config/
      - config.go // package config
  - pkg/
    - utils/
      - helper.go // package utils
  - go.mod // module github.com/user/myapp\n\ngo 1.19
  - README.md // # MyApp\n\nA project created with gtree
`

	// 解析Markdown
	parser := gtree.NewParser(strings.NewReader(projectStructure))
	root, err := parser.Parse()
	if err != nil {
		panic(err)
	}

	// 创建项目目录
	creator := gtree.NewCreator(gtree.WithTargetRoot("."))
	if err := creator.Create(root); err != nil {
		panic(err)
	}

	// 验证创建结果
	validator := gtree.NewValidator(gtree.WithTargetRoot("myapp"))
	if err := validator.Validate(root); err != nil {
		panic(err)
	}

	println("Project structure created and validated successfully!")
}

总结

gtree库提供了一种便捷的方式来通过Markdown定义和生成目录结构,特别适合以下场景:

  1. 快速创建项目脚手架
  2. 自动化测试中的临时目录创建
  3. 文档与实际目录结构的同步
  4. 教学示例中的目录结构生成

通过Markdown定义目录结构既直观又可版本控制,gtree则将其转化为实际的目录和文件,大大提高了开发效率。

回到顶部