go-zero goctl model 表前缀 (Liunx)

117 阅读1分钟

创建 model.mk 文件用于外部Makefile引用,或者改名为Makefile直接使用


# 变量默认值,只有变量未被外部定义时才赋值
DB_DSN ?= user:pass@tcp(localhost:3306)/dbname
# 输出目录,默认为当前目录
OUTPUT_DIR ?= .
 # 表前缀,用于去除文件名以及结构体与函数中的小写表前缀
TABLE_PREFIX ?= zp
 # 表前缀,用于去除文件名以及结构体与函数中的大写表前缀
OLD_PREFIX ?= Zp
 # 表名,多个表名用逗号分隔,用于生成模型, *为所有表
TABLE ?= zp_user,zp_user_xx
# 表中需要过滤的列名(在执行插入或者更新操作时会忽略某些字段的赋值),多个列名用逗号分隔  
IGNORE_COLUMNS ?=

.PHONY: gen-model fix-names clean-model clean-gen

# 生成模型 & 修复命名
gen-model:
	goctl model mysql datasource \
		-url="$(DB_DSN)" \
		-dir="$(OUTPUT_DIR)" \
		-c=true \
		--table="$(TABLE)" \  
		$(if $(strip $(IGNORE_COLUMNS)),-i="$(IGNORE_COLUMNS)")
	$(MAKE) fix-names

# 修复命名中的前缀(文件名、结构体、函数)
fix-names:
	@echo "🛠 正在移除前缀 $(TABLE_PREFIX)/$(OLD_PREFIX)..."
	@for file in $(TABLE_PREFIX)*.go; do \
		base=$$(basename $$file); \
		newbase=$$(echo $$base | sed "s/^$(TABLE_PREFIX)//"); \
		newfile="$(OUTPUT_DIR)/$$newbase"; \
		mv "$$file" "$$newfile"; \
		oldstruct=$$(echo $$base | sed -E 's/Model.go$$//' | sed -E 's/(^|_)([a-z])/\U\2/g'); \
		newstruct=$$(echo $$newbase | sed -E 's/Model.go$$//' | sed -E 's/(^|_)([a-z])/\U\2/g'); \
		sed -i -E "s/\b$(OLD_PREFIX)([A-Z][a-zA-Z0-9_]*)/\1/g" "$$newfile"; \
		sed -i -E "s/\b$(TABLE_PREFIX)([A-Z][a-zA-Z0-9_]*)/\L\1/g" "$$newfile"; \
		sed -i -E "s/\bdefault$(OLD_PREFIX)([A-Z][a-zA-Z0-9_]*)/default\1/g" "$$newfile"; \
		sed -i -E "s/\bdefault$(TABLE_PREFIX)([A-Z][a-zA-Z0-9_]*)/default\L\1/g" "$$newfile"; \
		sed -i -E "s/\bcustom$(OLD_PREFIX)([A-Z][a-zA-Z0-9_]*)/custom\1/g" "$$newfile"; \
		sed -i -E "s/\bcustom$(TABLE_PREFIX)([A-Z][a-zA-Z0-9_]*)/custom\L\1/g" "$$newfile"; \
		sed -i -E "s/\bNew$(OLD_PREFIX)([A-Z][a-zA-Z0-9_]*)/New\1/g" "$$newfile"; \
		sed -i -E "s/\bnew$(OLD_PREFIX)([A-Z][a-zA-Z0-9_]*)/new\1/g" "$$newfile"; \
		sed -i "s/\b$$oldstruct\b/$$newstruct/g" "$$newfile"; \
		sed -i "s/\bNew$$oldstruct\b/New$$newstruct/g" "$$newfile"; \
		echo "✔ 处理完成:$$file → $$newfile"; \
	done

# 清理模型
clean-model:
	@echo "🧹 正在删除所有包含 'model' 的 .go 文件..."
	@find . -maxdepth 1 -type f -name '*model*.go' -exec rm -v {} +

# 清理模型
clean-gen:
	@echo "🧹 正在删除所有包含 'model_gen' 的 .go 文件..."
	@find . -maxdepth 1 -type f -name '*model_gen*.go' -exec rm -v {} +

Makefile 引用方法

include ./model.mk
DB_DSN = user:pass@tcp(localhost:3306)/dbname
#OUTPUT_DIR = .
#TABLE_PREFIX = zp
#OLD_PREFIX = Zp
TABLE = *