ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Erlang依赖管理全攻略:erlang.mk的deps、git依赖、hex依赖与缓存机制实战指南

Erlang依赖管理全攻略:erlang.mk的deps、git依赖、hex依赖与缓存机制实战指南 Erlang依赖管理全攻略erlang.mk的deps、git依赖、hex依赖与缓存机制实战指南【免费下载链接】erlang.mkA build tool for Erlang that just works.项目地址: https://gitcode.com/gh_mirrors/er/erlang.mkerlang.mk是一款开箱即用的 Erlang 构建工具也是 Erlang 生态中最流行的构建器之一。本文带你一次性掌握 erlang.mk 的依赖管理核心玩法如何用DEPS声明依赖、如何拉取git 依赖与hex 依赖、如何用CACHE_DEPS开启依赖缓存加速构建。无论是新手还是想给项目提速的老手读完这篇完整指南都能直接上手。一、为什么选择 erlang.mk 管理依赖Erlang.mk 的口号是 A build tool for Erlang that just works一个真正好用的 Erlang 构建工具。在依赖管理方面它的核心优势有一行代码声明依赖只需DEPS cowboymake会自动拉取、编译、并按正确顺序构建所有依赖内置包索引通过make search q关键词可搜索数百个常见 Erlang 项目自动转换AutopatchRebar 项目、纯 Erlang 项目都能被自动改造为 erlang.mk 项目无需手工处理⚡构建缓存编译过的依赖不会重复编译可选开启 Git/Hex 依赖缓存CI 场景提速明显二、快速开始安装与第一个依赖如果需要在本地获取 erlang.mk 源码克隆到项目根目录即可git clone https://gitcode.com/gh_mirrors/er/erlang.mk在项目根目录创建Makefile内容只需PROJECT my_app ERL_OPTS -I include DEPS cowboy include erlang.mk执行make后Cowboy 会被自动下载到deps/目录并编译完成之后make shell、make test等操作都自动包含该依赖无需任何额外配置。 提示包索引并非总是最新版本建议显式指定版本后文会讲。三、认识 DEPS 家族7 种依赖变量一次讲清Erlang.mk 用不同的 Makefile 变量区分依赖的用途这是依赖管理中最关键的一块变量用途示例DEPS运行时依赖会写入 app.srcDEPS cowboyBUILD_DEPS仅构建时使用如编译期工具、NIF 库BUILD_DEPS erlandoLOCAL_DEPS本地 OTP 应用或仓库内应用不下载LOCAL_DEPS cryptoTEST_DEPS仅测试时使用TEST_DEPS ct_helperDOC_DEPS仅构建文档时使用DOC_DEPS edownREL_DEPS打包 release 时需要REL_DEPS reconSHELL_DEPS仅make shell时可用SHELL_DEPS tddreloader此外还有两个实用变量IGNORE_DEPS彻底忽略某些依赖不下载、不编译例如系统已安装的应用OPTIONAL_DEPS声明可选依赖由顶层项目决定是否纳入依赖的默认存放位置由DEPS_DIR控制默认为deps/。如需修改请使用DEPS_DIR ? $(CURDIR)/libs这种弱赋值写法并保留$(CURDIR)前缀否则二级依赖会下载到错误目录。四、git 依赖实战拉取方式与版本锁定4.1 从包索引自动拉取默认只写DEPS cowboy时erlang.mk 会先查内置包索引自动决定仓库地址和版本。索引覆盖 Cowboy、Ranch、Gun、Cowlib 等常用项目对应源码见index/目录如index/cowboy.mk、index/relx.mk。4.2 显式指定 git 仓库需要用自己的 fork、或项目不在索引中时用dep_依赖名变量完整指定拉取方式 仓库 版本DEPS cowboy dep_cowboy git https://github.com/essen/cowboy 2.12.0其中第三个参数可以是任意tag、分支名或 commit例如master、v2.0.0或完整哈希。4.3 只锁定版本如果只想改版本号不想动仓库地址DEPS cowboy dep_cowboy_commit 2.12.04.4 其他拉取方式速查erlang.mk 支持的拉取方法fetch method相当齐全全部实现在 core/deps.mk 中方式格式说明gitgit 仓库 版本克隆并 checkout 指定版本git-subfoldergit 仓库 版本 子目录只取大仓库中的某个子目录git-submodulegit-submodule初始化 git 子模块需事先git submodule addhghg 仓库 版本克隆 Mercurial 仓库svnsvn 仓库地址检出 SVN 仓库cpcp 本地路径复制本机目录lnln 本地路径符号链接本机目录链接的依赖每次都会重新编译hexhex 版本 [包名]从 Hex 仓库下载详见下节还支持自定义拉取方式定义任何名为dep_fetch_方式名的变量即可只要最终在deps/依赖名/下生成目录内容。五、hex 依赖接入 Hex 包仓库对于发布在 Hex 仓库上的包例如 Hex 包名与 Erlang 应用名不一致的场景erlang.mk 提供了hex拉取方式DEPS uuid dep_uuid hex 1.7.5 uuid_erl含义是应用名为uuid从 Hex 下载版本1.7.5实际包名为uuid_erl只有包名与应用名不同才需要第三个参数。值得了解的一个细节当你的项目使用 hex 依赖时erlang.mk 会自动引入并编译hex_core作为底层下载器整个过程无需你手动配置。六、缓存机制让构建更快一步erlang.mk 内置了两层缓存分别解决不同场景的痛点。6.1 编译结果缓存默认开启依赖一旦编译成功ebin/下会生成dep_built标记文件之后执行make会自动跳过已编译的依赖——这是 erlang.mk 构建快的核心原因。想强制重新编译某个依赖有四种方式该依赖目录是符号链接ln方式天然每次都重编译直接进入依赖目录执行make使用make FULL1强制重编译全部依赖删除依赖下的ebin/dep_built文件进阶make FORCE_REBUILD依赖名只重编译指定依赖6.2 Git/Hex 依赖下载缓存CACHE_DEPS开启方式一行搞定CACHE_DEPS 1开启后实现见 core/deps.mkgit 依赖完整仓库先克隆到缓存目录默认~/.cache/erlang.mk/git/可用XDG_CACHE_HOME或CACHE_DIR变量修改deps/下只做一个轻量克隆再次拉取同一仓库的其他版本时直接走缓存速度大幅提升hex 依赖tarball 压缩包缓存在~/.cache/erlang.mk/hex/同一版本的包只下载一次清理缓存用make cacheclean会同时清掉 git 与 hex 缓存。这一特性对多版本切换、CI 流水线尤其有价值。6.3 Beam 编译缓存beam-cache较新版本引入的 beam-cache实现在 core/beam-cache.mk解决另一个问题在普通构建和测试构建之间来回切换时Erlang.mk 会把ebin/的编译产物暂存到.erlang.mk/beam-cache/下切换时直接换回避免重复编译进一步缩短开发-测试循环时间。七、依赖构建顺序与版本冲突规则依赖按先序遍历规则处理先拉取当前应用的全部依赖再依次递归构建。版本冲突的解决规则非常明确——先被拉取到的版本获胜项目 A 依赖 B、C而 B、C 都依赖不同版本的 D → B 要求的 D 版本获胜因为先处理 BA、B、C 都依赖不同版本的 D → A 指定的版本永远获胜理解这一点就能解释为什么我的依赖版本和我预期的不一样这类问题。只拉取不编译、排查依赖树也很方便make fetch-deps # 递归下载所有依赖不编译 make list-deps # 递归列出所有依赖路径 make query-deps # 输出依赖名、拉取方式、仓库、版本 make list-test-deps # 列出测试依赖 make query-deps QUERYname fetch_method repo version extra absolute_path这些命令由 core/deps-tools.mk 提供query-deps的输出字段可通过QUERY变量自定义。八、单仓库多应用Monorepo与 Autopatch8.1 apps/ 多应用目录如果你在一个仓库里维护多个应用只需创建apps/目录APPS_DIR可自定义每个子目录放一个应用并在各自 Makefile 中用LOCAL_DEPS声明本地依赖。Erlang.mk 会自动按正确顺序编译所有应用本地依赖与远程依赖重名时本地版本优先。还可以用make new-app inxxx/make new-lib inxxx快速生成应用骨架模板位于templates/目录。8.2 Autopatch 自动适配拉取依赖后 erlang.mk 会自动执行 AutopatchRebar 项目会被自动转换、erlang.mk 项目的 Makefile 会被统一指向顶层项目的 erlang.mk、没有 Makefile 的纯 Erlang 项目会自动生成构建脚本。不想让它动某些项目时用NO_AUTOPATCH cowboy ranch排除也可以扩展autopatch-依赖名::目标在拉取后打补丁或追加编译选项。九、离线场景与常用排错无网络环境make SKIP_DEPS1可跳过所有依赖下载与编译重复模块报错在deps::目标里加一行命令删除冲突的.erl文件即可升级 erlang.mk 后行为异常执行make distclean或手动删除.erlang.mk临时目录后重试十、关键文件索引延伸阅读依赖管理核心实现core/deps.mk依赖查询/列表命令core/deps-tools.mkBeam 编译缓存core/beam-cache.mk包索引Cowboy/Ranch/Gun 等index/官方依赖章节文档doc/src/guide/deps.asciidoc依赖相关测试用例test/core_deps.mk总结erlang.mk 的依赖管理可以浓缩为一句话用DEPS及同族变量声明、用dep_xxx精确控制来源与版本、用CACHE_DEPS加速重复拉取。掌握本文的 7 种依赖变量、9 种拉取方式和两层缓存机制后你就能从容应对绝大多数 Erlang 项目的依赖场景——这正是 just works 的含义所在。【免费下载链接】erlang.mkA build tool for Erlang that just works.项目地址: https://gitcode.com/gh_mirrors/er/erlang.mk创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表