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

科普:build与make

build(Python 的 build 模块)和 make 都与“构建”相关,但二者的定位、功能和适用场景有本质区别。简单说:make 是通用的“任务自动化工具”,而 build 是专用的“Python 项目打包工具”

一、定位与设计目标

工具核心定位设计目标
make通用的任务自动化工具(跨语言、跨场景)定义“任务(目标)”和“依赖关系”,自动执行一系列命令(如编译、清理、部署等),减少重复操作。
buildPython 生态专用的打包工具遵循 Python 打包规范(PEP 517/518),将 Python 项目源码构建为可分发的安装包(.whl.tar.gz)。

二、差异对比

1. 适用范围
  • make
    完全通用,不绑定任何编程语言或场景。可用于 C/C++ 编译、Python 项目管理、前端构建、文档生成等几乎所有需要“自动化执行命令”的场景。例如(Makefile中描述):

    • make 编译 C 代码(gcc main.c -o app);
    • make 管理 Python 项目(运行测试、格式化代码);
    • make 串联前端命令(npm install && npm run build)。
  • build
    仅用于 Python 项目,且功能单一——专门处理“打包”这一步骤,无法用于其他语言或场景(如无法编译 C 代码、无法执行前端命令)。

2. 配置方式
  • make
    通过 Makefile 配置,语法灵活,支持:

    • 定义“目标(target)”(如 buildcleantest);
    • 声明目标之间的依赖关系(如 demo 依赖 build-ui);
    • 变量、条件判断、循环等逻辑(例如 CC=gcc 定义编译器)。

    示例(简化的 Makefile):

    build:gcc main.c -o app  # 编译C代码
    clean:rm -f app         # 清理产物
    
  • build
    无需单独配置文件(或依赖 Python 项目的标准配置文件 pyproject.toml),通过命令行参数控制打包行为。例如:

    python -m build --outdir dist  # 打包到 dist 目录
    

    它的“配置”主要通过 pyproject.toml 定义项目元信息(名称、版本、依赖等),而非像 Makefile 那样定义命令流程。

3. 核心功能
  • make
    核心是“自动化执行一系列命令,并处理依赖关系”。例如:

    • 若目标 A 依赖目标 B,执行 make A 时会先自动执行 make B
    • 若文件未修改(比目标产物新),make 会跳过该步骤(增量构建,提高效率)。
  • build
    核心是“标准化打包”。它会:

    • 读取 pyproject.tomlsetup.py 获取项目信息;
    • 按照 Python 规范处理源码、资源文件(如前端静态资源);
    • 生成符合规范的 .whl(二进制包)和 .tar.gz(源码包),确保能被 pip 等工具正确安装。
4. 依赖处理
  • make
    处理“任务依赖”或“文件依赖”。例如:

    • 任务依赖:make deploy 必须先执行 make buildmake test
    • 文件依赖:若 main.capp(编译产物)新,make 会重新执行 gcc 编译。
  • build
    仅处理 Python 项目的“安装依赖”,但不负责安装它们。它会读取 pyproject.toml 中的 dependencies 字段,确保打包产物包含依赖信息,但实际安装依赖需要 pipuv 等工具。

5. 配置文件
  1. make 必须依赖 Makefile
    make 工具的核心逻辑是读取 Makefile 中定义的“目标(target)”和“命令规则”,然后根据这些规则执行操作。如果没有 Makefile,直接运行 make 会报错(提示“没有规则可制作目标”)。

举个例子:

  • 若当前目录没有 Makefile,执行 make build 会报错:make: *** No rule to make target 'build'. Stop.
  • 只有当目录中存在 Makefile,且其中定义了 build 目标(如 build: gcc main.c -o app),make build 才能正常执行。

因此,make 的工作完全依赖 Makefile 的配置——Makefilemake 的“操作指南”,没有它,make 就不知道该做什么。

  1. build(Python 的 build 模块)可以单独使用
    build 是 Python 专用的打包工具,它的工作不依赖“专用配置文件”,而是直接读取 Python 项目中已有的标准配置文件(如 pyproject.tomlsetup.py 等),这些文件本身就是 Python 项目的一部分(用于定义项目名称、版本、依赖等元信息)。

只要你的 Python 项目中存在这些标准配置文件,就可以直接在项目根目录运行 build 命令,无需额外创建类似 Makefile 的配置文件。

举个例子:

  • 假设项目结构如下(典型的 Python 项目):
    my_project/
    ├── pyproject.toml  # 项目元信息配置(必备)
    ├── src/            # 源码目录
    │   └── my_module/
    │       └── __init__.py
    
  • 直接在 my_project 目录下执行 python -m buildbuild 会自动读取 pyproject.toml,并在当前目录生成 dist 文件夹(包含 .whl.tar.gz 包)。

