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
使用示例
- 从 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)
}
}
- 编程方式构建目录树:
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)
}
}
- 创建实际目录结构:
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
更多关于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定义和生成目录结构,特别适合以下场景:
- 快速创建项目脚手架
- 自动化测试中的临时目录创建
- 文档与实际目录结构的同步
- 教学示例中的目录结构生成
通过Markdown定义目录结构既直观又可版本控制,gtree则将其转化为实际的目录和文件,大大提高了开发效率。