Files
meijiaka-zy/python-api/Makefile
T
小鱼开发 285257905e feat: 视频生成页面改造、字幕冻结修复及多项前端优化
- 修复字幕切换模板后冻结的 bug:ASS.js 新实例在视频播放中创建时收不到
  play/playing 事件,RAF 循环不会启动。创建实例后手动触发 play 事件。
- VideoGeneration 页面 overhaul:卡片点击预览、左右箭头导航、换一个素材、
  动态按钮文案和占位提示。
- 修复私有音色素材预览播放 trialUrl 的问题,改为播放 sourceUrl。
- 放宽空镜素材匹配逻辑:优先满足时长,fallback 到最近时长并随机选择。
- 隐藏脚本生成页面的时长滑块。
- 修复登录页和侧边栏标题渐变 WebKit 兼容问题。
- 清理旧计划文档、测试文件和临时脚本。
- 更新 Makefile、prompts、materials.json 等配置。
2026-04-23 23:17:10 +08:00

155 lines
4.9 KiB
Makefile
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 美家卡智影 API - 常用命令
# ==========================
.PHONY: help install dev install-hooks update-lock lint format test security clean docker
help: ## 显示帮助信息
@grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-20s\033[0m %s\n", $$1, $$2}'
# ========== 依赖管理 ==========
install: ## 安装生产依赖(使用 lock 文件)
uv pip sync requirements.lock
dev: ## 安装开发依赖(包含 dev extras)
uv pip install -e ".[dev]"
pre-commit install
install-hooks: ## 安装 Git pre-commit 钩子
pre-commit install
update-lock: ## 更新 requirements.lock(修改 pyproject.toml 后执行)
uv pip compile pyproject.toml -o requirements.lock --upgrade
update-lock-no-upgrade: ## 重新生成 lock 文件(不升级版本)
uv pip compile pyproject.toml -o requirements.lock
# ========== 代码质量 ==========
lint: ## 运行代码检查 (ruff + mypy)
ruff check app/
mypy app/
format: ## 格式化代码 (black + ruff)
black app/
ruff check --fix app/
format-check: ## 检查代码格式(不修改)
black --check app/
ruff check app/
# ========== 测试 ==========
test: ## 运行测试
pytest -v
test-cov: ## 运行测试并生成覆盖率报告
pytest --cov=app --cov-report=html --cov-report=term
# ========== 安全扫描 ==========
security: ## 运行安全扫描 (bandit + pip-audit)
@echo "🔍 运行 Bandit 安全扫描..."
bandit -r app/ -c pyproject.toml
@echo "🔍 运行依赖漏洞扫描..."
pip-audit
# ========== 开发服务器 ==========
run: ## 启动开发服务器
uvicorn app.main:app --reload --host 0.0.0.0 --port 8000
scheduler: ## 启动 Async Engine Scheduler
python -m app.scheduler.main
# ========== Docker ==========
# ⚠️ 注意:db + redis 是共享基础设施(另一个项目管理),
# 当前项目只管理 api + scheduler,禁止用 docker-compose down。
docker: ## 构建 Docker 镜像
docker build -t meijiaka-api:latest .
docker-run: ## 启动 api + scheduler(共享 db/redis,不动基础设施)
docker-compose -p meijiaka-zj up -d
docker-rebuild: ## 强制重建 api + scheduler(代码更新后使用)
docker-compose -p meijiaka-zj up -d --build --force-recreate api scheduler
docker-stop: ## 停止 api + scheduler(保留 db/redis
docker-compose -p meijiaka-zj down
docker-rm: ## 删除 api + scheduler 容器(保留 db/redis
docker-compose -p meijiaka-zj rm -f
docker-logs: ## 查看 Docker 日志
docker-compose logs -f
docker-logs-api: ## 查看 api 日志
docker-compose logs -f api
docker-logs-scheduler: ## 查看 scheduler 日志
docker-compose logs -f scheduler
# ========== 清理 ==========
clean: ## 清理缓存文件
find . -type d -name "__pycache__" -exec rm -rf {} + 2>/dev/null || true
find . -type f -name "*.pyc" -delete 2>/dev/null || true
find . -type d -name ".pytest_cache" -exec rm -rf {} + 2>/dev/null || true
find . -type d -name ".mypy_cache" -exec rm -rf {} + 2>/dev/null || true
rm -rf htmlcov/ .coverage 2>/dev/null || true
# ========== 语义层防护网 ==========
lint-semantic: ## 语义层禁词检查(防止供应商术语泄漏到业务层)
@echo "🔍 检查 Layer 3+ 是否泄漏供应商术语..."
@# API 层(除 klingai Provider 代理)禁止 element_id 作为字段/参数名
@errs=$$(grep -rn 'element_id' app/api --include='*.py' \
| grep -v 'klingai.py' \
| grep -v 'provider_element_id' \
| grep -v '__pycache__' \
| grep -v '#' \
| grep -v '".*element_id.*"' \
| grep -v "'.*element_id.*'"); \
if [ -n "$$errs" ]; then \
echo "$$errs"; \
echo "❌ API 层发现 element_id(应使用 provider_element_id 或 human_id"; \
exit 1; \
fi
@# Scheduler 层禁止 task_id 作为内部变量/Redis key(读取 Provider 返回除外)
@errs=$$(grep -rn '\btask_id\b' app/scheduler --include='*.py' \
| grep -v 'job_id' \
| grep -v '__pycache__' \
| grep -v '\.get("task_id")' \
| grep -v 'result.get("task_id")' \
| grep -v 'task_type' \
| grep -v '"task_id"' \
| grep -v "'task_id'"); \
if [ -n "$$errs" ]; then \
echo "$$errs"; \
echo "❌ Scheduler 层发现 task_id(应使用 job_id"; \
exit 1; \
fi
@# 全局禁止 kling_task_id 作为持久化字段
@errs=$$(grep -rn 'kling_task_id' app --include='*.py' \
| grep -v '__pycache__' \
| grep -v 'providers/klingai'); \
if [ -n "$$errs" ]; then \
echo "$$errs"; \
echo "❌ 发现 kling_task_id(应使用 provider_task_id"; \
exit 1; \
fi
@# Scheduler 层 Redis key 必须使用 job: 而非 task:
@errs=$$(grep -rn 'redis.*task:' app/scheduler --include='*.py' \
| grep -v '__pycache__'); \
if [ -n "$$errs" ]; then \
echo "$$errs"; \
echo "❌ Scheduler Redis key 使用 task:(应使用 job:"; \
exit 1; \
fi
@echo "✅ 语义层检查通过"
# ========== CI 检查 ==========
ci: format-check lint lint-semantic test security ## 运行所有 CI 检查