Создание единого ScalaDoc для нескольких подпроектов с использованием Gradle

Я использую Gradle (v2.3) для проекта, который содержит несколько подпроектов Scala. Генерация ScalaDoc для каждого подпроекта по отдельности работает, как и ожидалось (запуск gradle :project-a:scaladoc или gradle :project-b:scaladoc).

Но как получить один ScalaDoc из всех подпроектов Scala? Минимальный проект ниже приводит к "Невозможно вызвать метод withInputStream() для нулевого объекта" ошибка при выполнении
gradle scaladoc --info:

Starting Build
Compiling settings file '/tmp/gradle-scaladoc-test/settings.gradle' using StatementExtractingScriptTransformer.
Compiling settings file '/tmp/gradle-scaladoc-test/settings.gradle' using BuildScriptTransformer.
Settings evaluated using settings file '/tmp/gradle-scaladoc-test/settings.gradle'.
Projects loaded. Root project using build file '/tmp/gradle-scaladoc-test/build.gradle'.
Included projects: [root project 'some project', project ':project-a', project ':project-b']
Evaluating root project 'some project' using build file '/tmp/gradle-scaladoc-test/build.gradle'.
Compiling build file '/tmp/gradle-scaladoc-test/build.gradle' using StatementExtractingScriptTransformer.
Compiling build file '/tmp/gradle-scaladoc-test/build.gradle' using BuildScriptTransformer.
Evaluating project ':project-a' using empty build file.
Evaluating project ':project-b' using empty build file.
All projects evaluated.
Selected primary task 'scaladoc' from project :
Tasks to be executed: [task ':scaladoc', task ':project-a:compileJava', task ':project-a:compileScala', task ':project-a:processResources', task ':project-a:classes', task ':project-a:scaladoc', task ':project-b:compileJava', task ':project-b:compileScala', task ':project-b:processResources', task ':project-b:classes', task ':project-b:scaladoc']
:scaladoc (Thread[main,5,main]) started.
:scaladoc
Executing task ':scaladoc' (up-to-date check took 0.448 secs) due to:
  No history is available.
:scaladoc FAILED
:scaladoc (Thread[main,5,main]) completed. Took 0.768 secs.

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':scaladoc'.
> Cannot invoke method withInputStream() on null object

* Try:
Run with --stacktrace option to get the stack trace. Run with --debug option to get more log output.

BUILD FAILED

Total time: 5.198 secs
Stopped 0 compiler daemon(s).

Структура каталога:

├─ project-a/
│   └─ src/
│       └─ main/
│           └─ scala/
│               └─ package_a/
│                   └─ A.scala
├─ project-b/
│   └─ src/
│       └─ main/
│           └─ scala/
│               └─ package_b/
│                   └─ B.scala
├─ build.gradle
└─ settings.gradle

build.gradle

subprojects {
  repositories { 
    mavenCentral() 
  }

  apply plugin: 'scala'

  dependencies {
    compile 'org.scala-lang:scala-library:2.11.6'
  }

  tasks.withType(ScalaCompile) {
    scalaCompileOptions.additionalParameters = ['-unchecked', '-deprecation', '-feature']
    scalaCompileOptions.useAnt = false
  }
}


task scaladoc(type: org.gradle.api.tasks.scala.ScalaDoc) {
  group = 'Documentation'
  description = 'Aggregated ScalaDoc documentation.'
  title = 'Title of documentation'
  destinationDir = new File(buildDir, "aggregated-api")

  source subprojects.collect { project ->
    project.sourceSets.main.allScala
  }

  scalaClasspath = files(subprojects.collect { project ->
    project.sourceSets.main.compileClasspath
  })

  classpath = files(subprojects.collect { project ->
    project.sourceSets.main.compileClasspath
  })
}

settings.gradle

rootProject.name = 'some project'
include 'project-a', 'project-b'

Аскала

package package_a
case class A(value: Int)

Бискала

package package_b
case class B(value: Int)    

Единственная похожая проблема, которую я смог найти, это "Gradle не удается скомпилировать базовый проект Scala", но здесь это не помогает ( и речь идет о Gradle 1.3).


person hiddenbit    schedule 06.04.2015    source источник
comment
Я знаю, что вы не спрашиваете об этом, но если бы это была сборка sbt, вы могли бы использовать плагин sbt-unidoc.   -  person 0__    schedule 06.04.2015
comment
Попробуйте адаптировать один из многих примеров агрегированного javadoc.   -  person Ben Manes    schedule 07.04.2015
comment
Спасибо за предложения. sbt не вариант, это нужно сделать с помощью Gradle.   -  person hiddenbit    schedule 09.04.2015


Ответы (2)


Я знаю, что это было давно, но так как у меня была точно такая же проблема...

Я решил это следующим образом:

task aggregatedScaladocs(type: ScalaDoc, description: 'Generate scaladocs from all child projects as if it were a single project', group: 'Documentation') {
destinationDir = file("$buildDir/docs/scaladoc")
title = "$project.name $version API"

subprojects.each { proj ->
    proj.tasks.withType(ScalaDoc).each {
        source += proj.sourceSets.main.allJava
        source += proj.sourceSets.main.allScala
        classpath += proj.sourceSets.main.compileClasspath
        excludes += scaladoc.excludes
        includes += scaladoc.includes
    }
}

}

Надеюсь, это поможет кому-то в какой-то момент.

person juwi    schedule 31.08.2017

Для Gradle 6.x мне нужно было использовать слегка измененную версию ответа @juwi.

task aggregatedScaladocs(type: ScalaDoc, description: 'Generate scaladocs from all child projects as if it were a single project', group: 'Documentation') {
    destinationDir = file("$buildDir/docs/scaladoc")
    title = "$project.name $version API"
    classpath = project.files([])
    scalaClasspath = project.files([])

    subprojects.each { proj ->
        proj.tasks.withType(ScalaDoc).each {
            source proj.sourceSets.main.allJava
            source proj.sourceSets.main.allScala
            classpath += proj.scaladoc.classpath
            scalaClasspath += proj.scaladoc.scalaClasspath
            exclude proj.scaladoc.excludes
            include proj.scaladoc.includes
        }
    }
}
person Ján Čabala    schedule 11.02.2020