erlang.mk核心概念速查表:targets、变量、hooks与templates四大机制一次讲透

📅 2026/8/22 13:47:23
erlang.mk核心概念速查表:targets、变量、hooks与templates四大机制一次讲透
erlang.mk核心概念速查表targets、变量、hooks与templates四大机制一次讲透【免费下载链接】erlang.mkA build tool for Erlang that just works.项目地址: https://gitcode.com/gh_mirrors/er/erlang.mkerlang.mk 是一个开箱即用just works的 Erlang 构建工具本质是一个纯文本 Makefile无需复杂配置一条make即可完成依赖下载、代码编译和测试。掌握它只需理解四大核心机制targets构建目标、变量Variables、hooks钩子与 templates模板。本文用一张表 四章速查带你一次讲透 erlang.mk 的核心概念让 Erlang 项目构建从此不迷路 为什么先搞懂这 4 个机制erlang.mk 的设计哲学是约定优于配置 完全的 Unix 力量targets告诉你能做什么编译、测试、发版变量告诉你怎么配置项目名、版本、依赖hooks告诉你如何扩展插入自己的构建规则templates告诉你如何提速一键生成标准模块骨架。四大机制全部在一个 Makefile 里完成可编辑、可调试、可定制。核心实现在 core/core.mk变量与基础 targets、core/erlc.mk编译与 .app 生成、plugins/bootstrap.mk模板渲染引擎等文件中。机制一targets —— 一句话完成构建、测试与发版构建的三个阶段erlang.mk 把一次完整构建拆成三个阶段make默认全部自动执行拉取并编译依赖DEPS中声明的库编译项目本身生成ebin/$(PROJECT).app与 beam 文件;生成 release仅当配置了 release 时。你也可以单独重复其中某一步适合大型项目的增量构建。常用 targets 速查表Target作用典型场景make/make all完整构建依赖 应用 release日常全量构建make app只构建应用和依赖不生成 release日常开发make deps只拉取并编译所有依赖依赖更新后重建make rel构建应用并生成 release发布上线make check运行测试eunit / ct 等提交前验证make clean/make distclean清理 / 彻底清理构建产物排障时重置环境make help列出所有可用命令及说明新手探索入口 所有 targets 都支持并行构建make -j8可显著加速大项目也可在 shell 配置中设MAKEFLAGS-j8永久生效。实战小技巧依赖多但本机磁盘慢如树莓派用变量跳过依赖编译make app SKIP_DEPS1。该命令在 core/app.asciidoc 官方指南中有详细说明。机制二变量 —— 一个 Makefile 配好整个项目PROJECT 系列核心变量erlang.mk 通过 Makefile 顶部的一组变量描述项目全部定义在 core/core.mk 中均有合理默认值变量说明PROJECT应用/库名称默认取目录名PROJECT_VERSION项目版本默认rollingPROJECT_DESCRIPTION简短项目描述写入.app文件PROJECT_MOD应用回调模块默认$(PROJECT)_appPROJECT_REGISTERED注册进程名列表PROJECT_ENV应用环境配置Erlang term 列表LOCAL_DEPS依赖的 OTP 应用或本仓库apps/下的应用DEPS需要 erlang.mk 自动拉取编译的依赖库一个最小可用的配置示例bootstrap 生成的 Makefile 模板见 templates/top_MakefilePROJECT myapp PROJECT_VERSION 0.1.0 DEPS cowlib ranch include erlang.mk?的魔法命令行随时覆盖erlang.mk 内部大量使用?如果未定义才赋值这意味着任何内置变量都可以在命令行临时覆盖无需改文件make # 默认行为 make V2 # 显示详细构建过程 make NO_MAKEDEP1 # 强制重新生成依赖跟踪文件 make app SKIP_DEPS1 # 跳过依赖构建常用编译选项ERLC_OPTS也是如此——在 Makefile 中重新定义即可覆盖默认值默认含-Werror debug_info等见 core/erlc.mk。机制三hooks —— 把你的规则挂进构建流程钩子的位置include 之前或之后erlang.mk 在构建过程的多个阶段预留了钩子hooks。最简单的用法在include erlang.mk之后添加你自己的规则即可挂入构建流程例如让一个脚本先生成 Erlang 源码再参与依赖跟踪PROJECT example include erlang.mk # 钩子生成的 .erl 文件参与依赖跟踪 $(PROJECT).d:: src/generated_mod.erl src/generated_mod.erl:: gen-mod.sh $(gen_verbose) ./gen-mod.sh $$(gen_verbose)是 erlang.mk 提供的安静输出助手构建时只显示一行GEN src/generated_mod.erl。若想在include之前挂钩子需手动设置.DEFAULT_GOAL all否则什么都不构建。插件 hooks把公共构建逻辑复用给所有项目erlang.mk 的插件系统本质上是批量 hooks——一个插件文件可以定义新变量、添加模板、挂钩子、新增规则两种加载时机DEP_PLUGINS在 erlang.mk末尾附近加载可访问所有已初始化变量DEP_EARLY_PLUGINS在 erlang.mk开头附近加载适合为项目添加公共依赖如统一注入DEPS xxx。加载逻辑在 core/plugins.mk完整约定plugins.mk/early-plugins.mk文件命名、help-plugins帮助文本扩展见官方文档 external_plugins.asciidoc。机制四templates —— 两秒生成标准模块骨架内置模板一览新建项目后erlang.mk 内置了一组高质量模板覆盖最常用的骨架代码模板文件位于templates/目录如 templates/gen_server.erl、templates/supervisor.erl模板名用途module普通模块gen_server/gen_statem/gen_fsm状态机行为骨架supervisor监督树节点cowboy_rest_h/cowboy_websocket_h/cowboy_loop_h/cowboy_http_hCowboy 处理函数骨架ranch_protocolRanch 协议实现骨架make list-templates可列出所有可用模板make new-app/make new-module等命令会基于模板生成新文件到src/目录。占位符替换规则模板渲染引擎在 plugins/bootstrap.mk 中实现构建时自动做字符串替换占位符替换为template_name用户提供的模块名project_name$(PROJECT)或目标应用名rel_deps_dir从apps/*内看deps/*的相对路径rel_root_dir从apps/*内看顶层目录的相对路径添加自己的模板只需定义一个以tpl_开头的变量即可注册新模板。插件中推荐用 Makefile 自动读取外部文件的方式Make 4# 插件文件中 tpl_my_hook $(file $(THIS)/templates/my_hook.erl)模板文件里写上-module(template_name).这样的占位符即可。项目自身的templates/目录会被根 Makefile 自动打包进erlang.mk主文件tpl_前缀即来自这一步。四大机制速查总结表机制一句话理解入口位置targetsmake app/make check/make rel构建的动词core/core.mk变量PROJECT、DEPS、ERLC_OPTS构建的名词core/erlc.mkhooksinclude erlang.mk前后加规则构建的扩展点core/plugins.mktemplatestpl_xxx变量 占位符代码生成的快捷键plugins/bootstrap.mk进阶阅读路径构建细节与.app文件机制doc/src/guide/app.asciidoc插件开发约定与早期插件doc/src/guide/external_plugins.asciidoc为什么选择 erlang.mk速度、Unix 力量、纯文本doc/src/guide/why.asciidoc依赖管理core/deps.mkRelease 构建core/rel.mk测试框架core/test.mk✅ 记住这张图景targets 是动词、变量是名词、hooks 是扩展点、templates 是快捷键。四个机制组合起来就是一个just works的 Erlang 构建系统——纯文本、可编辑、拥有完整的 Unix 力量。【免费下载链接】erlang.mkA build tool for Erlang that just works.项目地址: https://gitcode.com/gh_mirrors/er/erlang.mk创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考