- 后端
- Web框架
【免费下载链接】playframework
The Community Maintained High Velocity Web Framework For Java and Scala.
本文是 Play Framework 仓库中documentation子项目(文档工程)的完整技术指南,核心讲解该文档项目如何脱离主构建独立运行、如何通过@label与//#label扩展语法将仓库中的真实源码片段嵌入 Markdown 文档,以及如何完成测试、链接校验、打包发布和本地预览。读完本文,你将掌握 Play Framework 官方文档的编写规范、构建流水线(sbt 命令级)与底层实现位置,能够直接复现sbt run本地文档服务器、validateDocs链接校验等关键操作。
文档项目为什么独立于主构建
Play Framework 的documentation目录(即 documentation/)并不是主 sbt 聚合构建的一部分,而是一个使用自己 sbt 配置的独立文档工程。这一点在文档工程的 README.md 开头即有明确说明:整个 Play 的构建与贡献流程请参见主仓库 README.md;如果是从零开始体验 Play,官方推荐先从 starter 项目入手。
该独立工程的实际配置体现在以下文件中:
- documentation/project/plugins.sbt:文档工程的插件声明,核心是
playDocsPlugin(ProjectRef(Path.fileProperty("user.dir").getParentFile, "Play-Docs-Sbt-Plugin")),即文档渲染引擎 play-doc 的 sbt 插件;同时引入sbt-header、sbt-scalafmt、sbt-java-formatter用于代码示例的格式与 License 头检查,sbt-eclipse用于 IDE 工程生成,sbt-twirl用于教程页面模板,sbt-assembly用于生产部署文档的示例。 - documentation/common.sbt:定义
formatCode与validateCode两个命令别名,前者依次执行headerCreateAll、scalafmtSbt、scalafmtAll、javafmtAll,后者执行对应的headerCheckAll、scalafmtSbtCheck、scalafmtCheckAll、javafmtCheckAll,保证文档内嵌代码示例的格式与仓库主体代码保持一致。 - documentation/manual/index.toc:文档目录树(TOC)的声明文件,以
Home:Home、gettingStarted:Getting started这样的键:显示名形式组织,覆盖从 "Getting started" 到 "Working with Play"、"Contributing to Play" 的完整导航结构。
这种"文档独立成工程"的设计,使得文档编写者无需等待整个 Play 框架编译完成即可快速迭代文档内容,也避免了文档依赖污染主项目的类路径。
Markdown 扩展语法:如何把真实源码嵌进文档
文档正文全部位于 documentation/manual/ 目录,采用 Markdown 格式,但扩展了一种关键语法:代码片段引用。
引用指令@label
形如:
@label其中路径是相对于当前 Markdown 文档所在目录的。以文档 documentation/manual/gettingStarted/IDE.md 中的实际用法为例:
@[add-sbt-eclipse-plugin](https://link.gitcode.com/i/6dbc6754caf52c1faad334bc9818f479)它指向同目录下code/ide.sbt文件(即 documentation/manual/gettingStarted/code/ide.sbt)。同理,documentation/manual/hacking/Translations.md 中以@label的形式演示了该语法的通用写法。
片段标记//#label
被引用的源码文件中,用"井号 + 标签"的注释标记出可复用的代码区间:
//#label println("Hello world") //#labelREADME 给出的真实示例来自main/pekko/JavaPekko.md:文档中写@[actor-for](https://link.gitcode.com/i/433714ffb0e8e1a0bfb31d41381e518d),对应源码文件里用//#actor-for与//#actor-for包裹的ActorRef创建代码。生成文档时,play-doc 会精确抽取该区间并替换到文档引用处。这一机制在 documentation/manual/hacking/Documentation.md 与 documentation/manual/releases/release24/migration24/code24/MyComponent.java 等文件中有大量实际使用(后者即用//#components-decl标记注入式组件声明片段)。
为什么这样做而非直接贴代码?核心收益有三:
- 单一事实来源:示例代码与真实源码同处一库,框架 API 演进时,文档示例与实现同步更新,避免复制粘贴导致的双份维护;
- 可编译可测试:所有被引用的代码区间都来自真实工程目录,天然处于可编译、可运行的状态;
- 精准裁剪:
//#label允许只展示与当前讲解点相关的若干行,而不是整文件。
语法扩展的底层实现
该扩展语法由依赖项目 play-doc,其中Playdoc.scala等文件提供了playdocPackage等自动化导入项;文档工程的 project/plugins.sbt 通过ProjectRef直接引用该插件工程,从而在sbt交互中暴露文档解析与打包任务。
代码示例的管理规范:code目录与命名空间
README 对文档中的代码示例提出了明确的工程约束:
- 目录约定:
manual下任何名为code的目录(如 documentation/manual/gettingStarted/code/、documentation/manual/tutorial/code/)都被视为测试目录的根。里面可以放置配置文件、Java 文件或 Scala 文件。源码文件不强制要求属于某个测试套件,但强烈建议让所有被引用的代码片段可编译,并通过一些内部检查(格式检查、License 头检查即由common.sbt的validateCode承担)。 - 命名空间约束:所有文档代码示例必须充分命名空间化。例如:不应创建名为
controllers.Application的类,也不应创建名为routes的路由文件;应使用类似javaguide.async.routes这样带前缀的命名,避免多个文档示例之间、文档示例与用户项目之间发生类名/资源名冲突。
这一约束在 documentation/manual/gettingStarted/code/(如PlayConsole.scala、anatomy.sbt、ide.sbt)和 documentation/manual/tutorial/code/ 等目录中得到了贯彻——所有示例均按javaguide/scalaguide等前缀组织。
依赖与 IDE 集成
唯一的外部依赖:play-doc
文档工程的核心渲染依赖是 play-doc。README 明确指出:文档格式的调整、include 机制的修改都应该在 play-doc 项目中完成,而不是在本仓库的文档工程里。也就是说,文档工程只负责"内容",play-doc 负责"格式与渲染"。
IDE 集成
官方没有提供开箱即用的 IDE 插件,但给出了两条被验证的路径:
- IntelliJ IDEA:使用官方的 Scala 插件生成/导入工程;再配合 JetBrains 的 Markdown 插件(Markdown Support)可获得 Markdown 编辑、预览与快捷操作,极大降低文档编辑成本。
- Eclipse:通过 sbt-eclipse 插件从 sbt 生成 Eclipse 工程。该插件已被预置在文档工程的 project/plugins.sbt 中(
sbt-eclipse6.3.0-M1),因此在documentation目录下直接执行eclipse命令即可生成工程文件。
测试:编译并运行文档测试套件
文档工程自身的质量由一套 sbt 任务保障,分为两个阶段:
第一步:发布最新 Play 快照到本地仓库
运行测试前,需要先把最新快照版本的 Play 库发布到本地 Ivy/Maven 仓库:
(cd .. && sbt publishLocal)该命令在仓库根目录执行sbt publishLocal,让文档工程能解析到与当前源码同步的 Play 依赖快照,避免测试引用到旧版发布的构件。
第二步:运行文档测试套件
sbt > test文档测试不仅验证解析器行为,还会尽力确保所有被引用的代码片段可以编译并通过内部检查(对应 README 中 "Source files do not have to be part of a test suite, but it is highly encouraged..." 的约定)。测试用例的编写可参考文档工程 documentation/src/ 与文档源码中的code目录结构。
链接校验:validateDocs 与 validateExternalLinks
文档质量的两类链接校验任务:
sbt > validateDocsvalidateDocs校验文档内部链接的完整性——包括 Markdown 文件之间的相对链接、@label代码引用路径是否存在、TOC 声明是否与实际文件对应,防止重构后出现 404。
sbt > validateExternalLinksvalidateExternalLinks则校验外部链接的可用性(如指向官方文档站点、第三方库 Javadoc 的链接是否仍然可达)。这两个任务与 documentation/manual/index.toc 的导航声明、各文档内部的相对链接共同构成了文档可导航性的保障体系。
打包:文档如何随框架一起分发
README 指出:文档工程自身不做 HTML 的独立打包;真正随框架分发的是主工程中的/project/Docssbt 文件——即本仓库的 project/Docs.scala。该文件展示了文档资源进入最终二进制 JAR 的完整映射逻辑:
docBase = baseDirectory / "../../documentation",将manual/**与style/**全部资源映射为play/docs/content/前缀路径;- API 文档(Scaladoc/Javadoc)产物映射为
play/docs/content/api,由apiDocs任务通过genApiScaladocs/genApiJavadocs生成(Scala 2.13 用-doc-source-url关联源码链接,Scala 3 基于 TASTy 生成并使用-external-mappings与-source-links); - WebJar 资源映射为
play/docs/content/webjars/<version>/; - 各 Play 子项目的
reference.conf、.xml、.default配置文件被统一收集,映射为play/docs/content/confs/<projectName>/<confName>,便于文档读者直接查阅真实默认配置; - 另有
checkApiDocsPackageTree任务校验生成的 API 文档只暴露controllers、play、views三个顶层包,防止内部/第三方包混入公开发布文档。
在主工程执行:
cd $PLAY_HOME sbt compile doc package即可在常规构建中一并完成编译、Scaladoc/Javadoc 生成与文档打包(其中$PLAY_HOME即仓库根目录)。
本地运行:不打包直接预览文档
文档工程支持内置的文档服务器,无需先打包整个框架即可快速预览:
cd documentation sbt run启动后访问 http://localhost:9000 即可浏览渲染后的完整文档。这一工作流对文档作者最友好:编辑manual下的 Markdown,刷新浏览器即可看到渲染结果(包括@[label]抽取的代码片段效果),完全不需要经过主构建。
小结:从编写到发布的完整链路
综合 README 与仓库源码,Play Framework 文档的完整生命周期可概括为:
- 编写:在
documentation/manual下按index.toc组织章节,使用@label+//#label引用code目录中的真实示例代码,并遵守命名空间规范; - 校验:
validateDocs检查内部链接,validateExternalLinks检查外部链接,test编译并运行测试; - 预览:
cd documentation && sbt run在 localhost:9000 快速查看渲染结果; - 打包:主工程 project/Docs.scala 将
manual、style、API 文档、WebJar 与各项目reference.conf一并映射进发布 JAR,最终随 Play Framework 分发给用户。
对希望为 Play 贡献文档的开发者而言,掌握本文所述的目录结构、代码片段语法与 sbt 命令,即可无缝加入官方文档的维护流程。
- 后端
- Web框架
【免费下载链接】playframework
The Community Maintained High Velocity Web Framework For Java and Scala.
相关推荐
Testcontainers for Java 文档贡献指南:基于 MkDocs 的站点架构、本地预览与 codeinclude 代码片段机制
Testcontainers for Java 文档贡献指南:基于 MkDocs 的站点架构、本地预览与 codeinclude 代码片段机制 本指南面向希望为
测试容器运行时Tandoor Recipes 文档贡献指南:基于 MkDocs 的文档构建、本地预览与贡献流程
Tandoor Recipes 文档贡献指南:基于 MkDocs 的文档构建、本地预览与贡献流程 Tandoor Recipes(食谱管理应用)的全部用户文档由
后端前端AI 应用Gas Town 贡献指南:Fork 路由 rig 配置、ZFC 设计哲学与集成测试守卫实战
Gas Town 贡献指南:Fork 路由 rig 配置、ZFC 设计哲学与集成测试守卫实战 本文基于 Gas Town 仓库的 CONTRIBUTING.md
后端Web框架
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考