三、典型使用场景

makebuild“协作关系”

  • make 是“总指挥”:通过 Makefile 定义全局流程,串联前端构建(npm install)、安装 build 工具(uv pip install build)、调用 build 打包等步骤。 即build可以放在makefile中,也可以放在pyproject.toml中。
  • build 是“执行者”:仅负责其中一个具体步骤——将包含前端产物的 Python 项目打包成 .whl 文件(python -m build --outdir build)。
维度makebuild(Python)
角色通用任务自动化工具Python 专用打包工具
功能执行任意命令、处理依赖关系生成 Python 安装包(.whl/.tar.gz
适用场景跨语言项目构建、多步骤流程自动化仅 Python 项目打包
配置文件Makefile(自定义命令和依赖)依赖 pyproject.toml(项目元信息)

简单说:make 像“瑞士军刀”,能处理各种自动化任务;build 像“专用螺丝刀”,只负责 Python 打包这一件事。在复杂项目中,它们常配合使用——make 统筹全局流程,build 负责具体的 Python 打包步骤。


文章转载自:

http://qBgLRiqX.fLhkL.cn
http://tfEsSFCL.fLhkL.cn
http://X8g4Mhlk.fLhkL.cn
http://t2X7lmHk.fLhkL.cn
http://NiRXXyBM.fLhkL.cn
http://MVWH5Gsv.fLhkL.cn
http://PGlHnpf5.fLhkL.cn
http://yjz6NPHH.fLhkL.cn
http://LiZymYMh.fLhkL.cn
http://PKDiuVE9.fLhkL.cn
http://Gv6MC1Ja.fLhkL.cn
http://gGMsFgi0.fLhkL.cn
http://YioRpxXY.fLhkL.cn
http://ZElB1Umk.fLhkL.cn
http://3VWasxjt.fLhkL.cn
http://ZNsBdW4E.fLhkL.cn
http://S2i25j3m.fLhkL.cn
http://cgMyTSyh.fLhkL.cn
http://btKchtP0.fLhkL.cn
http://z8Gijio9.fLhkL.cn
http://NUm38vit.fLhkL.cn
http://1qyt3FY2.fLhkL.cn
http://MBYuPizE.fLhkL.cn
http://i3vYaKmI.fLhkL.cn
http://lZBuysTT.fLhkL.cn
http://7g7X0WoC.fLhkL.cn
http://5olpZdE0.fLhkL.cn
http://5Mz1EDwO.fLhkL.cn
http://D5kJkINd.fLhkL.cn
http://5FkgNzT1.fLhkL.cn
http://www.dtcms.com/a/388586.html

相关文章:

  • 对比OpenCV GPU与CPU图像缩放的性能与效果差异
  • 网络工程师行业新技术新概念
  • 【Linux】Linux中dos2unix 工具转换文件格式
  • 实验4:表单控件绑定(2学时)
  • QT OpenCV 准备工具
  • 无锁化编程(Lock-Free Programming)分析
  • Centons7 docker 安装 playwright
  • 远距离传输大型文件:企业数字化转型的挑战与突破
  • 氧气科技亮相GDMS全球数字营销峰会,分享AI搜索时代GEO新观
  • useMemo和useCallback
  • 【数据结构---图的原理与最小生成树算法,单源最短路径算法】
  • 有发声生物(猫狗鸟等)与无发声生物(蚂蚁蝙蝠蛇等)的 “感知-->行动“
  • CC 攻击为什么越来越难防?
  • 量化交易 - Multiple Regression 多变量线性回归(机器学习)
  • 【机器学习】基于双向LSTM的IMDb情感分析
  • CLR-GAN训练自己的数据集
  • LeetCode 242 有效的字母异位词
  • 中州养老:Websocket实现报警通知
  • python+excel实现办公自动化学习
  • 深度学习快速复现平台AutoDL
  • 《股票智能查询与投资决策辅助应用项目方案》
  • nvm安装包分享【持续更新】
  • 2025年- H143-Lc344. 反转字符串(字符串)--Java版
  • 数据库的事务
  • Cadence SPB 2025安装教程(附安装包)Cadence SPB 24.1下载详细安装图文教程
  • .NET Framework 4.8 多线程编程
  • qt QHorizontalPercentBarSeries详解
  • 软考中级习题与解答——第七章_数据库系统(3)
  • Redis(基础数据类型/String)
  • python的面试题