Почему Scalaz появляется в моих документах API проектов?

Предположим, что моя вся конфигурация проекта - это простой build.sbt:

scalaVersion := "2.11.4"

libraryDependencies += "org.scalaz" %% "scalaz-core" % "7.1.0"

И это мой код:

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

object Foo {
  def whatever[A: Equal](a: A, b: A) = a === b
}

Теперь, когда я запускаю sbt doc и открываю документы API в браузере, я вижу пакет scalaz в списке корневых пакетов ScalaDoc вместе с моим Foo:

object Foo
package scalaz

Или, если вы мне не верите:

scalaz package

Я заметил это раньше с Scalaz, и я не единственный, с которым это случается (см., например, в настоящее время опубликованная версия документов API Argonaut). Я не уверен, что видел это с любой библиотекой, кроме Scalaz.

Если я не использую ничего из Scalaz в моем коде проекта, он не появляется. То же самое происходит не менее 2.10.4 и 2.11.4.

Почему пакет scalaz отображается здесь и как его остановить?

Ответ 1

Я тоже это заметил. Это также происходит с пакетом akka.pattern от Akka, а также, например, с пакетом upickle из проекта с расширением.

Эти три пакета имеют две общие черты:

  • Это объекты пакета
  • Они определяют по крайней мере один тип в признаке mixin.

Итак, я немного экспериментировал с двумя проектами:

Проект A:

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

package object projectA extends SomeFunctionality

Проект B (зависит от проекта A):

package projectB
import projectA._

object B extends App {
  val p = new P("Test")
}

И voila: в ScalaDoc проекта B отображаются два пакета в корневом пакете:

projectA
projectB

Похоже, что оба вышеуказанных критерия должны быть соблюдены, поскольку устранение проблемы решает проблему.

Я считаю, что это ошибка в компиляторе scala. Поэтому я не могу помочь вам избежать этого, так как единственным способом было бы изменить источники scalaz в этом случае. Изменение ничего в ProjectB, кроме удаления всех ссылок на ProjectA, не помогло.


Обновить. Похоже, вы можете поручить компилятору исключить определенные пакеты из scaladoc.

scaladoc -skip-packages <pack1>:<pack2>:...:<packN> files.scala

Итак, это будет обходной путь здесь