ARTICLE DETAIL

资讯详情

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

Leiningen 插件工程中的 CHANGELOG:`lein new plugin` 模板的变更日志规范与实战

Leiningen 插件工程中的 CHANGELOG:`lein new plugin` 模板的变更日志规范与实战 构建工具CLI【免费下载链接】leiningenMoved to Codeberg; this is a temporary convenience mirror项目地址https://gitcode.com/gh_mirrors/le/leiningen点击查看免费下载resources/leiningen/new/plugin/CHANGELOG.md是 Leiningen 内建plugin项目模板随工程一起生成的一份变更日志模板。它遵循 Keep a Changelog 的约定组织版本与变更类别并通过 Mustache 占位符与渲染数据联动在lein new plugin创建插件工程时自动生成。阅读本文后你将理解这份模板的结构、占位符的填充机制以及如何在开发自己的 Leiningen 插件时正确维护变更日志。这份 CHANGELOG 从哪来lein new plugin的模板生成链路在 Leiningen 中lein new plugin project-name会调用src/leiningen/new/plugin.clj中的plugin函数生成一个插件工程的完整骨架(defn plugin A leiningen plugin project template. [^String name] (let [render (renderer plugin) unprefixed (if (.startsWith name lein-) (subs name 5) name) data {:name name :unprefixed-name unprefixed :sanitized (sanitize unprefixed) :year (year) :date (date)}] (main/info (str Generating a fresh Leiningen plugin called name .)) (-files data [project.clj (render project.clj data)] [README.md (render README.md data)] [.gitignore (render gitignore data)] [.hgignore (render hgignore data)] [src/leiningen/{{sanitized}}.clj (render name.clj data)] [LICENSE (render LICENSE data)] [CHANGELOG.md (render CHANGELOG.md data)])))从源码可见plugin模板一共生成 7 个文件project.clj、README.md、.gitignore、.hgignore、主源码文件src/leiningen/{{sanitized}}.clj、LICENSE以及本文的主角CHANGELOG.md。所有模板资源都存放在resources/leiningen/new/plugin/目录下与源码一一对应。模板渲染使用src/leiningen/new/templates.clj提供的renderer与-files机制renderer是一个高阶函数按leiningen/new/template/file的约定从 classpath 上定位 Mustache 模板文件并用 Stencil 渲染-files则是生成文件的迷你 DSL会自动创建父目录并把路径本身也当作 Mustache 模板处理因此{{sanitized}}能出现在文件路径中。模板源码逐段解读Keep a Changelog 约定的落地resources/leiningen/new/plugin/CHANGELOG.md全文如下模板原样含占位符# Change Log All notable changes to this project will be documented in this file. This change log follows the conventions of keepachangelog.com. ## [Unreleased] ### Changed - Add a new arity to make-widget-async to provide a different widget shape. ## [0.1.1] - {{date}} ### Changed - Documentation on how to make the widgets. ### Removed - make-widget-sync - were all async, all the time. ### Fixed - Fixed widget maker to keep working when daylight savings switches over. ## 0.1.0 - {{date}} ### Added - Files from the new template. - Widget maker public API - make-widget-sync. [Unreleased]: https://sourcehost.site/your-name/{{name}}/compare/0.1.1...HEAD [0.1.1]: https://sourcehost.site/your-name/{{name}}/compare/0.1.0...0.1.1这份模板把 Keep a Changelog 的核心约定直接固化成了可编辑的骨架值得注意的要点有文件头# Change Log标题以及All notable changes to this project will be documented in this file这一声明提示作者只记录值得记录的、对使用者可见的变更。## [Unreleased]区块作为当前开发版本的累积区所有新变更先记录在这里发布时才下沉到正式版本小节。版本小节[0.1.1] - {{date}}、0.1.0 - {{date}}采用版本号 发布日期的格式{{date}}是 Mustache 占位符由生成时机的当前日期填充见下一节。第一个版本小节不加链接锚点后续版本才加方括号以配合底部链接定义。变更类别模板展示了 Keep a Changelog 中按类型分组的组织方式——Added新增、Changed变更、Removed移除、Fixed修复。其中make-widget-sync被移除、make-widget-async新增 arity 的示例恰好演示了全异步化这一典型重构如何记录。底部链接定义[Unreleased]与[0.1.1]指向compare/...形式的版本对比地址占位符{{name}}会被替换为真实工程名。[Unreleased]对比0.1.1...HEAD[0.1.1]对比0.1.0...0.1.1这符合语义化版本发布时的常见 diff 路径。Mustache 占位符如何被填充渲染数据与时间函数模板中的{{date}}、{{name}}由plugin函数传入的data映射填充。data中的:name就是用户在命令行输入的工程名:unprefixed-name则按 Leiningen 插件的命名惯例把lein-前缀剥掉——例如输入lein new plugin lein-foounprefixed就是foo它决定了后续命令名与命名空间的形态。:date与:year由src/leiningen/new/templates.clj中的工具函数实时生成(defn year Get the current year. Useful for setting copyright years and such. [] (.get (Calendar/getInstance) Calendar/YEAR)) (defn date Get the current date as a string in ISO8601 format. [] (let [df (java.text.SimpleDateFormat. yyyy-MM-dd)] (.format df (java.util.Date.))))即{{date}}会被替换为运行lein new plugin当天的yyyy-MM-dd格式日期如2026-09-28{{year}}则用于README.md与LICENSE中的版权年份。这也解释了模板中的版本小节为什么写成## [0.1.1] - {{date}}——初次生成时自动带上发布日期之后维护者按需修改。此外模板文件的换行符在渲染时会统一处理templates.clj的fix-line-separators会把模板内的\n替换为系统行分隔符除非设置了环境变量LEIN_NEW_UNIX_NEWLINES强制使用 Unix 换行对应行为在test/leiningen/test/new/templates.clj的line-separators测试中有覆盖。配套模板文件一个完整插件工程如何协同CHANGELOG 不是孤立文件它与插件模板的其他产物共同构成可运行的工程骨架。以下四个文件与本文主题直接相关resources/leiningen/new/plugin/project.clj生成的工程配置关键点是:eval-in-leiningen true——插件代码在 Leiningen 进程内执行这是插件与普通应用工程的本质区别许可为EPL-2.0 OR GPL-2.0-or-later WITH Classpath-exception-2.0。resources/leiningen/new/plugin/name.clj生成的主源码文件命名空间为leiningen.{{unprefixed-name}}任务函数签名[project args]——第一个参数project是插件运行时的工程 map这也是 Leiningen 任务的标准形态。resources/leiningen/new/plugin/README.md提供插件安装与使用的两种典型场景——用户级插件放进:userprofile 的:plugins向量工程级插件放进project.clj的:plugins向量。resources/leiningen/new/plugin/gitignore忽略target、classes、pom.xml、*.jar、.nrepl-port等构建产物与.hgignore配套覆盖 Git 与 Mercurial 两种 VCS。完整调用关系是lein new plugin经由src/leiningen/new.clj的new任务解析参数并解析模板命名空间最终落到leiningen.new.plugin/plugin这一入口函数。new任务还支持--to-dir、--force、--snapshot、--template-version等选项以及用lein new :show plugin查看模板文档。实战如何维护插件工程的 CHANGELOG生成插件工程后把CHANGELOG.md当作工程的一部分持续维护推荐做法如下开发期间写入[Unreleased]每次提交值得注意的变更新增 API、破坏性修改、bug 修复立即在[Unreleased]下按类别补充条目避免发布前突击回忆。发布时下沉版本例如发布0.1.1时把[Unreleased]的内容移到## [0.1.1] - 发布日期下把{{date}}替换为真实日期并新建空的[Unreleased]区块供下一轮开发使用。保持类别一致沿用模板已有的Added、Changed、Removed、Fixed分组Keep a Changelog 还允许Deprecated弃用与Security安全等类别可按需增补。更新底部对比链接发布新版本后补上[0.1.1]等引用链接定义compare/0.1.0...0.1.1形式并让[Unreleased]指向最新版本与HEAD的对比把占位符{{name}}替换为真实工程名如my-pluginsourcehost.site/your-name/换成实际的代码托管地址。遵守版本号语义模板从0.1.0起步后续按语义化版本规则递增示例中make-widget-sync被移除属于破坏性变更按惯例应在主版本号或次版本号上体现而全异步化正是这类变更的典型触发场景。模板机制的源码验证test/leiningen/test/new/templates.clj中的测试从侧面验证了这套模板机制renderers测试断言当模板资源缺失时渲染器会以Template resource leiningen/new/my_template/boom not found.的形式中止——这保证了plugin模板引用的CHANGELOG.md等资源必须真实存在于 classpath缺失即失败而非静默生成空文件。files测试断言-files支持:executable true选项把生成文件标记为可执行可用于生成脚本类模板。line-separators测试断言模板输出会按平台规范统一换行保证生成的CHANGELOG.md在 Windows 与 Unix 环境下行为一致。相关阅读模板生成入口src/leiningen/new/plugin.clj、src/leiningen/new.clj模板渲染基础设施src/leiningen/new/templates.clj同目录的其他模板资源resources/leiningen/new/plugin/含project.clj、README.md、name.clj、gitignore、hgignore、LICENSE模板机制测试test/leiningen/test/new/templates.clj编写自定义模板的完整指南doc/TEMPLATES.md赞分享构建工具CLI【免费下载链接】leiningenMoved to Codeberg; this is a temporary convenience mirror项目地址https://gitcode.com/gh_mirrors/le/leiningen点击查看免费下载相关推荐Leiningen 项目变更日志实战解读 lein new app 生成的 CHANGELOG.md 模板与 keepachangelog 规范Leiningen 项目变更日志实战解读 lein new app 生成的 CHANGELOG.md 模板与 keepachangelog 规范 本文以 Le构建工具CLILeiningen lein new template 生成的 CHANGELOG.md 模板Keep a Changelog 规范与 Mustache 变量注入机制Leiningen lein new template 生成的 CHANGELOG.md 模板Keep a Changelog 规范与 Mustache 变量构建工具CLILeiningen 插件开发实战从 lein new plugin 模板骨架到可安装发布的完整指南Leiningen 插件开发实战从 lein new plugin 模板骨架到可安装发布的完整指南 lein new plugin 是 Leiningen 内构建工具CLI上一篇告别双系统Darling与Wine终极对决跨平台兼容层技术选型指南下一篇终极Dio并发请求优化指南如何控制最大并发数提升性能创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表