2015-08-20 173 views
4

這個問題是類似於Make one source set dependent on another搖籃sourceSet依賴於另一個sourceSet

除了主要SourceSet我也有一個testenv SourceSet。 testenv SourceSet中的代碼引用了主代碼,因此我需要將主SourceSet添加到testenvCompile配置中。

sourceSets { 
    testenv 
} 

dependencies { 
    testenvCompile sourceSets.main 
} 

這不起作用,因爲您不能直接添加sourceSets作爲依賴項。推薦的方式做到這一點的是:

sourceSets { 
    testenv 
} 

dependencies { 
    testenvCompile sourceSets.main.output 
} 

但是,這並不與Eclipse正常工作,因爲當我清理gradle這個build文件夾,日食不能再編譯,因爲它依賴於構建的gradle。 另外,如果我改變主代碼,我不得不在gradle中重建項目,以使變更在eclipse中生效。

如何正確聲明依賴關係?

編輯:

sourceSets { 
    testenv 
} 

dependencies { 
    testenvCompile files(sourceSets.testenv.java.srcDirs, sourceSets.testenv.resources.srcDirs) 
} 

作品爲主要來源,而是因爲我現在引用.java文件,我從註釋處理器:(

回答

3
缺少生成的類

因此畢竟這是要走的路:

sourceSets { 
    testenv 
} 

dependencies { 
    testenvCompile sourceSets.main.output 
} 

爲了使它在eclipse中正常工作,您必須手動排除eclipse classpath中的所有sourceSet輸出。 這是醜陋的,但它適用於我:

Project proj = project 

eclipse { 
    classpath { 
    file { 
     whenMerged { cp -> 
     project.logger.lifecycle "[eclipse] Excluding sourceSet outputs from eclipse dependencies for project '${project.path}'" 
     cp.entries.grep { it.kind == 'lib' }.each { entry -> 
      rootProject.allprojects { Project project -> 
      String buildDirPath = project.buildDir.path.replace('\\', '/') + '/' 
      String entryPath = entry.path 

      if (entryPath.startsWith(buildDirPath)) { 
       cp.entries.remove entry 

       if (project != proj) { 
       boolean projectContainsProjectDep = false 
       for (Configuration cfg : proj.configurations) { 
        boolean cfgContainsProjectDependency = cfg.allDependencies.withType(ProjectDependency).collect { it.dependencyProject }.contains(project) 
        if(cfgContainsProjectDependency) { 
        projectContainsProjectDep = true 
        break; 
        } 
       } 
       if (!projectContainsProjectDep) { 
        throw new GradleException("The project '${proj.path}' has a dependency to the outputs of project '${project.path}', but not to the project itself. This is not allowed because it will cause compilation in eclipse to behave differently than in gradle.") 
       } 
       } 
      } 
      } 
     } 
     } 
    } 
    } 
}