Gradle sourceSet зависит от другого sourceSet
Этот вопрос похож на Сделать один исходный набор зависимым от другого
Помимо основного SourceSet у меня также есть тестенв SourceSet. Код в testenv SourceSet ссылается на основной код, поэтому мне нужно добавить основной SourceSet в конфигурацию testenvCompile.
sourceSets {
testenv
}
dependencies {
testenvCompile sourceSets.main
}
Это не работает, потому что вы не можете напрямую добавлять исходные наборы в качестве зависимостей. Рекомендуемый способ сделать это:
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:(
1 ответ
Так что в конце концов это путь:
sourceSets {
testenv
}
dependencies {
testenvCompile sourceSets.main.output
}
Для правильной работы с eclipse вы должны вручную исключить все выходные данные sourceSet из пути к классу eclipse. Это некрасиво, но у меня работает
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.")
}
}
}
}
}
}
}
}
}