Gradle: включить один и тот же SourceSet в несколько подпроектов - PullRequest
0 голосов
/ 08 октября 2019

Как бы я добавил один набор источников для нескольких подпроектов?

Прежде всего ... да, я знаю, насколько это смешно. Это просто то, что я должен сделать.

Настройка

  • В проекте используется Groovy DSL.
  • Есть 3 подпроекта (A, B, C)каждый из которых имеет свой уникальный набор основных источников.
  • Существует 5 дополнительных наборов источников (1, 2, 3, 4, 5), внешних по отношению к этим проектам.
  • Одно из внешних наборов источников может бытьскомпилирован один.
  • Все исходные наборы зависят от интерфейса, который определен 3 разных раза в каждом подпроекте.
  • Основной источник подпроекта не может зависеть ни от одного из внешних источников
  • 1 и 2 должны быть скомпилированы с A, B и C.
  • 3 должны быть скомпилированы с A, а также B.
  • 4 должна быть скомпилирована с B, а также C
  • 5 должен быть скомпилирован только с C.
  • 4 и 5 должны зависеть от класса, определенного в 2.
  • 5 должен быть автономным источником, чтобы он мог бытьвключается в качестве исходного набора внутри любых будущих подпроектов, которые могут быть добавлены.
  • Ни один из внешних, такМожно разрешить включать источники из любого другого набора источников
  • Ни один из внешних источников не может быть скомпилирован отдельно.
  • Ни один из внешних источников не может быть включен как зависимость jar или проекта;они ДОЛЖНЫ быть включены в качестве исходного набора и ДОЛЖНЫ быть скомпилированы отдельно для каждого подпроекта, который включает их.

A

sourceSets {
    main {
        java {
            srcDirs = ["src",
                       "$rootDir/source_sets/1/src",
                       "$rootDir/source_sets/2/src",
                       "$rootDir/source_sets/3/src"
            ]
        }
    }
}

B

sourceSets {
    main {
        java {
            srcDirs = ["src",
                       "$rootDir/source_sets/1/src",
                       "$rootDir/source_sets/2/src",
                       "$rootDir/source_sets/3/src",
                       "$rootDir/source_sets/4/src"
            ]
        }
    }
}

C

sourceSets {
    main {
        java {
            srcDirs = ["src",
                       "$rootDir/interfaces/source_sets/1/src",
                       "$rootDir/interfaces/source_sets/2/src",
                       "$rootDir/interfaces/source_sets/4/src",
                       "$rootDir/interfaces/source_sets/5/src"
            ]
        }
    }
}

settings.gradle

include(":interfaces/A")
project(":interfaces/A").name = "A"

include(":interfaces/A")
project(":interfaces/A").name = "A"

include(":interfaces/A")
project(":interfaces/A").name = "A"

Проблема в том, что 4 и 5 не могут найти класс в 2, и моя IDE (IntelliJ) не может найти правильный путь к классу.

На самом деле мне нужно, чтобы внешние источники работали так, как если бы их было 3 отдельных копии, при этом фактически не было 3 отдельных копий, и мне нужно сделать это без использованияиз символических / программных ссылок.

В решении нужно использовать только gradle, но он может использовать плагин JetBrains «idea» для gradle, если он не включает фиксацию каких-либо файлов в папке «.idea»,но он может включать встроенный XML или файлы в папке ресурсов вне папки .idea.

Так что да ... это слишком сложно и просто ... тьфу! Но так оно и есть.

1 Ответ

0 голосов
/ 08 октября 2019

Тьфу, действительно.

У меня нет ответа, но это слишком долго, чтобы поместить в комментарий. Итак, здесь.

Я предполагаю, что это проблема только с IntelliJ, а не при компиляции с Gradle, верно? Если это так, вам следует попытаться смоделировать свой проект в IntelliJ так, как вы этого хотите, и как только вы найдете способ сделать это, выясните, как использовать настраиваемый плагин Idea, чтобы сделать это для вас.

Однако я почти уверен, что в IntelliJ не может быть нескольких модулей, совместно использующих один и тот же «корень контента». Так что я вижу только те опции, которые вам не нужны - это либо копирование (синхронизация) источников с новой папкой, используемой только для IntelliJ (которая не допускает изменений), создание символических ссылок (которые не всегдапереносимыми) или реструктурировать ваши внешние источники, чтобы они могли компилироваться независимо (что может быть нелегко)

: - (

...