我在 SBT 中构建了一个多项目 Scala,其中我有一个根项目,它实际上只是聚合了两个子项目:一个宏库和一个使用该宏库的核心库。
我正在使用出色的插件为整个库(宏 + 核心相结合)sbt-unidoc
创建一个统一的 API。scaladoc
不幸的是,sbt-unidoc
有一些限制。例如,默认情况下,它不会挂接到doc
任务中,并且其输出放置在目标目录的unidoc
文件夹中,而不是api
文件夹中。publish
结合起来,这些可以防止在执行orpublishLocal
命令时生成和打包生成的文档。幸运的是(感谢GitHub网站上提出的问题),有一个简单的解决方案:inkytonic
sbt-unidoc
lazy val customUnidocSettings = unidocSettings ++ Seq (
doc in Compile := (doc in ScalaUnidoc).value,
target in unidoc in ScalaUnidoc := crossTarget.value / "api"
)
然后在根项目中使用这些设置:
lazy val macro = (project in file ("macro")).
settings (
name = "foo-macro"
)
lazy val core = (project in file ("core")).
settings (
name = "foo-core"
).
dependsOn (macro)
lazy val root = (project in file (".")).
settings (customUnidocSettings: _*).
settings (
name = "foo"
).
aggregate (macro, core)
现在,如果您执行 sbt 任务doc
, publish
,publishLocal
等,该root
项目将为两个子项目生成统一文档,并且该统一文档在发布期间被打包。
不幸的是,这些相同的命令还尝试为子项目macro
和core
子项目生成单独的子项目 API 文档——在我的特定情况下,由于各种原因,这些命令将失败。更不用说生成两次文档需要时间。
所以,这是我的问题:有什么简单的方法可以禁用doc
每个子项目的任务吗?
到目前为止,我能够发现的唯一方法是欺骗doc
认为没有嵌入 Scaladoc 的文件。这可行,但它是一种软糖而不是真正的解决方案:
lazy val noDocFileSettings = Seq (
sources in doc in Compile := List()
)
lazy val macro = (project in file ("macro")).
settings (noDocFileSettings: _*).
settings (
name = "foo-macro"
)
lazy val core = (project in file ("core")).
settings (noDocFileSettings: _*).
settings (
name = "foo-core"
).
dependsOn (macro)
有什么建议么?