-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathbuild.sh
More file actions
executable file
·109 lines (92 loc) · 2.96 KB
/
Copy pathbuild.sh
File metadata and controls
executable file
·109 lines (92 loc) · 2.96 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
#!/usr/bin/env bash
# MailCode 构建脚本 — 构建 pip wheel 包
# 用法:
# bash build.sh # 构建 wheel 到 dist/
# bash build.sh --help # 显示用法
set -euo pipefail
MAILCODE_DIR="$(cd "$(dirname "$0")" && pwd)"
# 默认使用国内 PyPI 镜像(可通过环境变量覆盖)
export PIP_INDEX_URL="${PIP_INDEX_URL:-https://pypi.tuna.tsinghua.edu.cn/simple}"
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
CYAN='\033[0;36m'
NC='\033[0m'
log() { echo -e "${GREEN}[✓]${NC} $*"; }
warn() { echo -e "${YELLOW}[!]${NC} $*"; }
err() { echo -e "${RED}[✗]${NC} $*"; }
info() { echo -e "${CYAN}[i]${NC} $*"; }
usage() {
echo ""
echo " 用法: bash build.sh [选项]"
echo ""
echo " 选项:"
echo " --help 显示此帮助信息"
echo ""
echo " 说明:"
echo " 构建 pip wheel 到 dist/ 目录,供 install.sh 安装使用。"
echo ""
}
# ── 检查 Python ──
PYTHON="${MAILCODE_PYTHON:-python3}"
if ! command -v "$PYTHON" &>/dev/null; then
err "未找到 Python: ${PYTHON}"
echo " 可通过环境变量 MAILCODE_PYTHON 指定 Python 路径"
exit 1
fi
PY_VER=$("$PYTHON" -c "import sys; print(f'{sys.version_info.major}.{sys.version_info.minor}')")
# 检查是否已在虚拟环境
IN_VENV=$("$PYTHON" -c "import sys; print(sys.prefix != sys.base_prefix)")
# ── 解析参数 ──
case "${1:-}" in
--help|-h)
usage
exit 0
;;
-*)
err "未知选项: $1"
usage
exit 1
;;
esac
echo ""
echo " MailCode 构建(wheel)"
echo " ====================="
echo ""
log "Python: $("$PYTHON" --version) (${PY_VER})"
# 确保 build 模块可用(必须是 PyPI 上的 build 包,不能是本地 ./build/ 命名空间包)
if ! "$PYTHON" -c "from build.__main__ import main" &>/dev/null; then
info "安装 build..."
PIP_FLAGS=""
if [ "$IN_VENV" != "True" ]; then
PIP_FLAGS="--break-system-packages"
fi
# shellcheck disable=SC2086
"$PYTHON" -m pip install build -q $PIP_FLAGS 2>&1 | tail -3
fi
log "build 模块已就绪"
# 清理掉本地的 ./build/ 目录 — 它是 distutils 中间产物,但会和 PyPI 的 build 包同名
# 导致 `python -m build` 把这个空目录当作 build 包执行(没有 __main__.py 而失败)。
shopt -s nullglob
rm -rf "$MAILCODE_DIR/build"
# 构建 wheel
info "构建 wheel..."
"$PYTHON" -m build --wheel "$MAILCODE_DIR" 2>&1
log "构建完成"
# 清理 distutils 中间产物(wheel 已在 dist/,build/ 仅为缓存)
rm -rf "$MAILCODE_DIR/build"
# 验证产物
shopt -s nullglob
WHEELS=("$MAILCODE_DIR"/dist/mailcode-*.whl)
if [ ${#WHEELS[@]} -eq 0 ]; then
err "wheel 未生成: ${MAILCODE_DIR}/dist/mailcode-*.whl"
exit 1
fi
WHEEL_FILE="${WHEELS[${#WHEELS[@]}-1]}"
WHEEL_SIZE=$(du -sh "$WHEEL_FILE" | awk '{print $1}')
log "wheel: ${WHEEL_FILE} (${WHEEL_SIZE})"
echo ""
log "构建成功!"
echo ""
info "安装: bash install.sh --local ${WHEEL_FILE}"
echo ""