Как добавить зависимости в тесты другого проекта в мультиплатформенной мультипроектной сборке 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.