2014-04-17 2 views
11

Я пытаюсь запустить sbt test:doc и я вижу число предупреждений аналогичный ниже:SBT: документ не удалось найти какой-либо член связать

[предупредит]/Пользователи/tleese/код/my/stuff/src/test/scala/com/my/stuff/common/tests/util/NumberExtractorsSpecs.scala: 9: Не удалось найти ни одного участника для ссылки на «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 
+0

Я в конечном итоге отключить это предупреждение, используя [этот параметр scalac] (https://stackoverflow.com/questions/31488335/scaladoc -2-11-6-fail-on-throws-tag-with-able-to-find-any-member-to-link # 31497874) –

ответ

4

Не уверен, если это является удовлетворительным решением, но ...

Scaladoc в настоящее время ожидает, что пары баночки и URL, чтобы получить внешнее связывание с работой. Вы можете заставить sbt связывать внутренние зависимости с помощью JAR, используя exportJars. Сравните значение

$ show test:fullClasspath 

до и после установки exportJars. Затем возьмите имя используемого JAR и привяжите его к URL-адресу, к которому вы его загрузите.

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 со ссылками на http://example.com/index.html#foo.IntExtractor моего foo.IntExtractor.

+2

Интересно, похоже, что это, вероятно, сработает, но я действительно удивлен Мне пришлось бы использовать необычные обходные пути для чего-то такого простого. –

1

Использование идей от Eugene's answer Я сделал следующий фрагмент. Используется apiMapping sbt variable, как указано в sbt manual. К сожалению, это не говорит о том, как бороться с управляемыми зависимостями, даже в заголовке подраздела так говорится.

// 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") 
    ) 
    } 
) 
0

Это модификация answer по @phadej. К сожалению, этот ответ работает только на 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") 
    ) 
    } 
) 
+0

Рассмотрите [мои варианты по этой теме] (http://stackoverflow.com/a/35673212/700420) по соответствующему вопросу. –

Смежные вопросы