Gradle sourceSet 依赖于另一个 sourceSet
Gradle sourceSet depends on another sourceSet
这个问题类似于Make one source set dependent on another
除了主要的 SourceSet,我还有一个 testenv SourceSet。
testenv SourceSet中的代码引用了主代码,因此我需要将主SourceSet添加到testenvCompile配置中。
sourceSets {
testenv
}
dependencies {
testenvCompile sourceSets.main
}
这不起作用,因为您不能直接将 sourceSets 添加为依赖项。推荐的方法是:
sourceSets {
testenv
}
dependencies {
testenvCompile sourceSets.main.output
}
但这在 eclipse 中无法正常工作,因为当我清理 gradle 构建文件夹时,eclipse 无法再编译,因为它依赖于 gradle 构建。
此外,如果我更改主要代码,我必须在 gradle 中重建项目以使更改在 eclipse 中生效。
如何正确声明依赖关系?
编辑:
这个
sourceSets {
testenv
}
dependencies {
testenvCompile files(sourceSets.testenv.java.srcDirs, sourceSets.testenv.resources.srcDirs)
}
适用于主要来源,但因为我现在引用了 .java 文件,所以我缺少从 Annotation-Processor 生成的 类 :(
所以毕竟这是要走的路:
sourceSets {
testenv
}
dependencies {
testenvCompile sourceSets.main.output
}
要使其与 eclipse 一起正常工作,您必须手动从 eclipse 类路径中排除所有 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.")
}
}
}
}
}
}
}
}
}
这个问题类似于Make one source set dependent on another
除了主要的 SourceSet,我还有一个 testenv SourceSet。 testenv SourceSet中的代码引用了主代码,因此我需要将主SourceSet添加到testenvCompile配置中。
sourceSets {
testenv
}
dependencies {
testenvCompile sourceSets.main
}
这不起作用,因为您不能直接将 sourceSets 添加为依赖项。推荐的方法是:
sourceSets {
testenv
}
dependencies {
testenvCompile sourceSets.main.output
}
但这在 eclipse 中无法正常工作,因为当我清理 gradle 构建文件夹时,eclipse 无法再编译,因为它依赖于 gradle 构建。 此外,如果我更改主要代码,我必须在 gradle 中重建项目以使更改在 eclipse 中生效。
如何正确声明依赖关系?
编辑:
这个
sourceSets {
testenv
}
dependencies {
testenvCompile files(sourceSets.testenv.java.srcDirs, sourceSets.testenv.resources.srcDirs)
}
适用于主要来源,但因为我现在引用了 .java 文件,所以我缺少从 Annotation-Processor 生成的 类 :(
所以毕竟这是要走的路:
sourceSets {
testenv
}
dependencies {
testenvCompile sourceSets.main.output
}
要使其与 eclipse 一起正常工作,您必须手动从 eclipse 类路径中排除所有 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.")
}
}
}
}
}
}
}
}
}