2015-04-06 100 views
1

我对一个包含多个Scala子项目的项目使用Gradle(v2.3)。生成每个子项目的ScalaDoc可以按预期单独工作(运行gradle :project-a:scaladocgradle :project-b:scaladoc)。使用Gradle为多个子项目生成单个ScalaDoc

但如何做一个得到所有斯卡拉子项目 ScalaDoc?下面最小项目执行
gradle scaladoc --info时导致错误,一个“对空对象不能调用方法withInputStream()”:

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' 

A.scala

package package_a 
case class A(value: Int) 

B.scala

package package_b 
case class B(value: Int)  

我能找到的唯一类似的问题是"Gradle Fails to Compile Basic Scala Project",但它在这里没有帮助(并且是关于Gradle 1.3)。

+0

我知道你不是问这个问题,但如果这是一个构建,你可以利用[sbt-unidoc插件](https://github.com/sbt/sbt-unidoc) –

+0

尝试调整其中一个许多[gradle aggregate javadoc](https://www.google.com/search?q=gradle+aggregate+javadoc)示例。 –

+0

感谢您的建议。 sbt是没有选择的,它必须用Gradle来完成。 – hiddenbit

回答

0

我知道它已经有一段时间,因为这已被问过,但因为我只是有完全相同的问题...

我解决它的方式如下:

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

}

希望它能帮助某个人。

相关问题