2014-04-17 10 views
11

Sto tentando di correre sbt test:doc e sto vedendo un numero di avvisi simili al di sotto:SBT prova: doc non abbiamo trovato nessuna membro di collegare

[avvertire]/Users/tleese/code/my/stuff/src/test/scala/com/my/stuff/common/tests/util/NumberExtractorsSpecs.scala: 9: Impossibile trovare alcun membro da collegare a "com.my.stuff.common.util.IntExtractor".

Il problema sembra essere che i riferimenti Scaladoc dalle fonti di test alle fonti principali non sono in grado di collegarsi correttamente. Qualche idea su cosa potrei fare male o dover configurare?

Qui di seguito sono le sezioni pertinenti della mia Build.scala:

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

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

ho finito per invalidante che l'avvertimento usando [questa opzione scalac] (https://stackoverflow.com/questions/31488335/scaladoc -2-11-6-fail-on-throws-tag-with-unable-to-find-any-member-to-link # 31497874) –

risposta

4

Non sono sicuro se questa è una soluzione soddisfacente, ma ...

scaladoc prevede attualmente coppie di vaso e l'URL per ottenere il collegamento esterno al lavoro. È possibile forzare sbt a collegare dipendenze interne utilizzando JAR utilizzando exportJars. Confrontare il valore di

$ show test:fullClasspath 

prima e dopo l'impostazione exportJars. Successivamente, prendi il nome del JAR che viene utilizzato e collegalo all'URL in cui lo stai caricando.

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) 

Ora vedo che test:doc uno scaladoc con link alle http://example.com/index.html#foo.IntExtractor dal mio foo.IntExtractor.

+2

Interessante, sembra che probabilmente funzionerà, ma sono davvero sorpreso Dovrei usare strane soluzioni alternative per qualcosa di così semplice. –

1

Utilizzo di idee da Eugene's answer Ho creato uno snippet seguente. Usa variabile apiMapping come suggerito in sbt manual. Sfortunatamente non dice come gestire le dipendenze gestite, anche il titolo della sottosezione lo dice.

// 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

Questa è una modifica del answer da @phadej. Sfortunatamente, questa risposta funziona solo su Unix/Linux perché presuppone che il separatore del percorso sia uno /. Su Windows, il separatore del percorso è \.

Le seguenti opere su tutte le piattaforme, ed è secondo me un po 'più idiomatica:

/* 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

Considera [la mia variazione su questo tema] (http://stackoverflow.com/a/35673212/700420) su una domanda correlata. –

Problemi correlati