Can I use sbt's `apiMappings` setting for managed dependencies?

sbt, scaladoc

Solution

I managed to get this working for referencing scalaz and play by doing the following:

apiMappings ++= {
  val cp: Seq[Attributed[File]] = (fullClasspath in Compile).value
  def findManagedDependency(organization: String, name: String): File = {
    ( for {
        entry <- cp
        module <- entry.get(moduleID.key)
        if module.organization == organization
        if module.name.startsWith(name)
        jarFile = entry.data
      } yield jarFile
    ).head
  }
  Map(
      findManagedDependency("org.scalaz",        "scalaz-core") -> url("https://scalazproject.ci.cloudbees.com/job/nightly_2.10/ws/target/scala-2.10/unidoc/")
    , findManagedDependency("com.typesafe.play", "play-json")   -> url("http://www.playframework.com/documentation/2.2.1/api/scala/")
  )
}

YMMV of course.

Problem

I'd like the ScalaDoc I generate with sbt to link to external libraries, and in sbt 0.13 we have `autoAPIMappings` which is supposed to add these links for libraries that declare their `apiURL`. In practice though, none of the libraries I use provide this in their pom/ivy metadata, and I suspect some of these libraries will never do so. The `apiMappings` setting is supposed to help with just that, but it is typed as `Map[File, URL]` and hence geared towards setting doc urls for unmanaged dependencies. Managed dependencies are declared as instances of `sbt.ModuleID` and cannot be inserted directly in that map. Can I somehow populate the `apiMappings` setting with something that will associate an URL with a managed dependency ? A related question is: does sbt provide an idiomatic way of getting a `File` from a `ModuleID`? I guess I could try to evaluate some classpaths and get back `File`s to try and map them to `ModuleID`s but I hope there is something simpler. Note: this is related to https://stackoverflow.com/questions/18747265/sbt-scaladoc-configuration-for-the-standard-library/18747266, but that question differs by linking to the scaladoc for the standard library, for which there is a well known `File` `scalaInstance.value.libraryJar`, which is not the case in this instance.

Original source