doc-generate/MIGRATION.md

256 lines
6.2 KiB
Markdown

# 🔄 Migration Guide: From go-zero Plugin to Standalone Tool
This document explains how `go-doc` was extracted from go-zero and made independent.
## 📊 What Changed?
### 1. **Module Independence**
**Before (go-zero plugin):**
```go
// Part of go-zero's internal tools
package swagger // in tools/goctl/api/plugin/swagger/
```
**After (standalone):**
```go
module go-doc
package swagger // in internal/swagger/
```
### 2. **Dependency Reduction**
#### Removed Internal Dependencies
| Dependency | Replaced With | Reason |
|:-----------|:--------------|:-------|
| `go-zero/tools/goctl/internal/version` | Custom version in `main.go` | Internal package not accessible |
| `go-zero/tools/goctl/util` | `go-doc/internal/util` | Self-contained utilities |
| `go-zero/tools/goctl/util/stringx` | `go-doc/internal/util` | Custom string manipulation |
| `go-zero/tools/goctl/util/pathx` | `go-doc/internal/util` | Custom path utilities |
| `google.golang.org/grpc/metadata` | Direct map access | Simplified KV retrieval |
#### Kept Essential Dependencies
```go
require (
github.com/go-openapi/spec v0.21.0 // Swagger spec
github.com/spf13/cobra v1.8.1 // CLI framework
github.com/zeromicro/go-zero/tools/goctl v1.9.0 // API parser only
gopkg.in/yaml.v2 v2.4.0 // YAML output
)
```
### 3. **Project Structure**
**Before:**
```
go-zero/
└── tools/
└── goctl/
└── api/
└── plugin/
└── swagger/
├── swagger.go
├── parameter.go
└── ...
```
**After:**
```
go-doc/
├── cmd/
│ └── go-doc/
│ └── main.go # Standalone entry point
├── internal/
│ ├── swagger/ # Core logic (from go-zero)
│ │ ├── swagger.go
│ │ ├── parameter.go
│ │ └── ...
│ └── util/ # Self-contained utilities
│ ├── util.go
│ ├── stringx.go
│ └── pathx.go
└── example/
```
### 4. **Import Path Changes**
**Before:**
```go
import (
"github.com/zeromicro/go-zero/tools/goctl/util"
"github.com/zeromicro/go-zero/tools/goctl/util/stringx"
"github.com/zeromicro/go-zero/tools/goctl/internal/version"
"google.golang.org/grpc/metadata"
)
```
**After:**
```go
import (
"go-doc/internal/util"
)
```
### 5. **Metadata Handling**
**Before (using gRPC metadata):**
```go
func getStringFromKV(properties map[string]string, key string) string {
md := metadata.New(properties)
val := md.Get(key)
if len(val) == 0 {
return ""
}
return val[0]
}
```
**After (direct map access):**
```go
func getStringFromKVOrDefault(properties map[string]string, key string, def string) string {
if len(properties) == 0 {
return def
}
val, ok := properties[key]
if !ok {
return def
}
str, err := strconv.Unquote(val)
if err != nil || len(str) == 0 {
return def
}
return str
}
```
### 6. **Version Information**
**Before:**
```go
ext.Add("x-goctl-version", version.BuildVersion)
ext.Add("x-github", "https://github.com/zeromicro/go-zero")
```
**After:**
```go
ext.Add("x-generator", "go-doc")
ext.Add("x-github", "https://github.com/danielchan-25/go-doc")
```
## 🔧 Implementation Details
### Custom Utilities Created
#### 1. **util.TrimWhiteSpace**
```go
// Replaces: go-zero/tools/goctl/util.TrimWhiteSpace
func TrimWhiteSpace(s string) string {
return strings.Map(func(r rune) rune {
if unicode.IsSpace(r) {
return -1
}
return r
}, s)
}
```
#### 2. **util.FieldsAndTrimSpace**
```go
// Replaces: go-zero/tools/goctl/util.FieldsAndTrimSpace
func FieldsAndTrimSpace(s string, fn func(rune) bool) []string {
fields := strings.FieldsFunc(s, fn)
result := make([]string, 0, len(fields))
for _, field := range fields {
trimmed := strings.TrimSpace(field)
if len(trimmed) > 0 {
result = append(result, trimmed)
}
}
return result
}
```
#### 3. **util.String (for ToCamel/Untitle)**
```go
// Replaces: go-zero/tools/goctl/util/stringx
type String struct {
source string
}
func From(s string) String {
return String{source: s}
}
func (s String) ToCamel() string { /* implementation */ }
func (s String) Untitle() string { /* implementation */ }
```
#### 4. **util.MkdirIfNotExist**
```go
// Replaces: go-zero/tools/goctl/util/pathx.MkdirIfNotExist
func MkdirIfNotExist(dir string) error {
if _, err := os.Stat(dir); os.IsNotExist(err) {
return os.MkdirAll(dir, 0755)
}
return nil
}
```
## ✅ Compatibility
### What's Still Compatible?
**API File Format** - 100% compatible with go-zero `.api` files
**Swagger Output** - Generates identical OpenAPI 2.0 specifications
**All Features** - All swagger generation features preserved
**Tag Syntax** - Same tag options (range, enum, default, example, etc.)
### What's Different?
⚠️ **Generated Metadata**
- `x-generator: "go-doc"` instead of `x-goctl-version`
- `x-github` points to go-doc repository
- Build date format remains the same
⚠️ **Module Name**
- Import as `go-doc` not part of go-zero
⚠️ **Binary Name**
- `go-doc` instead of `goctl api plugin -plugin swagger`
## 🚀 Migration Steps for Users
If you were using go-zero's swagger plugin:
### Old Way (go-zero plugin):
```bash
goctl api plugin -plugin swagger -api example.api -dir output
```
### New Way (standalone go-doc):
```bash
go-doc -a example.api -d output
```
## 📝 Benefits of Independence
1.**Smaller Binary** - Only swagger generation, no full goctl
2.**Faster Installation** - Fewer dependencies
3.**Clearer Purpose** - Single responsibility
4.**Easier Maintenance** - Self-contained codebase
5.**Flexible Updates** - Independent release cycle
## 🙏 Attribution
This tool was extracted from the excellent [go-zero](https://github.com/zeromicro/go-zero)
project. We are grateful to the go-zero team for their foundational work.
---
**Original Source:** https://github.com/zeromicro/go-zero/tree/master/tools/goctl/api/plugin/swagger
**License:** MIT (both original and this project)