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.")
                }
              }
            }
          }
        }
      }
    }
  }
}
Другие вопросы по тегам