sbt test:doc找不到任何链接的成员

时间:2014-04-17 01:18:01

标签: scala sbt scaladoc

我试图运行sbt test:doc,并且我看到了类似下面的一些警告:

  

[warn] /Users/tleese/code/my/stuff/src/test/scala/com/my/stuff/common/tests/util/NumberExtractorsSpecs.scala:9:找不到任何链接的成员#34; com.my.stuff.common.util.IntExtractor"

问题似乎是从测试源到主要源的Scaladoc引用无法正确链接。知道我可能做错了什么或需要配置什么?

以下是我的Build.scala的相关部分:

val docScalacOptions = Seq("-groups", "-implicits", "-external-urls:[urls]")

scalacOptions in (Compile, doc) ++= docScalacOptions
scalacOptions in (Test, doc) ++= docScalacOptions
autoAPIMappings := true

3 个答案:

答案 0 :(得分:4)

不确定这是否是一个令人满意的解决方案,但是......

Scaladoc目前需要成对的jar和URL才能使外部链接正常工作。您可以使用exportJars强制sbt使用JAR链接内部依赖项。比较

的值
$ show test:fullClasspath
设置exportJars之前和之后

。接下来,获取正在使用的JAR的名称,并将其链接到您要将其上传到的网址。

scalaVersion := "2.11.0"

autoAPIMappings := true

exportJars := true

scalacOptions in (Test, doc) ++= Opts.doc.externalAPI((
  file(s"${(packageBin in Compile).value}") -> url("http://example.com/")) :: Nil)

现在我看到test:doc一个Scaladoc,其链接指向foo.IntExtractor的{​​{3}}。

答案 1 :(得分:1)

使用Eugene's answer中的提示,我制作了以下代码段。 它使用sbt manual中建议的apiMapping sbt变量。 不幸的是,它并没有说明如何处理托管依赖项,即使是小节标题也是如此。

// External documentation

/* You can print computed classpath by `show compile:fullClassPath`.
 * From that list you can check jar name (that is not so obvious with play dependencies etc).
 */
val documentationSettings = Seq(
  autoAPIMappings := true,
  apiMappings ++= {
    // Lookup the path to jar (it's probably somewhere under ~/.ivy/cache) from computed classpath
    val classpath = (fullClasspath in Compile).value
    def findJar(name: String): File = {
      val regex = ("/" + name + "[^/]*.jar$").r
      classpath.find { jar => regex.findFirstIn(jar.data.toString).nonEmpty }.get.data // fail hard if not found
    }

    // Define external documentation paths
    Map(
      findJar("scala-library") -> url("http://scala-lang.org/api/" + currentScalaVersion + "/"),
      findJar("play-json") -> url("https://playframework.com/documentation/2.3.x/api/scala/index.html")
    )
  }
)

答案 2 :(得分:0)

这是@phadej对answer的修改。不幸的是,这个答案仅适用于Unix / Linux,因为它假设路径分隔符是/。在Windows上,路径分隔符为\

以下适用于所有平台,并且稍微更具惯用性恕我直言:

/* You can print the classpath with `show compile:fullClassPath` in the SBT REPL.
 * From that list you can find the name of the jar for the managed dependency.
 */
lazy val documentationSettings = Seq(
  autoAPIMappings := true,
  apiMappings ++= {
    // Lookup the path to jar from the classpath
    val classpath = (fullClasspath in Compile).value
    def findJar(nameBeginsWith: String): File = {
      classpath.find { attributed: Attributed[java.io.File] => (attributed.data ** s"$nameBeginsWith*.jar").get.nonEmpty }.get.data // fail hard if not found
    }
    // Define external documentation paths
    Map(
      findJar("scala-library") -> url("http://scala-lang.org/api/" + currentScalaVersion + "/"),
      findJar("play-json") -> url("https://playframework.com/documentation/2.3.x/api/scala/index.html")
    )
  }
)