使用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.pswp.cn/pingmian/95497.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/95497.shtml
英文地址,请注明出处:http://en.pswp.cn/pingmian/95497.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何在Qt中使用周立功USB转CAN卡

如何在 Qt 中使用周立功 USB 转 CAN 卡 文章目录如何在 Qt 中使用周立功 USB 转 CAN 卡一、简介二、准备工作三、使用四、运行效果五、写在最后​一、简介 最近在工程中用到了周立功的 USB 转 CAN 卡,需求是要通过上位机进行通信,因此有了这篇文章。 有…

JavaScript 源码剖析:从字节码到执行的奇妙旅程

JavaScript,这门风靡全球的脚本语言,以其灵活性和跨平台性征服了无数开发者。我们每天都在使用它,但它在后台是如何工作的?一段看似简单的JS代码,在执行之前究竟经历了哪些“变形记”?今天,让我…

FPGA—硬件电路一旦上电配置完成,各个功能模块会并行地持续工作

1.示例代码参考这段代码是用 Verilog 编写的一个 LED 闪烁控制模块,主要实现了 LED 按一定时间间隔循环移位闪烁的功能。下面详细解释其架构组成:模块定义与端口声明模块名为 led_flash,包含三个端口:sys_clk:输入端口…

从零到上线:Docker、Docker Compose 与 Runtime 安装部署全指南(含实战示例与应用场景)

文章目录一、Docker 安装1. Ubuntu / Debian(官方仓库)2. RHEL / CentOS / Rocky / AlmaLinux3. 验证4. macOS / Windows(Docker Desktop)二、Docker Compose(V2)安装与基本用法1) 验证2) 最小示例&#xf…

Java基础篇02:基本语法

1 注释 注释是写在程序中对代码进行解释说明的文字,方便自己和其他人查看,以便理解程序的。注释分为三种:单行注释、多行注释、文档注释注释不影响代码的执行: 原因是编译后的文件已经没有注释了// 这是单行注释:。通常…

【SECS/GEM 】SECS/GEM 日志管理相关的消息

明白 ✅ 在 SECS/GEM 架构里,设备日志(Equipment Logging 主要涉及 事件日志(Event Log)、报警日志(Alarm Log)、配方操作日志(Recipe Log)、以及用户操作/命令日志。这些日志通过 S…

ragas 框架使用Chat-GLM模型报API 调用参数有误,请检查文档

ragas 框架使用Chat-GLM模型报API 调用参数有误,请检查文档解决方案 from ragas.llms import LangchainLLMWrapper # 点击LangchainLLMWrapper 进入这个类找到这个方法直接 return 0.1出现问题原因 ChatGLM 不支持设置temperature等于0,默认的值太小了

Kaggle - LLM Science Exam 大模型做科学选择题

Kaggle - LLM Science Exam Science Exam Simple Approach w/ Model Hub | Kaggle Platypus2-70B with Wikipedia RAG | Kaggle 5个选项只有一个选项正确,目标:回答一个选项序列(只有前三个有效) 输出正确选项 (可…

贪吃蛇鱼小游戏抖音快手微信小程序看广告流量主开源

核心优势:为流量主运营者与新手量身打造 1. 为流量主运营者破解成本困局 本地化运行,零服务器成本:数据运行与存储全程在用户手机本地完成,无需部署服务器及后台系统,彻底摆脱服务器租赁、维护等硬性支出,…

PDF Reader 编辑阅读工具(Mac中文)

原文地址:PDF Reader 编辑阅读 for Mac v5.2.0 PDF Reader Pro Mac,是一款PDF编辑阅读,PDF Reader Pro让您直接在 Mac 上进行PDF文件阅读、笔记、编辑、转换、创建PDF、签署PDFs、填写PDF Forms表单、设置密码、合并拆分文件、水印等等&…

Django REST framework:SimpleRouter 使用指南

1. SimpleRouter 是什么? SimpleRouter 是 DRF(Django REST framework)提供的路由器,能根据 ViewSet 自动生成标准的 REST 路由,包括: GET /resources/ → 列表(list)POST /resource…

覆盖Transformer、GAN:掩码重建正在重塑时间序列领域!

随着大数据与深度学习的发展,时间序列分析的建模能力显著提升,而掩码重建作为一种自监督学习范式,已成为提升序列表征能力的重要技术。该方法通过随机掩码部分数据并重建原始序列,迫使模型挖掘时序依赖性与潜在模式,在…

用AI做TikTok影视解说,全流程全自动成片,不懂外语也能做全球矩阵!

多语种解说: 短剧出海狂吸美金 多语种解说抢先机 TikTok、YouTube等平台,尤其在非英语市场,内容供给仍远远不足,每一个小语种市场都是潜在蓝海。 有人用英语讲仙侠、西语讲爽剧、日语讲宫斗、阿语讲悬疑,一夜涨粉百…

解密大语言模型推理:输入处理背后的数学与工程实践

解密大语言模型推理:输入处理背后的数学与工程实践当你向ChatGPT提问时,短短几秒内就能获得流畅的回答,这背后隐藏着怎样的技术魔法?答案在于大语言模型高效推理过程中精妙的输入处理机制。在现代大语言模型推理中,输入…

02、连接服务器的几种方式

02、连接服务器的几种方式 1、Xshell 适用于Windows https://www.xshell.com/en/free-for-home-school/ 2、Termius 适用于MacOS 直接苹果商店下载即可 3、IDEA 连接 Tools - Deployment - Browse Remote Host 1、打开Browse Remote Host2、添加服务3、输入服务器连接信息并测试…

高并发系统设计方案(直播场景)

最近在准备面试,正把平时积累的笔记、项目中遇到的问题与解决方案、对核心原理的理解,以及高频业务场景的应对策略系统梳理一遍,既能加深记忆,也能让知识体系更扎实,供大家参考,欢迎讨论。 1. 微服务拆分 …

网络编程基础:一文搞懂 Socket、HTTP、HTTPS、TCP/IP、SSL 的关系

在日常开发中,我们经常听到 Socket、HTTP、HTTPS、TCP/IP、SSL 这些术语,这些概念往往容易混淆,且让人感到困惑。本文将用最通俗易懂的方式来讲清这些网络概念及其相互关系。一、从寄信说起:网络通信的本质假如你要给远方的朋友寄…

查看LoRA 哪个适配器处于激活状态(67)

哪个适配器处于激活状态 当前哪个适配器处于激活状态?我们来查看active_adapter属性就知道了 peft_model.active_adapter输出 default试试另一个(适配器) 你更想试试另一个(适配器)吗?只需调用set_adapter()方法即可。 peft_model.set_adapter(yoda) peft_model.act…

​​Nginx高性能Web服务器实战:从协议原理到运维优化​​

目录 前言 一、Web基础概念 1.1 什么是Web? 1.2 B/S架构模型 1.3 Web请求与响应流程 1.4 静态资源 vs 动态资源 二、HTTP/HTTPS协议详解 2.1 HTTP与HTTPS区别 2.2 HTTPS握手流程 2.3 HTTP状态码大全 三、Nginx核心知识 3.1 Nginx简介 3.2 Nginx vs Apache 3.3 Nginx…

【先楫HPM5E00_EVK系列-板卡测评3】hpm5e00evk平台中断、定时器、PWM、USART等基础功能详解

此文介绍了利用先楫半导体(hpm)官方hpm5e00_evk开发板使用的主控芯片的一些原理性知识,无实验内容展示,主要汇总了先楫半导体hpm5e00主控芯片的中断、定时器、pwm、usart等功能,主要内容来源于B站“HPM_FAE”的视频和官…