Как добавить зависимости в тесты другого проекта в мультиплатформенной мультипроектной сборке Kotlin

У меня есть многоплатформенный проект Kotlin, который содержит несколько модулей (подпроектов). В строительстве Мультиплатформенные Проекты с Gradle документации Котлин ясно показывает, как настроить проект зависимостей между модулями:

kotlin {
    sourceSets {
        commonMain {
            dependencies {
                // All of the compilations that include source set 'commonMain'
                // will get this dependency resolved to a compatible target, if any:
                api project(':foo-lib')
            }
        }
    }
}

Проблема, с которой я сейчас сталкиваюсь, заключается в том, что, хотя в этом документе описывается, как добавить зависимость от одного модуля (всех его целевых платформ) к другому модулю (его соответствующие целевые платформы), в нем не разъясняется, как добавить зависимость к тестовым источникам другой модуль.

Я ожидал, что это будет довольно распространенный вариант использования. Например, одна из причин, по которой я хочу это сделать, заключается в том, что мои тестовые источники модуля A содержат классы-заглушки. Модуль B зависит от модуля A, включая определения классов, для которых тестовые заглушки предоставляются в тестовых источниках модуля A. Таким образом, неудивительно, что тесты модуля B могут захотеть повторно использовать эти тестовые заглушки, определенные в тестовых источниках модуля. А.

Обычная рекомендация при сборке с несколькими проектами - переместить такие тестовые источники в еще один модуль, но мне это кажется ненужным. Решения, которые, на мой взгляд, более чистые, существуют для обычных многопроектных сборок, но я не могу понять, как настроить аналог этого в многоплатформенной многопроектной сборке Kotlin, которая также опирается на Kotlin Gradle DSL, продемонстрированный в код выше.

1 ответ

Решение

Чтобы установить подобную зависимость между одноплатформенными проектами, обычно требуется создать Gradle Configuration в проекте-производителе добавьте выходные данные тестовой компиляции или тестовый JAR-файл в эту конфигурацию, а в проекте-потребителе зависит от этой конфигурации (т.е. project(...)зависимости с явной конфигурацией или, что предпочтительнее, добавить атрибуты, чтобы гарантировать, что Gradle выбирает конфигурацию тестовых выходов в разрешении зависимостей с учетом вариантов).

Однако все это требует, чтобы тесты были скомпилированы в форму, которая может быть повторно использована общими исходными наборами потребительского проекта. В мультиплатформенных проектах Kotlin этого еще не произошло. В то время как производственные общие исходные наборы, которые участвуют в опубликованных компиляциях, компилируются в метаданные Kotlin (*.kotlin_metadata файлы), тестовые исходники и другие виды неопубликованного кода еще не преобразованы в этот формат.

Вместо этого тесты в настоящее время компилируются только в окончательные двоичные файлы для конкретной платформы (т.е. *.class файлы, *.js, Родные двоичные файлы), которые нельзя использовать для анализа общих источников.

Поэтому такие зависимости пока не поддерживаются. Это может измениться в будущем. Следите за этой проблемой в системе отслеживания проблем Kotlin: KT-35073.

Другие вопросы по тегам