Files

179 lines
5.1 KiB
Bash
Raw Permalink Normal View History

2026-05-25 12:41:14 +08:00
#!/usr/bin/env bash
# ============================================================
# chanlun-py — 构建、安装、发布脚本
#
# 前置依赖:
# pip install maturin
# ============================================================
set -euo pipefail
PROJECT_DIR="$(cd "$(dirname "$0")" && pwd)"
cd "$PROJECT_DIR"
# 颜色输出
red() { echo -e "\033[31m$*\033[0m"; }
green() { echo -e "\033[32m$*\033[0m"; }
yellow() { echo -e "\033[33m$*\033[0m"; }
usage() {
cat <<'EOF'
用法: ./build.sh <命令>
命令:
build 开发模式编译(debug)
release 发布模式编译(release,带优化)
install 构建 wheel 并安装到当前 Python 环境
install-rel 同 install
develop 开发模式安装到 venv(需要激活虚拟环境)
test 运行集成测试
sdist 构建源码分发包
wheel 构建 wheel 包(release
publish 发布至 PyPI(需先配置 TWINE_ 环境变量或 .pypirc
clean 清理构建产物
2026-05-26 11:12:44 +08:00
bump 版本号自增(年月.次 → 2605.X)
2026-05-25 12:41:14 +08:00
check 检查 pyproject.toml 配置是否合法
PyPI 发布流程:
1. 确认 Cargo.toml 中 chanlun 依赖已切换为 crates.io 版本(非 path
2. 更新版本号: pyproject.toml + Cargo.toml
3. ./build.sh check — 验证配置
4. ./build.sh publish — 构建并推送至 PyPI
环境变量:
TWINE_USERNAME — PyPI 用户名(或 __token__ 使用 API token
TWINE_PASSWORD — PyPI 密码或 API token
或通过 twine 的 ~/.pypirc 配置
EOF
}
cmd_build() {
green "[build] 开发模式编译..."
cargo build
green "编译完成。使用 'maturin develop' 安装到 venv,或 './build.sh wheel' 构建 wheel"
}
cmd_release() {
green "[release] 发布模式编译..."
cargo build --release
}
2026-05-26 11:12:44 +08:00
cmd_bump() {
green "[bump] 版本号自增..."
python3 "$PROJECT_DIR/bump_version.py"
}
2026-05-25 12:41:14 +08:00
cmd_install() {
2026-05-26 11:12:44 +08:00
cmd_bump
2026-05-25 12:41:14 +08:00
green "[install] 构建 wheel 并安装..."
maturin build --release 2>&1 | tail -3
local wheel=$(ls -t target/wheels/*.whl 2>/dev/null | head -1)
if [ -z "$wheel" ]; then
red "未找到 wheel 文件"
exit 1
fi
pip install --force-reinstall "$wheel" 2>&1 | tail -3
green "安装完成!"
}
cmd_install_rel() {
cmd_install
}
cmd_develop() {
green "[develop] 开发模式安装(需要 venv..."
maturin develop 2>&1 | tail -3
}
cmd_test() {
green "[test] 运行集成测试..."
# 确保已安装
python3 -c "import chanlun" 2>/dev/null || {
yellow "chanlun 未安装,正在构建并安装..."
maturin build --release 2>&1 | tail -3
local wheel=$(ls -t target/wheels/*.whl 2>/dev/null | head -1)
pip install --force-reinstall "$wheel" 2>&1 | tail -3
}
2026-05-26 10:59:28 +08:00
# 复制到临时目录运行,避免本地 chanlun/ 目录被优先导入
local tmp_dir=$(mktemp -d 2>/dev/null || echo "${TMPDIR:-/tmp}/chanlun-test-$$")
mkdir -p "$tmp_dir"
cp test_integration.py "$tmp_dir/test_integration.py"
CHANLUN_PROJECT_ROOT="$PROJECT_DIR/.." python3 "$tmp_dir/test_integration.py" "$@"
rm -rf "$tmp_dir"
2026-05-25 12:41:14 +08:00
}
cmd_sdist() {
green "[sdist] 构建源码分发包..."
maturin sdist
yellow "构建产物在: target/wheels/"
ls -lh target/wheels/*.tar.gz 2>/dev/null || true
}
cmd_wheel() {
2026-05-26 11:12:44 +08:00
cmd_bump
2026-05-25 12:41:14 +08:00
green "[wheel] 构建 wheel 包..."
maturin build --release
yellow "构建产物在: target/wheels/"
ls -lh target/wheels/*.whl 2>/dev/null || true
}
cmd_publish() {
2026-05-26 11:12:44 +08:00
cmd_bump
2026-05-25 12:41:14 +08:00
yellow "发布前请确认:"
yellow " 1. Cargo.toml 中 chanlun 依赖已切换为 crates.io 版本"
yellow " 2. 版本号已更新 (pyproject.toml + Cargo.toml)"
yellow " 3. git 工作区干净且已打 tag"
echo ""
read -rp "确认发布至 PyPI? [y/N] " confirm
if [[ "$confirm" != "y" && "$confirm" != "Y" ]]; then
red "已取消"
exit 0
fi
green "[publish] 构建并发布至 PyPI..."
maturin publish
green "发布完成!"
yellow "安装: pip install chanlun"
}
cmd_clean() {
green "[clean] 清理构建产物..."
cargo clean
rm -rf target/wheels/ dist/ build/ *.egg-info/
find . -type d -name "__pycache__" -exec rm -rf {} + 2>/dev/null || true
green "清理完成"
}
cmd_check() {
green "[check] 验证 pyproject.toml..."
python3 -c "
import tomllib
with open('pyproject.toml', 'rb') as f:
data = tomllib.load(f)
print(' name:', data['project']['name'])
print(' version:', data['project']['version'])
print(' requires-python:', data['project']['requires-python'])
print(' build-backend:', data['build-system']['build-backend'])
print(' OK')
"
green "配置验证通过"
}
# --- main ---
case "${1:-}" in
build) cmd_build ;;
release) cmd_release ;;
install) cmd_install ;;
install-rel) cmd_install_rel ;;
develop) cmd_develop ;;
test) cmd_test ;;
sdist) cmd_sdist ;;
wheel) cmd_wheel ;;
publish) cmd_publish ;;
clean) cmd_clean ;;
2026-05-26 11:12:44 +08:00
bump) cmd_bump ;;
2026-05-25 12:41:14 +08:00
check) cmd_check ;;
-h|--help|help) usage ;;
*) red "未知命令: ${1:-}"; usage; exit 1 ;;
esac