为什么Scalaz出现在我项目的API文档中?

Tra*_*own 11 documentation scala sbt scalaz scaladoc

假设我的整个项目配置很简单build.sbt:

scalaVersion := "2.11.4"

libraryDependencies += "org.scalaz" %% "scalaz-core" % "7.1.0"
Run Code Online (Sandbox Code Playgroud)

这是我的代码:

import scalaz.Equal
import scalaz.syntax.equal._

object Foo {
  def whatever[A: Equal](a: A, b: A) = a === b
}
Run Code Online (Sandbox Code Playgroud)

现在,当我sbt doc在浏览器中运行并打开API文档时,我会看到scalazScalaDoc根包列表中的包,以及我的Foo:

object Foo
package scalaz
Run Code Online (Sandbox Code Playgroud)

或者,如果你不相信我:

斯卡拉兹包

我之前已经注意到了Scalaz,并且我不是唯一一个它(例如参见当前发布的Argonaut API文档版本).我不确定我是否看到Scalaz以外的任何库都会发生这种情况.

如果我在项目代码中实际上没有使用Scalaz中的任何内容,则它不会显示出来.同样的事情发生在至少2.10.4和2.11.4.

为什么scalaz包装出现在这里以及如何让它停止?

Mar*_*ing 9

我也注意到了这一点.它也发生在akka.patternAkka 的软件包以及upickleupickle项目的软件包中.

这三个包有两个共同点:

  1. 它们是包对象
  2. 它们在mixin特性中定义至少一种类型.

所以我做了两个项目的小实验:

项目A:

trait SomeFunctionality {
  class P(val s: String)
}

package object projectA extends SomeFunctionality
Run Code Online (Sandbox Code Playgroud)

项目B(取决于项目A):

package projectB
import projectA._

object B extends App {
  val p = new P("Test")
}
Run Code Online (Sandbox Code Playgroud)

瞧:在项目B的ScalaDoc中,根包中出现两个包:

projectA
projectB
Run Code Online (Sandbox Code Playgroud)

似乎必须满足上述两个标准,因为消除一个标准可以解决问题.

我相信这是scala编译器中的一个错误.所以我无法帮助你避免这种情况,因为唯一的办法就是在这种情况下改变scalaz的来源.更改ProjectB中的任何内容除了删除对ProjectA的所有引用都没有帮助.


更新:您似乎可以指示编译器从scaladoc中排除特定的包.

scaladoc -skip-packages <pack1>:<pack2>:...:<packN> files.scala
Run Code Online (Sandbox Code Playgroud)

所以这将是一个解决方法

  • 是的,已知包裹对象是错误的.顺便提一下,@ retronym最近一直致力于清理该区域:https://github.com/retronym/scala/compare/scala:2.12.x...ticket/8862-2 (2认同)