Как добавить зависимости проекта в конкретные цели платформы, созданные плагином `kotlin-multiplatform`? - PullRequest
1 голос
/ 21 марта 2019

Ранее при создании многоплатформенных проектов с использованием Gradle использовались отдельные подключаемые модули Gradle для каждой целевой платформы: kotlin-platform-common, kotlin-platform-js и kotlin-platform-jvm.

Начиная с Kotlin 1.3 , этотеперь унифицирован с помощью одного плагина kotlin-multiplatform. В текущей документации указано, как настроить мультиплатформенные проекты с использованием этого подхода .

Однако в моем проекте у меня есть несколько мультиплатформенных проектов с некоторыми зависимостями между ними.В старой многоплатформенной конфигурации каждая отдельная платформа является отдельным модулем и требует добавления зависимостей между проектами, добавляя ссылки на проекты в каждом модуле, относящемся к платформе, к соответствующим модулям в другом проекте: например, project(':some-library:some-library-js') для добавления зависимости к модулю JS изв другом модуле JS.

При переходе на новую многоплатформенную конфигурацию мне теперь нужно добавить зависимость от проекта, настроенного с использованием старого метода конфигурации, к проекту, настроенному с использованием нового плагина kotlin-multiplatform.

Учитывая, что специфичные для платформы модули теперь определяются и управляются новым плагином, как мне поступить?

Ответы [ 2 ]

0 голосов
/ 21 марта 2019

По сути, вам не нужно указывать платформу в зависимости от проекта к проекту Kotlin Muiltiplatform.Плагин Kotlin устанавливает разрешение зависимостей таким образом, чтобы Gradle автоматически выбирал соответствующие артефакты цели.

Так, например, в одноцелевом проекте Kotlin / JVM вы можете просто использовать зависимость project("...")в многоплатформенном проекте:

dependencies {
    implementation(project(":multiplatform-library")
}

Если :multiplatform-library имеет цель JVM, эта зависимость будет преобразована в артефакт цели JVM.В противном случае вы столкнетесь с ошибкой разрешения зависимостей при перечислении возможных конфигураций.

Это описано в справочнике Kotlin, Создание многоплатформенных проектов с Gradle - добавление зависимостей , но применимо к одиночной платформе.проекты также:

<...> зависимость project('...') от другого многоплатформенного проекта автоматически разрешается для соответствующей цели.Достаточно указать одну project('...') зависимость в зависимостях исходного набора, и компиляции, которые включают в себя исходный набор, получат соответствующий платформо-зависимый артефакт этого проекта, если он имеет совместимую цель.

Если это не происходит для вас, пожалуйста, опубликуйте журнал сбоя разрешения конкретной зависимости или сообщите о проблеме на https://kotl.in/issue.

0 голосов
/ 21 марта 2019

Я не уверен, является ли следующий подход рекомендуемым, или я упустил возможные проблемы, но мои проекты компилируются и все тесты проходят.

В Gradle вы можете добавить зависимости для конкретных конфигураций проекта:

dependencies {
    implementation project(path: ':some-library', configuration: 'configName')
}

Методом проб и ошибок я выяснил, что определение следующих конфигурационных зависимостей для каждого типа модуля платформы работает:

  • общее: configuration: 'archives'. Без этого конфигурация Gradle не выполняется, так как зависимости кода не обнаружены.

Без следующего сборка не удалась:

  • JVM: configuration: 'jvmDefault'
  • js: configuration: 'jsDefault'

Например, для модуля JS, как указано в вопросе:

dependencies {
    implementation project(path: ':some-library', configuration: 'jsDefault')
}
...