使用Gradle为多个子项目生成单个ScalaDoc

使用Gradle为多个子项目生成单个ScalaDoc,scala,gradle,multi-project,scaladoc,Scala,Gradle,Multi Project,Scaladoc,我将Gradle(v2.3)用于一个包含多个Scala子项目的项目。为每个子项目单独生成ScalaDoc的工作方式与预期一致(运行gradle:project-a:ScalaDoc或gradle:project-b:ScalaDoc) 但如何获取所有Scala子项目的单个ScalaDoc?下面的最小项目在执行时会导致“无法调用null对象上的withInputStream()方法”错误 gradle scaladoc--info: 开始构建 正在使用StatementExtractingScri

我将Gradle(v2.3)用于一个包含多个Scala子项目的项目。为每个子项目单独生成ScalaDoc的工作方式与预期一致(运行
gradle:project-a:ScalaDoc
gradle:project-b:ScalaDoc

但如何获取所有Scala子项目的单个ScalaDoc?下面的最小项目在执行时会导致“无法调用null对象上的withInputStream()方法”错误
gradle scaladoc--info

开始构建
正在使用StatementExtractingScriptTransformer编译设置文件“/tmp/gradle scaladoc test/settings.gradle”。
正在使用BuildScriptTransformer编译设置文件“/tmp/gradle scaladoc test/settings.gradle”。
使用设置文件“/tmp/gradle scaladoc test/Settings.gradle”评估设置。
已加载项目。使用生成文件“/tmp/gradle-scaladoc-test/build.gradle”的根项目。
包括的项目:[根项目“某些项目”,项目:项目-a,项目:项目-b']
使用生成文件“/tmp/gradle-scaladoc-test/build.gradle”评估根项目“some-project”。
使用StatementExtractionScriptTransformer编译生成文件“/tmp/gradle scaladoc test/build.gradle”。
使用BuildScriptTransformer编译生成文件“/tmp/gradle scaladoc test/build.gradle”。
正在使用空生成文件评估项目“:project-a”。
正在使用空生成文件评估项目“:project-b”。
对所有项目进行评估。
从项目中选择的主要任务“scaladoc”:
要执行的任务:[任务]:scaladoc',任务]:project-a:CompileCala',任务]:project-a:processResources',任务]:project-a:classes',task':project-a:scaladoc',task':project-b:CompileCala',task':project-b:processResources',task':project-b:classes',task':project-b:scaladoc']
:scaladoc(线程[main,5,main])已启动。
:scaladoc
正在执行任务“:scaladoc”(最新检查耗时0.448秒),原因是:
没有可用的历史记录。
:scaladoc失败
:scaladoc(线程[main,5,main])已完成。用了0.768秒。
失败:生成失败,出现异常。
*出了什么问题:
任务“:scaladoc”的执行失败。
>无法在null对象上调用withInputStream()方法
*尝试:
使用--stacktrace选项运行以获取堆栈跟踪。使用--debug选项运行以获得更多日志输出。
构建失败
总时间:5.198秒
已停止0个编译器守护程序。

目录结构:

├─ 项目a/
│   └─ src/
│       └─ 主要/
│           └─ 斯卡拉/
│               └─ a包/
│                   └─ 斯卡拉
├─ b项目/
│   └─ src/
│       └─ 主要/
│           └─ 斯卡拉/
│               └─ b包/
│                   └─ 鳞状杆菌
├─ 格雷德尔先生
└─ 格雷德尔酒店
build.gradle

子项目{
存储库{
mavenCentral()
}
应用插件:“scala”
依赖关系{
编译“org.scala lang:scala库:2.11.6”
}
tasks.withType(ScalaCompile){
scalaCompileOptions.additionalParameters=['-unchecked','-deprecation','-feature']
scalaCompileOptions.useAnt=false
}
}
任务scaladoc(类型:org.gradle.api.tasks.scala.scaladoc){
组='文档'
description='聚合的ScalaDoc文档。'
标题='文件标题'
destinationDir=新文件(buildDir,“聚合api”)
source subprojects.collect{project->
project.sourceset.main.allScala
}
scalaClasspath=文件(subprojects.collect{project->
project.sourceset.main.compileClasspath
})
classpath=文件(subprojects.collect{project->
project.sourceset.main.compileClasspath
})
}
设置。渐变

rootProject.name='some project'
包括“项目a”、“项目b”
A.scala

package\u a
案例类别A(值:Int)
B.scala

package\u b
案例B类(值:Int)


我能找到的唯一类似的问题是,但在这里没有帮助(关于Gradle 1.3)。

我知道已经有一段时间没有人问过这个问题了,但因为我刚刚遇到了完全相同的问题

我用以下方法解决了这个问题:

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


希望它能在某些方面帮助到某人。

对于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
        }
    }
}

我知道你不是在问这个问题,但是如果它是sbt构建,你可以尝试使用其中一个例子。谢谢你的建议。sbt没有选择,它必须由Gradle完成。