AsciidoctorJ 1.6.0 发布,终于来了!
作者 , 和 -
经过数年的酝酿(或者说是桶陈?),我们终于发布了 AsciidoctorJ 1.6.0!相关构件可从 Bintray 和 Maven Central 获取。
在升级之前,您需要了解一些重要的事情,本文将对此进行介绍。虽然 AsciidoctorJ 仍然建立在强大的 Asciidoctor RubyGem 的基础上,但它已经发展成为一个独立的を有份的项目。此次发布为新老用户带来了稳定性和关键增强。请举杯,我们将为您带来所有细节。
迈向 SemVer 的重要里程碑
尽管版本号如此,这次发布应被视为一次重大发布。因此,它与 1.5.x 系列的发布不兼容。
AsciidoctorJ 1.6.0 是为了准备切换到语义化版本控制 (SemVer) 而进行的最后一次过渡性发布。我们将最后一次打破规则,但有充分的理由。考虑到 1.6.0 分支已经桶陈了很长时间,我们希望允许其被启用以收集反馈,并挖掘出意外的惊喜,然后再跳到 2.0.0 和 SemVer。如果一切顺利,我们预计 2.0.0 版本将在该版本之后不久发布。届时,我们将开始按照 SemVer 规则对 AsciidoctorJ 进行版本控制。
要了解更多关于 SemVer 以及它如何影响 Asciidoctor 项目的总体情况,请参阅 切换到语义化版本控制。
切换到 SemVer 也意味着 AsciidoctorJ 将独立于 Asciidoctor 进行版本控制。AsciidoctorJ 已经发展成为不仅仅是为 JVM 打包的 Asciidoctor RubyGem。它拥有完整的 API,包括基于 Java 的扩展以及与 Java 生态系统的紧密集成(例如,JUL、Ruby 对象桥接等)。其独立的版本线将允许它更快地发展,并帮助大家更好地理解每个版本将带来什么。最重要的是,它将解决导致 1.6.0 版本积压多年的情况。
新功能
- 主要的 API 和打包更改
-
自 AsciidoctorJ 诞生以来,我们对 JRuby 以及它如何桥接 Ruby 和 Java 对象有了很多了解。利用这些知识,我们彻底重新设计了底层集成,以解决原始设计中的不足。
这种重新设计需要我们对 API 进行破坏性更改,这对于 AsciidoctorJ 的持续发展是绝对必要的。但这同时也为我们提供了修复众多 Bug 的机会,而这些 Bug 在 1.5.x 系列中无法在不破坏兼容性的情况下修复。您会很高兴地得知,重新设计消除了在编写扩展或使用 1.5.x 版本导航文档模型时可能遇到的故障。
- 重构的扩展 API
-
得益于重新设计,基于 JRuby 的实现被更好地隐藏在 API 之后。特别是,API 中不再有 JRuby 的 RubyObject 类的引用。
抽象语法树 (AST) 的接口已完全重命名,以更好地表示其目的。例如,AbstractNode 接口已重命名为 ContentNode,AbstractBlock 已重命名为 StructuralNode,Inline 已重命名为 PhraseNode。Java 中映射了更多的 AST,包括列表和定义列表,以及用于在扩展处理器中创建表结构的辅助工具。
总的来说,扩展和 AST 的 API 应该感觉像是一个纯粹的 Java 库(例如,
getAttr()现在是getAttribute())。您甚至可以使用基于注释的配置(例如,@Name)来定义扩展处理器。请查阅 集成器指南,了解所有相关信息并找到许多示例。
- 添加了转换器 API
-
引入了一个新的转换器 API,使得完全用 Java 实现自定义输出格式的转换器成为可能。此 API 允许您从 Java 扩展 Asciidoctor,类似于您已经通过扩展 API 所能做到的。您可以按照 转换器文档 来了解如何使用这个新 API。
事实上,已经有一个转换器使用此 API 从 Groovy 将 AsciiDoc 转换为 Leanpub 风格的 Markdown。
- 访问 Asciidoctor 的日志
-
当 Asciidoctor 在文档中遇到问题时,它会将错误和警告消息记录到 Ruby 日志记录器。将 Asciidoctor 集成到您自己的软件中时,捕获这些日志消息以便妥善处理非常重要。以前,这些消息是 AsciidoctorJ 无法触及的。现在情况已不再如此。新的 日志处理 API 会捕获 Asciidoctor 中记录的消息,并将它们路由到您自己的日志处理程序。
- 更好的文档
-
AsciidoctorJ 1.6.0 提供了扩展和经过测试的 文档,用于编写扩展和转换器。这些文档保证是正确的,因为它们会与每次提交一起测试 ;) 并且正在将文档整合到 Asciidoctor 的新 Antora 文档站点中。
有关此版本中发生的更改的更详细说明,请参阅 发布说明。请记住,由于 1.6.0 的开发与 1.5.x 并行了很长时间,因此 1.6.0 中的许多更改可能对您来说已经很熟悉了,因为它们已被反向移植到 1.5.x 发布系列中。
迁移说明
如果您只使用 Asciidoctor、Asciidoctor.Factory 和 *Builder 类(例如,Asciidoctor#convertFile),您可能无需更改代码。事实上,Asciidoctor Maven Plugin 和 Asciidoctor Gradle Plugin 已经支持此版本,主要是因为它们只依赖于公共的加载/转换 API。
AST 和扩展 API 的必要更改确实引入了破坏性更改,需要修改您现有的扩展。迁移扩展主要是为了符合新的 API。这主要包括切换 AST 接口的新名称,并与更新的方法签名保持一致。除了名称和签名更改之外,API 仍然应该是可识别的,因此与您现有的逻辑兼容。
以下是为 AsciidoctorJ 1.5.8 和 1.6.0 编写的几个扩展示例,以让您了解需要注意的更改类型:
如果您在迁移扩展或文档内省代码时遇到困难,请在 问题跟踪器 中提交问题,以便我们找到前进的道路。
Java 兼容性
Asciidoctor 1.6.0 最低需要 Java 8。它也能在 Java 11 上运行,并且已针对 Java 11 进行测试。
从 AsciidoctorJ 1.6.0 开始,该项目将遵循 Oracle 官方 Java SE 支持路线图 来确定其 Java 兼容性。虽然 AsciidoctorJ 不需要 Oracle Java SE,但该路线图可以作为判断哪些 Java 版本被认为是当前的有用参考。
Asciidoctor 1.6.0 尚不支持在模块路径上运行,这是 Java 9 中引入的 Java 平台模块系统 的一个关键特性。我们希望在即将发布的版本中实现这一点。然而,这将取决于 AsciidoctorJ 的依赖项(最重要的是 JRuby)在这方面的进展。尽管有此限制,您仍然可以在 Java 11 上运行 Asciidoctor 1.6.0。
致谢
我们想借此机会表彰几位关键人物,他们共同促成了这次发布的成功。
-
Jérémie Bresson,他发起将 API 和实现类分离,并现代化了 API 签名。
-
Abel Romero,他协助设计了 JUL 日志集成,并首先在 Maven 插件中进行了测试。
-
Frank Becker,他彻底改进和简化了 Gradle 构建。
-
Guillaume Grossetie,他对 API 和实现进行了大量清理和改进,并通过启动 AsciidoctorG 对重新设计进行了压力测试。
-
Charles Nutter、Thomas Enebo 以及 JRuby 团队,他们创建和维护了 AsciidoctorJ 所基于的 JRuby。
-
最后,我们的“前辈” Alex Soto,他启动了 AsciidoctorJ 项目,并向我们展示了其潜在的可能性。
当然,还有许多其他人值得感谢。正如我们多次说过的,没有 众多志愿者 的辛勤工作和协作,这个项目是不可能实现的。所以,谢谢您!
2.0.0 的展望
破坏性更改尚未结束。在走向 2.0.0 的过程中,我们希望进一步拆分 AsciidoctorJ 的 API 和其实现。我们的主要目标是支持底层的替代实现,例如 Asciidoctor.js,使用相同的公共 API。
为了帮助我们达到 2.0.0,我们恳请您测试 1.6.0 版本,并告知我们您是否遇到任何问题或更改,这些更改妨碍您迁移到它。现在是时候在 2.0.0 版本发布之前将其做好。请在 问题跟踪器 中报告您发现的所有问题。
感谢您陪伴我们一起将 AsciiDoc 的精华带到 JVM。