Files
rustfs-s3-toolkit/PACKAGING_GUIDE.md
2025-07-24 11:26:35 +08:00

188 lines
4.6 KiB
Markdown
Raw Permalink 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.
# 🚀 Python 包发布到 PyPI 完整指南
## 📋 快速开始 (一键复现)
### 🚀 使用 Makefile (推荐)
```bash
make help # 查看所有命令
make install # 安装开发环境
make clean # 清理构建文件
make build # 构建包
make check # 检查包格式
make publish # 发布到 PyPI
make all # 运行所有检查和构建
```
### 🔧 使用脚本
```bash
# 交互式发布 (推荐)
python publish.py
# 自动发布到 PyPI (无交互)
python publish.py --auto
# 发布到 TestPyPI
python publish.py --test
# 仅构建和检查,不发布
python publish.py --check-only
```
### ⚡ 手动命令
```bash
# 环境准备
UV_PYTHON=python3.12 uv venv .venv
source .venv/bin/activate
uv pip install -e ".[dev]"
# 构建发布
rm -rf dist/ build/ *.egg-info/ src/*.egg-info/
python -m build
python -m twine check dist/*
python -m twine upload dist/*
```
## 📁 项目结构
```
project-name/
├── pyproject.toml # ⭐ 核心配置文件
├── README.md # 📖 项目文档
├── LICENSE # 📄 许可证文件
├── Makefile # 🔧 开发工具
├── publish.py # 🚀 发布脚本
├── src/
│ └── package_name/
│ ├── __init__.py # 包初始化
│ └── module.py # 核心模块
├── tests/
│ └── test_module.py # 测试文件
└── examples/
└── basic_usage.py # 使用示例
```
### ✅ 2. pyproject.toml 配置模板
```toml
[project]
name = "your-package-name"
version = "0.1.0"
description = "Your package description"
readme = "README.md"
authors = [
{ name = "Your Name", email = "your.email@example.com" }
]
requires-python = ">=3.9"
dependencies = [
"dependency>=1.0.0",
]
keywords = ["keyword1", "keyword2"]
classifiers = [
"Development Status :: 4 - Beta",
"Intended Audience :: Developers",
"Programming Language :: Python :: 3",
"Programming Language :: Python :: 3.9",
"Programming Language :: Python :: 3.10",
"Programming Language :: Python :: 3.11",
"Programming Language :: Python :: 3.12",
"Programming Language :: Python :: 3.13",
"Topic :: Software Development :: Libraries :: Python Modules",
]
[project.urls]
Homepage = "https://github.com/username/repo"
Repository = "https://github.com/username/repo"
Documentation = "https://github.com/username/repo#readme"
Issues = "https://github.com/username/repo/issues"
[project.optional-dependencies]
dev = [
# 测试工具
"pytest>=7.0.0",
"pytest-cov>=4.0.0",
# 代码格式化
"black>=23.0.0",
"isort>=5.12.0",
# 代码检查
"flake8>=6.0.0",
"mypy>=1.0.0",
# 打包工具 (仅开发环境需要)
"build>=1.0.0",
"twine>=4.0.0",
"setuptools>=68.0.0",
"wheel>=0.40.0",
]
[build-system]
requires = ["setuptools>=68.0.0", "wheel>=0.40.0"]
build-backend = "setuptools.build_meta"
```
## 🔧 PyPI 认证配置
创建 `~/.pypirc` 文件:
```ini
[distutils]
index-servers = pypi
[pypi]
username = __token__
password = pypi-your-api-token-here
```
## ⚠️ 避免常见陷阱
1. **❌ 不要创建 build.py 文件** - 会与 `python -m build` 冲突
2. **❌ 不要手动编辑许可证字段** - 使用 classifiers
3. **❌ 不要混合开发和运行时依赖** - 打包工具放在 dev 依赖中
4. **✅ 使用现代构建系统** - PEP 517/518 标准
## 🚨 故障排除
| 问题 | 解决方案 |
|------|----------|
| build.py 冲突 | 重命名或删除项目中的 build.py |
| 许可证元数据错误 | 移除 pyproject.toml 中的 license 字段 |
| 包名冲突 | 在 PyPI 搜索确认包名可用性 |
| 依赖解析失败 | 检查版本约束和兼容性 |
## ✅ 发布检查清单
- [ ] pyproject.toml 配置完整
- [ ] README.md 文档详细
- [ ] LICENSE 文件存在
- [ ] 测试通过
- [ ] `twine check` 通过
- [ ] 版本号正确
- [ ] PyPI 认证配置
## 🎯 版本兼容性
- **Python 版本**: 3.9-3.13
- **Wheel 标签**: `py3-none-any` (通用兼容)
- **构建系统**: setuptools (稳定可靠)
## 📝 最佳实践
1. **版本管理**: 使用语义化版本 (SemVer)
2. **文档**: 提供完整的 README.md 和使用示例
3. **测试**: 包含完整的测试套件
4. **CI/CD**: 设置自动化测试和发布流程
5. **安全**: 使用 API token 而不是用户名密码
## <20> 发布后验证
```bash
# 安装验证
pip install your-package-name
# 功能验证
python -c "import your_package; print('✅ 安装成功')"
```
---
**这个指南确保每次都能成功发布到 PyPI** 🚀