2014-11-03 64 views
11

假設我的整個項目的配置是這樣的簡單build.sbt爲什麼Scalaz出現在我的項目的API文檔中?

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前注意到這點,我不是它發生的唯一一個(例如見淘金的currently published version API文檔)。我不確定我是否看到除Scalaz之外的任何圖書館都會發生這種情況。

如果我實際上沒有在我的項目代碼中使用Scalaz中的任何內容,它不會顯示出來。至少在2.10.4和2.11.4發生同樣的事情。

爲什麼scalaz包出現在這裏,我該如何讓它停止?

回答

9

我也注意到了這一點。它也發生在來自Akka的akka.pattern包以及例如upickle項目的upickle包中。

這三個包有兩個共同點:

  1. 他們是包對象
  2. 他們定義在一個混合特徵至少一種類型。

所以,我做了一個小實驗了兩個項目:

項目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") 
} 

瞧:在項目B的ScalaDoc在根包中出現兩個包:

projectA 
projectB 

看起來上述兩個標準都必須得到滿足,因爲消除一個解決了這個問題。

我相信這是scala編譯器中的一個bug。所以我不能幫你避免這種情況,因爲唯一的辦法就是在這種情況下改變scalaz的來源。除了刪除對ProjectA的所有引用之外,更改ProjectB中的任何內容都無濟於事。


更新:好像你可以指示編譯器exclude specific packages from scaladoc

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

所以這將是這裏

+1

+1和感謝一個解決辦法!如果有人採取了一種不涉及改變Scalaz的解決方法,我現在將暫時擱置此舉,但這非常棒。任何想法,如果有一個公開的問題? – 2014-11-03 16:32:44

+1

@TravisBrown看到我更新...有一個解決方法。我沒有找到匹配的問題。只是一些看起來可疑的封閉的。明天我會仔細看看! – 2014-11-03 17:06:04

+2

是的,包對象被稱爲是越野車。順便說一句,@retronym最近一直在清理這方面的工作:https://github.com/retronym/scala/compare/scala:2.12.x...ticket/8862-2 – 2014-11-03 17:22:11

相關問題