当前位置: 首页 > news >正文

从零开始:用uv构建并发布一个Python CLI应用,集成CI/CD自动化发布与Docker容器化部署

使用uv构建并发布一个完整的Python CLI应用

  • 概述
    • 初始化项目
    • 编写应用代码
    • 定义项目 (`pyproject.toml`)
    • 使用`uv`安装依赖
    • 本地运行和测试
    • 依赖锁定
    • 构建
    • 发布
    • 生产环境实践之CI/CD
      • 创建工作流配置文件
      • 配置GitHub Secrets
      • 创建和推送tag
      • 验证发布
    • 生产环境实践之Docker
      • 创建Dockerfile
      • 构建镜像
      • 运行容器

概述

从一个空目录开始,使用 uv 创建、开发、构建并发布一个名为 ccyy-demo 的命令行调用的工具

初始化项目

uv 提供了 uv init 命令,可以快速生成一个遵循最佳实践的项目骨架。使用 --package 参数可以直接创建标准的 src 布局。

1.基于已有项目进行初始化

# 创建并进入项目根目录
mkdir ccyy-demo
cd ccyy-demo# 在当前项目下初始化并生成标准目录结构
# 会自动创建虚拟环境 (.venv)、pyproject.toml, 以及src/ccyy_demo/__init__.py源代码结构
uv init . --package

2.使用uv创建并初始化项目

uv init --package ccyy_demo
# 需单独创建venv环境
uv venv

现在,你的目录结构应该是这样的:

ccyy-demo/
├── .venv/
├── pyproject.toml
├── .python-version
├── .gitignore
├── README.md
└── src/└── ccyy_demo/├── __init__.py

编写应用代码

创建 src/ccyy_demo/main.py 文件,写入命令行调用工具的代码核心逻辑。将使用 argparse 来处理命令行参数。

import argparsedef main():"""CLI 工具的主入口函数"""parser = argparse.ArgumentParser(description="一个由 ccyy-demo 创建的、使用 uv 构建的简单 CLI 工具。")parser.add_argument("--name",default="World",help="The name to greet.")args = parser.parse_args()print(f"Hello, {args.name}! This is ccyy-demo speaking.")if __name__ == "__main__":main()

src/ccyy_demo/__init__.py的执行入口添加实现函数

from .main import main as ccyy_demo_maindef main() -> None:ccyy_demo_main()

定义项目 (pyproject.toml)

pyproject.toml是现代Python项目的核心配置文件,它遵循 PEP 621 标准,用于定义项目的元数据、依赖项和构建系统。

uv init 已经为生成了一个 pyproject.toml模板,默认内容如下:

[project]
name = "ccyy-demo"
version = "0.1.0"
description = "Add your description here"
readme = "README.md"
requires-python = ">=3.10"
dependencies = [][project.scripts]
ccyy-demo = "ccyy_demo:main"[build-system]
requires = ["hatchling"]
build-backend = "hatchli
http://www.xdnf.cn/news/1461907.html

相关文章:

  • 码农的“必修课”:深度解析Rust的所有权系统(与C++内存模型对比)
  • PCDN双系统赋能企业
  • LeetCode 2749.得到整数零需要执行的最少操作数:很独特的一道数学题(多公式硬讲——一步步还真能看懂)
  • 计算机网络7 第七章 网络安全
  • Graphpad 绘图(二):小鼠生存曲线绘制与数据记录分析详解
  • Windows 部署 Gerrit 与 Apache24 配置
  • 【传奇开心果系列】Flet框架实现的搜索引擎搜索关键词建议提示和自动完成自定义组件模板特色和实现原理深度解析
  • 无人机小目标检测新SOTA:MASF-YOLO重磅开源,多模块协同助力精度飞跃
  • [特殊字符] 香蕉超市|Nano Bananary|ZHO|已开源
  • 大数据毕业设计选题推荐-基于大数据的分化型甲状腺癌复发数据可视化分析系统-Spark-Hadoop-Bigdata
  • 85 printk 输出丢失数据
  • 分布式专题——1.1 Redis单机、主从、哨兵、集群部署
  • 解决 Apache/WAF SSL 证书链不完整导致的 PKIX path building failed 问题
  • 还在为第三方包 bug 头疼?patch-package 让你轻松打补丁!
  • 时间轮算法在workerman心跳检测中的实战应用
  • leecode kadane算法 解决数组中子数组的最大和,以及环形数组连续子数组的最大和问题
  • Doirs Routine Load
  • PHP:驱动现代Web应用发展的核心力量
  • 【AI产品思路】AI 原型设计工具横评:产品经理视角下的 v0、Bolt 与 Lovable
  • 如何在 C# 中将文本转换为 Word 以及将 Word 转换为文本
  • Python 实现 Markdown 与 Word 高保真互转(含批量转换)
  • Windows 文件资源管理器无法预览文件内容word、ppt、excel、pdf
  • python创建并写入excel文件
  • Go语言的编译和运行过程
  • 【案例】AI语音识别系统的标注分区策略
  • 云计算学习笔记——日志、SELinux、FTP、systemd篇
  • FastGPT源码解析 工作流、知识库、大模型、Agent等核心代码文件梳理
  • es运维常用命令
  • 基于cornerstone3D的dicom影像浏览器 第四章 鼠标实现翻页、放大、移动、窗宽窗位调节
  • 进阶向:Python生成艺术图案(分形、数学曲线)