Как настроить IDEA для поиска в разных наборах исходного кода в зависимости от варианта сборки?JAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Как настроить IDEA для поиска в разных наборах исходного кода в зависимости от варианта сборки?

Сообщение Anonymous »

Это проект Java/Kotlin. Я хочу иметь возможность писать код с одной абстракцией в основном и разными реализациями в нескольких наборах исходного кода. А затем запустите его как приложение Java.

В основном исходном наборе есть два файла(

Код: Выделить всё

src/main/kotlin
).
Файл Times.kt с абстракцией

Код: Выделить всё

interface Times {
fun now(): Duration
}
И файл App.kt с основным методом

Код: Выделить всё

fun main() {
val times: Times = FinalTimes
println("now: ${times.now()}")
}
Набор исходного кода макета(

Код: Выделить всё

src/mock/kotlin
) содержит реализацию Times.

Код: Выделить всё

object FinalTimes : Times {
private var index = 0L

override fun now(): Duration {
return index++.milliseconds
}
}
Настоящий исходный набор(

Код: Выделить всё

src/real/kotlin
) содержит другую реализацию Times.

Код: Выделить всё

object FinalTimes : Times {
override fun now(): Duration {
return System.currentTimeMillis().milliseconds
}
}
Структура такого проекта в основном будет следующей:

Код: Выделить всё

app/src/main/kotlin/test/kotlin/ss/App.kt
app/src/main/kotlin/test/kotlin/ss/Times.kt
app/src/mock/kotlin/test/kotlin/ss/FinalTimes.kt
app/src/real/kotlin/test/kotlin/ss/FinalTimes.kt
Я добавил новую задачу в build.gradle.kts, которая должна скомпилировать и запустить код из основного вместе с кодом из макета:

Код: Выделить всё

sourceSets.create("mock") {
kotlin.srcDirs("src/main/kotlin")
}

tasks.register("runMock") {
classpath(sourceSets["mock"].runtimeClasspath)
mainClass = "test.kotlin.ss.AppKt"
}
Выполнив команду gradle app:runMock, вы увидите, что код успешно скомпилировался и запустился. Затем я сделал то же самое по-настоящему. И теперь gradle app:runMock печатает сейчас: 0s, а gradle app:runReal печатает сейчас: 20467d 16h 46m 51.296s (в зависимости от среды).

Моя проблема в том, что IDEA для подсветки кода по-прежнему использует компиляцию исходного кода отдельно. не видит макет
Изображение
не видит main
Изображение


Стоит уточнить, что одно не наследует другое. Это будет в случае с main и test, где test знает о main, но main не знает о test. Поэтому простого добавления компиляций["mock"].associateWith(compilations["main"]) будет недостаточно. В моем случае это должна быть общая кодовая база. макет знает о Times в main. И main знает о FinalTimes в макете.

Меня вдохновляет то, как такое разделение исходников работает в проектах Android.
Плагин Android для Gradle позволяет разделять источники на типы сборки и варианты проектов.
И в самой Android Studio я могу выбрать, какой конкретный набор этих типов и вариантов я хочу использовать сейчас при компиляции.
Скажем так это два варианта макета/реального и два типа отладки/выпуска.
Я запускаю команду gradle app:assembleMockDebug и получаю сборку, скомпилированную из кода, расположенного по пути:
  • src/main/kotlin
  • src/mock/kotlin
  • src/debug/kotlin
Если я запускаю команду gradle app:assembleRealRelease, я получаю сборку по пути:
  • src/main/kotlin
  • src/real/kotlin
  • src/release/kotlin
Подводя итог, идея работает. Ведь gradle app:runMock компилируется и работает корректно.
Я хочу знать, как настроить IDEA, чтобы он понимал, что на данный момент меня интересует только вариант сборки макета.
То есть смотреть код только из src/main/kotlin и src/mock/kotlin, а src/real/kotlin игнорировать.
В духе о том, как Android Studio позволяет выбрать вариант сборки, а затем правильно обрабатывает исходный код, соответствующий выбранному варианту.


Подробнее здесь: https://stackoverflow.com/questions/798 ... e-build-op
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»