Используйте подпроекты Gradle с мультиплатформой Kotlin

Я использую многоплатформенную платформу Kotlin (JVM & JS), которая в IDEA создает три проекта: demo , demo-js и demo-jvm .

Я хотел бы разделить общий код на более подпроекты / подмодули. Предположим, я добавляю commonmod ; как мне его скомпилировать?

Ошибка прямо сейчас, для выполнения gradle run -p demo-jvm :

 demo/demo-js/src/main/kotlin/demo/commonmod/example.kt: (3, 12): Actual function 'getPlatform' has no corresponding expected declaration 

но я думаю, что делаю это принципиально неправильно, так как я не знаю, что должно зависеть от того, что (хотя я пробовал довольно много итераций). Если я разрешу эту ошибку, я получу другие, а затем другие, пока я не вернусь к этому.


В качестве минимального, но все еще большого примера , у меня есть:

demo / settings.gradle :

 rootProject.name = 'demo' include 'demo-jvm', 'demo-js', 'commonmod' 

demo / build.gradle :

 buildscript { ... } apply plugin: 'kotlin-platform-common' repositories { mavenCentral() } dependencies { compile "org.jetbrains.kotlin:kotlin-stdlib-common:$kotlin_version" testCompile "org.jetbrains.kotlin:kotlin-test-annotations-common:$kotlin_version" testCompile "org.jetbrains.kotlin:kotlin-test-common:$kotlin_version" compile project(':commonmod') } 

demo / demo-jvm / settings.gradle :

 rootProject.name = 'demo' 

demo / demo-jvm / build.gradle :

 buildscript { ... } apply plugin: 'kotlin-platform-jvm' apply plugin: 'application' repositories { mavenCentral() } mainClassName = "demo.MainKt" dependencies { compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" expectedBy project(":") testCompile "junit:junit:4.12" testCompile "org.jetbrains.kotlin:kotlin-test-junit:$kotlin_version" testCompile "org.jetbrains.kotlin:kotlin-test:$kotlin_version" } 

demo / demo-js / settings.gradle :

 rootProject.name = 'demo' 

demo / demo-js / build.gradle :

 buildscript { ... } apply plugin: 'kotlin-platform-js' repositories { mavenCentral() } dependencies { compile "org.jetbrains.kotlin:kotlin-stdlib-js:$kotlin_version" expectedBy project(":") testCompile "org.jetbrains.kotlin:kotlin-test-js:$kotlin_version" } 

demo / commonmod / settings.gradle :

 rootProject.name = 'demo' include 'demo-jvm', 'demo-js' 

demo / commonmod / build.gradle :

 buildscript { ... } apply plugin: 'kotlin-platform-common' repositories { mavenCentral() } dependencies { compile "org.jetbrains.kotlin:kotlin-stdlib-common:$kotlin_version" testCompile "org.jetbrains.kotlin:kotlin-test-annotations-common:$kotlin_version" testCompile "org.jetbrains.kotlin:kotlin-test-common:$kotlin_version" compile project(':demo-js') compile project(':demo-jvm') } 

    Я заметил некоторые проблемы с моим подходом, этот ответ нуждается в улучшениях!

    Мне потребовалось гораздо больше попыток, чем хотелось бы, но я понял, надеюсь, что это поможет кому-то!

    Минимальный пример доступен на Github

    демо / settings.gradle ::

     buildscript { ext.kotlin_version = '1.2.10' repositories { mavenCentral() maven { url "https://dl.bintray.com/jetbrains/kotlin-native-dependencies" } } dependencies { classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" classpath "org.jetbrains.kotlin:kotlin-native-gradle-plugin:+" } } apply plugin: 'kotlin-platform-common' repositories { mavenCentral() } dependencies { compile project(':commonmod') } allprojects { group 'demo' version '1.0.0' /* Merge all the build directories into one. */ buildDir = rootProject.file("build") } 

    demo / demo-jvm.gradle (settings.gradle удалено для этого подпроекта) ::

     apply plugin: 'kotlin-platform-jvm' apply plugin: 'application' repositories { mavenCentral() } mainClassName = "demo.MainKt" jar { manifest { attributes 'Main-Class': mainClassName } } dependencies { expectedBy project(":commonmod") compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" testCompile "junit:junit:4.12" testCompile "org.jetbrains.kotlin:kotlin-test-junit:$kotlin_version" testCompile "org.jetbrains.kotlin:kotlin-test:$kotlin_version" } 

    demo / demo-js.gradle (settings.gradle удалено для этого подпроекта) ::

     buildscript { repositories { maven { url "https://plugins.gradle.org/m2/" } } dependencies { classpath "com.moowork.gradle:gradle-node-plugin:1.2.0" } } apply plugin: 'kotlin-platform-js' apply plugin: 'com.moowork.node' compileKotlin2Js { kotlinOptions { moduleKind = "umd" sourceMap = true metaInfo = true } } repositories { mavenCentral() } dependencies { expectedBy project(":commonmod") compile "org.jetbrains.kotlin:kotlin-stdlib-js:$kotlin_version" testCompile "org.jetbrains.kotlin:kotlin-test-js:$kotlin_version" } task run(type: NodeTask) { description = "Run the Javascript code using NodeJS (no browser)" dependsOn build script = file("${rootProject.buildDir.path}/classes/main/demo-js.js") } 

    demo / commonmod.gradle (settings.gradle удалено для этого подпроекта) ::

     apply plugin: 'kotlin-platform-common' repositories { mavenCentral() } dependencies { compile "org.jetbrains.kotlin:kotlin-stdlib-common:$kotlin_version" testCompile "org.jetbrains.kotlin:kotlin-test-annotations-common:$kotlin_version" testCompile "org.jetbrains.kotlin:kotlin-test-common:$kotlin_version" compile project(':demo-js') compile project(':demo-jvm') } 

    Теперь обе платформы можно запускать (один за другим) с помощью ::

     gradle run 
    Intereting Posts
    NullPointerException в Android Studio 3 Beta 1 Значение поля суммы JOOQ: BigDecimal to Int почему SomeClass :: class – это KClass <SomeClass>, но this :: class – это KClass <out SomeClass> Как реорганизовать представление, чтобы разрешить фильтрацию элементов, привязанных к наблюдаемомуArrayList, внутри приложения tornadofx Почему Kotlin не позволяет мне использовать расширение writeText? Как использовать Realm в библиотеке Строка к растровому изображению в Котлине Как конвертировать JS-код в Kotlin без ключевого слова 'new' Не удалось «findViewById» в Котлине. Получение ошибки «Ошибка ввода типа» ClassNotFoundException при последующих сборках после преобразования MainActivity в Kotlin Как указать версию Kotlin? Могу ли я использовать сторонние java-библиотеки (.jar) для разработки Android с Kotlin? Невозможно скомпилировать функцию расширения с параметром типа reified в Kotlin Android Kotlin добавляет элементы в ListView из Spinner Как передать Retrofit onResponse Data на активность?