2016-01-25 14 views
7

別のsharedプロジェクトを使用して、サーバー(JVM)とクライアント(JS)の間でコードの一部を共有します。 Mavenを使ってsolutionを見たことがありますが、これをGradleプロジェクトに変換する方法がわかりません。また、official guideには共有プロジェクトの例はありません。だから、どのように最小限のbuild.gradleは、そのような設定と見えるだろうか?Gradleを使用したKotlinサーバーとクライアントプロジェクト間の共有コード

答えて

2

別のKotlinプロジェクトからの依存関係を持つKotlin2JSプロジェクトを構築するには、何らかの方法でソースをコピーする必要があるようです。これを行う1つの方法は、Kotlin2JSプロジェクトのソースセットディレクトリにKotlinプロジェクトのソースディレクトリを追加することです。

これはproject範囲に以下の行を行うことができます。

sourceSets { 
    main.kotlin.srcDirs += project(':shared').sourceSets.main.kotlin.srcDirs 
} 

プロジェクト全体の構造を参照してください:settings.gradle

root/ 
    shared/ 
    src/main/kotlin 
    build.gradle 
    client/ 
    src/main/kotlin 
    server/ 
    src/main/kotlin 
    build.gradle 
    settings.gradle 

include 'shared', 'server', 'client' 

そしてbuild.gradle中を:

group 'com.example.multiproject' 
version '1.0-SNAPSHOT' 

buildscript { 
    repositories { 
     mavenCentral() 
    } 
    dependencies { 
     classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.0.0-beta-4589" 
    } 
} 

subprojects { 
    repositories { 
     mavenCentral() 
    } 
} 

project(':client') { 
    evaluationDependsOn(':shared') 

    apply plugin: 'kotlin2js' 
    compileKotlin2Js.kotlinOptions.sourceMap = true 
    compileKotlin2Js.kotlinOptions.outputFile = "${projectDir}/web/js/app.js" 
    compileKotlin2Js.kotlinOptions.suppressWarnings = true 
    compileKotlin2Js.kotlinOptions.verbose = true 

    sourceSets { 
     main.kotlin.srcDirs += project(':shared').sourceSets.main.kotlin.srcDirs 
    } 
    dependencies { 
     compile 'org.jetbrains.kotlin:kotlin-js-library:1.0.0-beta-4589' 
    } 
} 

project(':server') { 
    apply plugin: 'kotlin' 
    dependencies { 
     compile 'org.jetbrains.kotlin:kotlin-stdlib:1.0.0-beta-4589' 
     compile project(':shared') 
    } 
} 

sharedプロジェクトは、独自のbuild.gradleを含まなければならないことに注意してください。

+0

この設定を試しましたか?私はすでにマルチプロジェクトセットアップを作成する方法を知っていましたが、それはサーバーとクライアントの両方が異なるプラグインとライブラリに依存しているようです。私が正しいとすれば、Kotlinクライアントプロジェクトは、 'kotlin'プラグインと' kotlin-stdlib'の代わりに 'kotlin2js'プラグインと' kotlin-js-library'を使うべきです。私は現在、マルチプロジェクトのアプローチを試みていますが、A) 'idea'プラグインを使用すると、IntelliJにはソースフォルダが表示されないため、多くの手動設定が必要です。B)Gradleプロジェクトとしてインポートする場合、リンクされた。私は完全に立ち往生したときにスクリプトをアップロードします。 – JustACluelessNewbie

+0

@JustACluelessNewbie、私は同意する、私はJSの瞬間を逃した。buildscriptのkotlin2jsプラグイン依存関係を教えてください。私は、サブプロジェクトではなく、異なるプロジェクトに異なるプラグインを使用するだけで、私が書いたものに似ていると思います。 – hotkey

+0

@JustACluelessNewbie、私は答えを更新しました。このビルドスクリプトは私の側で設定され、正しいと思われますが、 'client'が正しく構築されているかどうかをチェックする方法はわかりません。プロジェクトの現在のバージョンを確認してください。しかし、 'client'と' server'は 'shared'のクラスを使うことができます。 – hotkey

3

完全を期すため、これは私がホットキーと、かなり同時に作成された設定です。

メインsettings.gradleinclude 'shared', 'client', 'server'

メインbuild.gradle

buildscript { 
    ext { 
    kotlinVer = '1.0.0-beta-4589' 
    } 
    repositories { 
    mavenCentral() 
    maven { 
     url 'http://oss.sonatype.org/content/repositories/snapshots' 
    } 
    } 
    dependencies { 
    classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlinVer" 
    } 
} 

allprojects { 
    apply plugin: 'idea' 
    group = 'some.company' 
    version = '0.0.1' 

    ext { 
    kotlinVer = '1.0.0-beta-4589' 
    // Lib versions go there. 
    } 
    repositories { 
    mavenLocal() 
    mavenCentral() 
    maven { url "https://oss.sonatype.org/content/repositories/snapshots/" } 
    maven { url "https://oss.sonatype.org/content/repositories/releases/" } 
    } 
} 

project('shared') { 
    apply plugin: 'kotlin' 
} 

project('server') { 
    apply plugin: 'kotlin' 
    apply plugin: 'application' 

    mainClassName = 'some.company.Main' 
    dependencies { 
    compile project(':shared') 
    } 
} 

project('client') { 
    apply plugin: 'kotlin2js' 
    dependencies { 
    compile project(':shared') 
    } 
} 

クライアントbuild.gradle

apply plugin: 'kotlin2js' 

compileKotlin2Js { 
    kotlinOptions.outputFile = "server/src/main/resources/static/js/app.js" 
    kotlinOptions.sourceMap = true 
} 

sourceSets { 
    main.kotlin.srcDirs += '../shared/src/main/kotlin' 
    // hotkey's solution: 
    // main.kotlin.srcDirs += project(':shared').sourceSets.main.kotlin.srcDirs 
} 

dependencies { 
    compile "org.jetbrains.kotlin:kotlin-js-library:$kotlinVer" 
} 

サーバーbuild.gradle

apply plugin: 'kotlin' 

sourceCompatibility = 1.7 
targetCompatibility = 1.7 

dependencies { 
    // Libs go there. 
    compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlinVer" 
    testCompile "org.jetbrains.kotlin:kotlin-test-junit:$kotlinVer" 
} 

共有プロジェクトのbuild.gradleapply plugin: 'kotlin'が含まれていると、よく、私は共有ライブラリを使用すると、(多くの場合、または必要な)単純であるかどうかわからないんだけど、私はそれもとどまることができると思います空の。

gradle client:buildは、サーバーの静的リソースフォルダにJavaScriptファイルを生成します。 gradle ideaは、正しくリンクされた依存関係とソースフォルダを持つIntelliJプロジェクトを生成します(デフォルトの名前が使用されている限り - src/main/kotlinなど;カスタムソースディレクトリの公式のKotlin Gradleマニュアルを参照)。

関連する問題