ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

Leiningen 版本变更历史全解析:从 0.5.0 到 2.11.2 的功能演进与工程实践

2026/9/28 2:52:52 拓冰建站 浏览量
Leiningen 版本变更历史全解析:从 0.5.0 到 2.11.2 的功能演进与工程实践 构建工具CLI【免费下载链接】leiningenMoved to Codeberg; this is a temporary convenience mirror项目地址https://gitcode.com/gh_mirrors/le/leiningen点击查看免费下载本文以官方NEWS.md变更日志为骨架系统梳理 Clojure 构建工具 Leiningen 自 2009 年首发0.5.0到 2024 年 2 月2.11.2的全部用户可见变更逐版本解读核心功能、任务、配置项与关键 Bug 修复并结合当前仓库源码src/leiningen、leiningen-core/src/leiningen/core与test目录给出实现层面的佐证。读完本文你将获得一张完整的 Leiningen 能力地图既知道每个版本改了什么也知道这些机制在源码里如何落地可直接用于项目升级评估、project.clj配置决策与迁移排障。一、版本脉络总览两个大版本时代Leiningen 的变更历史可以清晰地划分为两个时代1.x 时代2009–2012从 1.0.0 的隔离类加载器与独立project.clj模型起步逐步引入 checkout 依赖、new任务、install/deploy/search/retest等核心任务以及在 1.6.0 时代奠定的 Maven 仓库~/.m2构建 classpath 的架构。2.x 时代2012 至今以 2012 年 3 月的2.0.0-preview1为分水岭leiningen-core被拆分为独立库、Pomegranate 取代 maven-ant-tasks、构建产物迁入target/、全面引入profiles配置档机制。2.0 正式版于 2013-01-19 发布此后直至 2024-02-13 的 2.11.2功能演进围绕 nREPL 集成、deps诊断、release/vcs自动化、uberjar 加固、XDG 规范支持等方向持续展开。当前仓库project.clj中标明的版本为2.11.3-SNAPSHOT即 NEWS.md 中 2.11.2 之后的开发中版本可作为历史尽头的参照点。二、1.x 时代从 0.5.0 到 1.7.1 的奠基与成型2.1 早期基础0.5.0 – 1.0.10.5.02009-11-17Leiningen 的首次发布。1.0.02009-12-05确立了现代 Leiningen 的基本骨架包括project.clj中可配置 source、test、compilation 路径隔离类加载器——项目代码可以在与 Leiningen 自身不同版本的 Clojure 下编译/测试新增new任务生成空项目install任务不再要求本机装有 Maven按 .class 与 .clj 时间戳判断是否重新 AOT 编译jar 内置pom.xml、pom.properties及更详细的 manifest并生成$PROJECT-standalone.jar新增resources/目录进入 classpath 与生成的 jar使用-Xbootclasspath加快启动。1.1.02010-02-16新增lein upgrade任务、exclusions依赖排除支持、原生依赖支持、Windows 实验性支持只有当确实需要时才下载 SNAPSHOT 版本。1.2.02010-07-18大量可用性改进——classpath命令、:aot别名、:jvm-opts与:warn-on-reflection、checkout 依赖Checkout Dependencies、密码保护仓库、:jar-name/:uberjar-name定制、test-resources 目录、为uberjar自动 clean、defproject中支持 unquote 等。1.3.02010-08-19新增:omit-source、交互式interactive任务、test!任务、~/.lein/init.clj启动脚本、~/.lein/plugins用户级插件、多任务命令行链式执行并将启动脚本切换为/bin/sh。1.4.02010-12-02合并了来自独立插件的run任务与javac任务新增:repl-options、uberjar-exclusions、测试选择器test selectors谓词、plugin任务eval-in-project引入 init 参数以应对著名的Gilardi Scenario。1.5.02011-03-22新增deploy任务按仓库粒度支持:update/:checksum策略全局:exclusions:min-lein-version使旧版 lein 用户得到明确警告。1.6.02011-06-29新增trampoline任务、retest任务、search任务、原生依赖支持classpath 直接基于~/.m2构造。1.7.02012-02-06允许任意任务执行 trampolineLEIN_JAVA_CMD/LEIN_JVM_OPTS与JVM_OPTS分离支持项目内:plugins64 位 JVM 上的分层编译tiered compilation加速启动。2.2 1.x 遗产与 2.0 的替代关系1.x 中引入的若干机制:dev-dependencies、plugin任务、:extra-classpath-dirs、隐式 AOT 等在 2.0 中被逐一替换或废除——project.clj中今日见到的:profiles、:middleware、:aliases、:eval-in等全部来自 2.0 重写。三、2.0.0 系列架构重写的里程碑2012–20133.1 从 preview1 到 preview10 的关键决策2.0.0-preview12012-03-07开启了代号式的架构改造多数决策沿用至今拆分leiningen-core为独立库核心逻辑可从主程序分离供插件与第三方复用对应仓库中的leiningen-core/src/leiningen/core/目录project.clj、classpath.clj、eval.clj、main.clj等。用 Pomegranate 库取代 maven-ant-tasks依赖解析直接面向 Aether API~/.m2成为本地仓库的默认来源。构建产物迁入target/source-paths/test-paths/resource-paths改为复数形式AOT、javac、uberjar 的输出集中管理profile 隔离的 target 目录在 2.3.0 中进一步细化。profiles 机制:dev、:user、:default、:provided、:offline、:base等内建 profile 建立:dev-dependencies被:devprofile 取代2.0.0 正式版中:userprofile 在项目外也可作为项目 map 使用。后续 preview 版本持续补全能力preview3offline profile、deps任务显示依赖树、连接 nrepl server、:connectHTTP nREPL 支持、:filespecs、$http_proxy支持。preview4-ooffline与-U强制更新快照命令行别名、pom.xml回到项目根目录、checkout 依赖不进入 production profile。preview5GPG 加密部署凭据、deploy 凭据提示、默认拒绝 checksum 不匹配的下载 jar。preview6环境变量仓库凭据、自定义 SSL:certificates、Clojars 证书默认内置。preview7lein deps :verify验证依赖签名、任务别名可遮蔽内建任务、:mirrors支持、do任务接管任务链式执行。preview8TERMdumb支持、nREPL handlers/middleware 可从项目配置读取、:prep-tasks可携带参数。preview9providedprofile 默认用于除 uberjar 外的所有场景、$LEIN_FAST_TRAMPOLINE缓存 trampoline 命令、HTTPS 代理、leinrc文件。preview10repl 默认监听127.0.0.1解决 IPv6 问题。3.2 2.0.0 正式版与 2.1–2.3 的增量2.0.02013-01-19接受:main作为run任务的-m别名修正 repl 的 reader 问题项目外运行体验完善。2.1.02013-03-19新增update-in任务对项目 map 任意位置做函数式修改、~/.lein/profiles.d支持、:eval-in :nrepl实验支持、系统级 profiles、deploy 凭据命令行传入、带 classifier 的 jar 构建、:mirrors用于 jar/uberjar、compile任务接受正则参数。其中update-in在仓库中由 update_in.clj 实现。2.1.2/2.1.3update-in支持顶层 key 与 profile别名可携带 docstringtrampolined repl 挂起修复。2.2.02013-05-28引入:uberjarprofile、:java-agents、profile 间 target 目录隔离、递归 checkout 依赖、部署 ad-hoc 文件。2.3.02013-08-08新增:clean-targets可清理额外目录、:eval-in :pprint、:compile-path/:native-path按 profile 作用域化、:pedantic支持在版本解析歧义时中止。2.3.3/2.3.4uberjar-merge-with支持写入.nrepl-port文件便于工具互操作deps相关告警建议:exclusionspom-plugins增强。仓库 project.clj 中defaultsmap约 220–253 行保留了这些 2.x 配置的现代形态例如:release-tasks ^:top-displace [[vcs assert-committed] [change version leiningen.release/bump-version release] [vcs commit] [vcs tag] [deploy] [change version leiningen.release/bump-version] [vcs commit] [vcs push]] :pedantic? ^:top-displace ranges :uberjar-exclusions [#(?i)^META-INF/[^/]*\.(SF|RSA|DSA)$ #^module-info.class$]这印证了 2.4.0 引入的release/vcs任务链、2.5.0 引入的 pedantic 默认策略以及 2.9.9 对module-info.class的排除都是沉淀在默认项目配置中的第一类公民。四、2.4–2.7发布自动化、管理依赖与 Windows 生态4.1 2.4.xrelease、vcs、change 三大自动化任务登场2.4.02014-06-09新增release任务自动化常见发布步骤、vcs任务版本控制自动化、change任务程序化改写project.clj别名可从项目 map 拼接值插件可覆盖内建任务deploy前自动clean避免库中残留 AOTLEIN_SILENT抑制*info*输出new支持--force作用于已存在目录。change任务在仓库 change.clj 中有完整实现其 docstring 给出了三种典型用法# 给当前版本追加 -SNAPSHOT 后缀 $ lein change version str -SNAPSHOT # 用 set 直接覆盖版本 $ lein change version set 1.0.0 # 修改 :dependencies 中某个依赖的版本 $ lein change :dependencies:org.clojure/clojure set 1.10.1实现上change不读取合并后的项目 map而是用net.cgrand.sjacket解析器直接操作磁盘上的project.clj文本change-string函数负责将字符串参数转成 Clojure 数据并走 zip 遍历改写以保留原文件的注释与排版。2.9.9 中允许change编辑依赖版本即对应find-dependency-version对:dependencies/:managed-dependencies向量的处理。2.4.1/2.4.3vcs commit不提交未跟踪文件mirrors可配置修复pom.properties暴露版本号LEIN_NO_USER_PROFILES跳过用户 profilevcs tag 支持前缀。4.2 2.5.xprofile 语义深化2.5.02014-09-14^:leakyprofile 可影响下游项目profile 可从插件加载leiningen.core.project/read负责初始化项目并合并默认 profiles。2.5.1–2.5.3lein clean清理所有 profile 的 targetprofile 合并保持声明顺序update-in可使用未 require 的函数多:replprofilelein retest记录失败测试信息lein release尊重 git 的退出码。javac错误打印到终端的修复与仓库 javac.clj 及对应测试test/leiningen/test/javac.clj的行为一致。4.3 2.6–2.7托管依赖与生态支撑2.6.02016-02-05模板、repl 与 Leiningen 自身升级到 Clojure 1.8放弃 Clojure 1.1 及更早版本支持。2.7.02016-08-24新增:managed-dependencies支持lein test前执行:prep-tasks以覆盖生成式测试命名空间Windows PowerShell 脚本:scm :dir尊重fixture 错误捕获私有仓库在 jar/uberjar/deploy 中保留。:managed-dependencies的引入与仓库中的测试项目一一对应test_projects/managed-deps/、test_projects/managed-deps-snapshot/并在test/leiningen/test/中有配套测试。2.7.1 进一步放宽托管依赖中版本不要求非nil且快照依赖可正常解析。五、2.8–2.9nREPL 升级、deps 诊断与安全加固5.1 2.8.xnREPL 0.5 切换与 Java 9 兼容2.8.0-RC1/2.8.02017-09/10deps新增:query快速查找最新版本、:why追踪单个依赖的来源、:plugin-tree/:tree-data子任务search任务改为直接调用在线 API 而非下载索引默认要求远程仓库走 TLS$CLASSPATH被设置时给出警告LEIN_USE_BOOTCLASSPATH支持vcs可自定义提交信息、可跳过签名 tag移除 clj-http 与 cheshire 依赖以降低冲突Java 9 兼容禁用字节码校验、跳过 bootclasspath。2.8.12017-10-27lein help在 Java 9 下列出内建任务包管理器安装的 lein 不再吞掉退出码。2.8.22018-12-11诊断信息统一走 stderrpprint新增--not-prettyjar 元数据加入项目坐标:pom-plugin自由配置。2.8.32018-12-14移除损坏的无人值守 GPG 部署特性repl使用:main作为初始命名空间。2.8.2 的切换 nREPL 0.5标记为Breaking官方建议遇到lein repl问题时参考升级说明。当前仓库 project.clj 依赖[nrepl 1.0.0]对应 2.10.0 的 nREPL 1.0.0 升级。5.2 2.9.x性能、病态依赖树与 XDG 规范2.9 系列密集修复了深层依赖树的栈溢出、无限循环、重复告警等问题并带来一批用户可感知的增强2.9.02019-02-10默认重新启用 bootclasspath 优化AOT 命名空间排序一致化插件与新模板项目使用 Clojure 1.10.0。2.9.22020-02-28self-install 过程增加 checksum 校验验证依赖时携带仓库认证pom.xml包含project.clj中的:repositories。2.9.42020-07-08测试选择器跳过非测试 vardeps :query结果修正nREPL 0.7REPL-y 支持 scheme 配置。2.9.62021-04-15模板查找适配 Clojars 新 group 规则非 nrepl 连接时不执行:reload。2.9.72021-09-15检测病态依赖树并告警Clojure 1.10.3对指向单一版本的版本范围不再告警部署失败时错误信息更清晰。2.9.82021-11-11修复深层依赖树栈溢出LEIN_JAR可被覆盖以支持自定义安装位置。2.9.92022-08-05仓库从 GitHub 迁往 Codebergnew模板 group-id 修复Java 9 模板列表兼容pedantic 无限循环修复uberjar 排除module-info.classrepl 支持通过:headless :socket PATH绑定文件系统 socket。2.9.102022-08-09dev-resources 不再泄漏进 jar/uberjarXML 解析避免非法反射访问。:pedantic的默认行为在 project.clj 中为(quote ^:top-displace ranges)即默认对版本范围给出警告pedantic.clj及其测试leiningen-core/test/leiningen/core/test/pedantic.clj承载冲突检测逻辑。六、2.10–2.11nREPL 1.0、SSH 签名与静态分析6.1 2.10.02022-12-09升级到nREPL 1.0.0与当前仓库project.clj的依赖一致:eval-in :leiningen不再吞掉测试退出码部署文件可使用SSH 密钥签名不再局限于 GPGuberjar 向 target 路径拼接 profile 的错误修复。6.2 2.11.x2023–20242.11.02024-01-27顶层:exclusions可影响顶层:dependencies:eval-in :nrepl的正在运行 repl 检测与崩溃修复jar 构建期间测试路径文件可见性修复check在依赖 AOT 的命名空间上的问题修复新增static-classpath任务面向静态分析病态依赖树处理性能大幅提升search 失败错误报告改进支持 XDG 配置目录且 self-install 优先使用$XDG_CACHE_HOME对有缺陷的 composite profile 给出警告。2.11.12024-01-28修复从控制台读取密码进行部署时的 Bug。2.11.22024-02-13新增:preserve-eval-meta配置以避免项目代码反射。6.3 源码佐证static-classpath 与 preserve-eval-metastatic-classpath任务static_classpath.clj的设计目标是不加载任何插件或项目代码的前提下输出 classpath因此可在不可信项目上安全运行。其实现要点unsafe-keys:plugins、:hooks、:middleware、:certificates、:mirrors、:local-repo、:implicits等在读取project.clj后被dissoc掉避免触发副作用只合并:base :system :provided :dev四个安全 profiledocstring 明确可能不如classpath精确但适合静态分析场景。对应测试 static_classpath.clj 验证了该任务可通过main/-main static-classpath直接调用。:preserve-eval-meta2.11.2 新增解决的是lein run场景下的反射警告问题默认情况下注入项目进程执行的代码会被去掉元数据包括类型提示因为部分插件会携带无法被 reader 读取的元数据对象如#object标签但在开启:global-vars {*warn-on-reflection* true}的项目中缺少类型提示会导致lein run打印反射警告。设置:preserve-eval-meta true后eval.clj 会以*print-meta*打印待求值代码见 246–250、335、366 行附近从而保留类型提示。测试test/leiningen/test/run.clj的test-preserve-eval-meta用例断言默认项目出现Reflection warning而preserve-eval-meta测试项目test_projects/preserve-eval-meta/不出现该警告。七、贯穿版本的关键机制速查机制引入版本核心作用当前实现位置profiles2.0.0-preview1按场景组合项目配置project.cljmerge-profiles等:eval-in2.0.0 系列控制项目代码执行方式:leiningen/:nrepl/:classloader等eval.clj:pedantic2.3.0 / 2.5.0依赖冲突检查策略pedantic.cljchange/update-in2.4.0 / 2.1.0程序化改写project.cljchange.clj、update_in.cljrelease/vcs2.4.0发布流程与版本控制自动化release.clj、vcs.clj:managed-dependencies2.7.0BOM 式托管依赖test_projects/managed-deps/等测试项目deps :query/:why2.8.0依赖版本查询与来源追踪deps.cljstatic-classpath2.11.0不加载代码的安全 classpath 输出static_classpath.clj:preserve-eval-meta2.11.2保留注入代码的元数据避免反射eval.clj八、实践建议从变更历史反推升级与配置决策升级评估2.8.2 的 nREPL 0.5 是 2.x 时代唯一的明确 Breaking 变更若长期停留在 2.7.x应先核对lein repl相关插件兼容性参见 PLUGINS.md 与 FAQ.md。2.9.9 起仓库迁移至 Codeberg域名类外部链接请以官方仓库为准。依赖诊断优先用deps :why遇到多余依赖或版本冲突lein deps :why group/artifact可快速定位来源替代手工翻 POM。静态分析场景在不可信或 CI 沙箱中获取 classpath优先lein static-classpath而非lein classpath前者不加载插件与项目代码源码证据见 static_classpath.clj 的unsafe-keys与 docstring。反射警告治理若项目开启全局*warn-on-reflection*且lein run出现cant be resolved类反射警告可设置:preserve-eval-meta true但需注意这会破坏携带不可读元数据的插件的兼容性这正是 2.11.2 之前默认不保留元数据的原因测试注释见 run.clj。发布自动化lein release默认任务链vcs assert-committed→ 版本 bump → 提交 → tag → deploy → 再 bump → 提交 → push可直接在project.clj中通过:release-tasks定制模板见 project.clj 的defaults。XDG 环境2.11.0 起 Leiningen 支持 XDG 配置目录self-install 会优先使用$XDG_CACHE_HOME符合 freedesktop 规范的环境无需再手工迁移~/.lein与~/.m2。九、结论从 2009 年的 0.5.0 到 2024 年的 2.11.2Leiningen 的每一步变更都沉淀在NEWS.md的条目中并在当前仓库的源码与测试里留有可验证的实现痕迹。这张版本地图既是升级迁移的路线图也是理解project.clj各配置项由来的索引profiles、:pedantic、:managed-dependencies、deps :why、static-classpath、:preserve-eval-meta……每个键与任务背后都有一段可追溯的功能演进史。如需完整条目请直接查阅仓库根目录下的 NEWS.md配置细节可对照 sample.project.clj 与 TUTORIAL.md。赞分享构建工具CLI【免费下载链接】leiningenMoved to Codeberg; this is a temporary convenience mirror项目地址https://gitcode.com/gh_mirrors/le/leiningen点击查看免费下载相关推荐终极Alacritty变更日志从0.2.0到0.17.0-dev的完整功能演进史终极Alacritty变更日志从0.2.0到0.17.0 dev的完整功能演进史 Alacritty作为一款跨平台的OpenGL终端模拟器自发布以来不断迭代桌面应用nbnhhsh版本更新历史从0.1到0.15的功能演进nbnhhsh版本更新历史从0.1到0.15的功能演进 nbnhhsh拼音首字母缩写翻译工具作为一款解决网络交流障碍的实用工具从最初的简单脚本发展到如今功工具ThreadlessInject实战案例红队视角下的隐蔽进程注入ThreadlessInject实战案例红队视角下的隐蔽进程注入 在红队攻防演练中 进程注入技术 是攻击者工具箱中的关键武器之一。ThreadlessInj上一篇Awesome-CV会议演讲视频链接增强经历可信度下一篇从共振峰合成到多语言支持深度解析eSpeak NG的架构设计与实战应用创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考