SHELL := /bin/bash
BIN_PATH := /usr/local/bin/j
TARGET_DIR := target/release
MD_RENDER_DIR := plugin/md_render
VERSION := $(shell grep '^version' Cargo.toml | head -1 | sed 's/.*"\(.*\)".*/\1/')
GIT_BRANCH := $(shell git rev-parse --abbrev-ref HEAD)
.PHONY: help \
current_dir push pull status \
build release debug \
install uninstall reinstall \
publish publish-check tag tags \
test test-all bench \
fmt lint check clippy \
clean clean-all \
doc docs \
run run-release \
md_render test-install \
deps update-deps \
watch watch-test \
coverage \
docker-build docker-run \
pre-commit
help:
@echo "📚 j-cli Makefile 帮助"
@echo "============================================"
@echo "版本: $(VERSION) | 分支: $(GIT_BRANCH)"
@echo "============================================"
@grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | \
awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-20s\033[0m %s\n", $$1, $$2}'
@echo ""
@echo "📋 常用命令:"
@echo " make build @echo " make install @echo " make test @echo " make fmt @echo " make clean
current_dir:
@echo "🔍 当前目录信息:"
@echo "======================================"
@echo "目录: $$(pwd)"
@echo "版本: $(VERSION)"
@echo "分支: $(GIT_BRANCH)"
@echo "======================================"
push: current_dir fmt
@echo "📤 推送代码到远程仓库..."
@git add .\
&& (git commit -m "更新: $(shell date +'%Y-%m-%d %H:%M:%S')" || exit 0) \
&& git push origin $(GIT_BRANCH)
@echo "✅ 代码已推送"
pull: current_dir
@echo "📥 拉取最新代码..."
@git pull origin $(GIT_BRANCH)
@echo "✅ 代码已更新"
status: current_dir
@git status
build:
@echo "🔨 构建项目..."
@cargo build
@echo "✅ 构建完成"
release: current_dir
@echo "🚀 构建发布版本..."
@cargo build --release
@echo "✅ 发布版本构建完成: $(TARGET_DIR)/j"
debug:
@echo "🐛 构建调试版本..."
@cargo build --debug
@echo "✅ 调试版本构建完成"
install: release
@echo "📦 安装到系统..."
@cp $(TARGET_DIR)/j $(BIN_PATH)
@chmod +x $(BIN_PATH)
@echo "✅ j 已安装到 $(BIN_PATH)"
@echo " 版本: $(VERSION)"
uninstall:
@echo "🗑️ 卸载..."
@rm -f $(BIN_PATH)
@echo "✅ j 已卸载"
reinstall: uninstall install
@echo "🔄 重新安装完成"
publish: md_render push tag release
@echo "📦 发布到 crates.io..."
@cargo publish --registry crates-io
@echo "✅ 已发布! 验证: cargo search j-cli"
publish-check:
@echo "🔍 发布前检查(dry-run)..."
@cargo publish --registry crates-io --dry-run
@echo "✅ 检查通过"
tag:
@version=$(VERSION); \
tag="v$$version"; \
if git rev-parse "$$tag" >/dev/null 2>&1; then \
echo "❌ 标签 $$tag 已存在 (Cargo.toml 版本 = $$version)"; \
echo " 请先在 Cargo.toml 中更新版本号"; \
exit 1; \
fi; \
echo "📌 创建标签 $$tag (来自 Cargo.toml)..."; \
git tag -a "$$tag" -m "Release $$tag"; \
git push origin "$$tag"; \
echo "✅ 标签 $$tag 已创建并推送。GitHub Actions 将自动构建和发布。"
tags:
@echo "🏷️ 最近的标签:"
@git tag -l | sort -V | tail -10
test:
@echo "🧪 运行测试..."
@cargo test
@echo "✅ 测试完成"
test-all:
@echo "🧪 运行所有测试..."
@cargo test --all-features
@echo "✅ 所有测试完成"
bench:
@echo "⚡ 运行性能测试..."
@cargo bench
@echo "✅ 性能测试完成"
fmt:
@echo "🧹 格式化代码..."
@cargo fmt
@echo "✅ 代码格式化完成"
lint:
@echo "🔍 运行 clippy 检查..."
@cargo clippy -- -D warnings
@echo "✅ clippy 检查完成"
check:
@echo "🔍 检查代码..."
@cargo check
@echo "✅ 代码检查完成"
clippy: lint
pre-commit: fmt lint test
@echo "✅ 所有检查通过,可以提交"
clean:
@echo "🧹 清理构建产物..."
@cargo clean
@echo "✅ 清理完成"
clean-all: clean
@echo "🧹 彻底清理..."
@rm -rf target/
@echo "✅ 彻底清理完成"
doc:
@echo "📚 生成文档..."
@cargo doc --no-deps
@echo "✅ 文档生成完成: target/doc/j_cli/index.html"
docs: doc
run:
@echo "🚀 运行项目..."
@cargo run
run-release: release
@echo "🚀 运行发布版本..."
@$(TARGET_DIR)/j
md_render:
@echo "🔄 构建 md_render 插件..."
@cd $(MD_RENDER_DIR)/code \
&& GOOS=darwin GOARCH=arm64 go build -o ../bin/md_render-darwin-arm64
@echo "✅ md_render 插件构建完成: $(MD_RENDER_DIR)/bin/md_render-darwin-arm64"
test-install:
@echo "🧪 测试安装脚本..."
@./install.sh
deps:
@echo "📦 依赖信息:"
@cargo tree
update-deps:
@echo "🔄 更新依赖..."
@cargo update
@echo "✅ 依赖更新完成"
watch:
@echo "👀 监视文件变化..."
@cargo watch -x run
watch-test:
@echo "👀 监视文件变化并运行测试..."
@cargo watch -x test
coverage:
@echo "📊 生成代码覆盖率报告..."
@cargo tarpaulin --out Html
@echo "✅ 覆盖率报告生成完成: tarpaulin-report.html"
docker-build:
@echo "🐳 构建 Docker 镜像..."
@docker build -t j-cli:$(VERSION) .
@echo "✅ Docker 镜像构建完成: j-cli:$(VERSION)"
docker-run: docker-build
@echo "🐳 运行 Docker 容器..."
@docker run -it --rm j-cli:$(VERSION)