Как создать дистрибутивы с разными зависимостями, используя плагин приложения / распространения Gradle? - PullRequest
0 голосов
/ 10 октября 2018

Я строю небольшой проект Kotlin в IntelliJ, Idea, и пытаюсь выяснить, как создать несколько файлов tar / zip с настройками для каждой ОС, которую я хочу поддерживать.

Похоже на плагин распространения(который включается при использовании плагина приложения) - правильное направление, но я не могу понять, как заставить его делать то, что я хочу.

Я прочитал документацию по плагину,который можно найти здесь , но мне не совсем понятно, как выполнить то, что я хочу сделать.

Вот пример build.gradle, который показывает хотя бы идею того, что я хочухочу сделать, то есть иметь базовую настройку приложения, а затем иметь небольшую адаптацию для каждой из 3 ОС.

Например, для каждой из 3 ОС требуется уникальная версия библиотеки SWT.Для версии macos требуется определенный параметр JVM, а для версии linux мне нужно настроить скрипт запуска, чтобы добавить некоторые переменные среды.

Возможно ли это с плагином распространения?Если нет, то может ли кто-то предложить другое решение?

plugins {
    id 'org.jetbrains.kotlin.jvm' version '1.2.61'
}

apply plugin: 'application'

mainClassName = "MainKt"

version '1.0-SNAPSHOT'

repositories {
    // my common required repos
}

dependencies {
    // my common dependencies    
}

distributions {
    macos {
        contents { from 'src' }
        applicationDefaultJvmArgs.push("-XstartOnFirstThread")
        dependencies {
            implementation "org.eclipse.swt:org.eclipse.swt.cocoa.macosx.x86_64:4.5.2"
        }
    }
    linux {
        contents { from 'src' }
        dependencies {
            implementation "org.eclipse.swt:org.eclipse.swt.gtk.linux.x86_64:4.5.2"
        }
        startScripts.doLast {
            def lines = unixScript.text.readLines()
            println lines.add(1, '# add some stuff')
            println lines.add(2, '# add some more stuff')
            unixScript.text = lines.join("\n")
        }
    }
    windows {
        contents { from 'src' }
        dependencies {
            implementation "org.eclipse.swt:org.eclipse.swt.win32.win32.x86_64:4.5.2"
        }
    }
}



compileKotlin {
    kotlinOptions.jvmTarget = "1.8"
}
compileTestKotlin {
    kotlinOptions.jvmTarget = "1.8"
}

Обновление

Это то, чем я сейчас занимаюсь, но я бы хотел улучшить это.

У меня естьпеременная

def deploy = false
if (!deploy) {
    applicationDefaultJvmArgs.push("-XstartOnFirstThread")
    dependencies {
        implementation "org.eclipse.swt:org.eclipse.swt.cocoa.macosx.x86_64:4.5.2"
    }
} else {
    dependencies {
        implementation "org.eclipse.swt:org.eclipse.swt.gtk.linux.x86_64:4.5.2"
    }
    startScripts.doLast {
        def lines = unixScript.text.readLines()
        println lines.add(1, 'export foo=foo')
        println lines.add(2, 'export bar=bar')
    }
}

Сейчас я занимаюсь разработкой на своем Mac и установил для deploy значение false.Когда я хочу сгенерировать дистрибутив для linux, я устанавливаю для deploy значение true.Я мог бы добавить больше кода и сделать то же самое для окон, но я хотел бы просто сгенерировать весь код в одной задаче и поместить его в разные файлы tar / zip.

1 Ответ

0 голосов
/ 13 октября 2018

Опал предоставил несколько очень хороших предложений в комментариях к вопросу, которые я попробовал, но в итоге я не смог получить то, что хотел.

Вот мое текущее решение, оно в значительной степени делает то, чтоЯ надеялся, что мог бы сделать это с помощью плагина дистрибутива.

По сути, я создаю свойство osType и устанавливаю его «по умолчанию» для ОС, на которой я разрабатываю, в данном случае макросы.Затем у меня есть все мои общие зависимости в одном закрытии зависимости, и я добавляю специфические вещи для os в инструкцию groovy switch.Затем я просто запрограммировал короткий сценарий оболочки, который переопределяет свойство osType для каждой ОС, которую я хочу поддерживать, и вызывает задачу gradle для сборки каждой из них по очереди.

Вот мой файл build.gradle.

plugins {
    id 'org.jetbrains.kotlin.jvm' version '1.2.61'
    id 'application'
}

ext {
    swtVersion = "4.5.2"
}

ext.osType = project.properties['osType'] ?: 'macos'
println "building for ${osType}"

mainClassName = "MainKt"

repositories {
    mavenCentral()
    maven { url "http://maven-eclipse.github.io/maven" }
}

dependencies {
    implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8"
}

switch(osType) {
    case 'macos':
        dependencies {
            implementation "org.eclipse.swt:org.eclipse.swt.cocoa.macosx.x86_64:${swtVersion}"
        }
        applicationDefaultJvmArgs.push("-XstartOnFirstThread")
        break
    case 'linux':
        dependencies {
            implementation "org.eclipse.swt:org.eclipse.swt.gtk.linux.x86_64:${swtVersion}"
        }
        startScripts.doLast {
            def lines = unixScript.text.readLines()
            println lines.add(1, 'export FOO=foo')
            println lines.add(2, 'export BAR=bar')
            unixScript.text = lines.join("\n")
        }
        break
    case 'windows':
        dependencies {
            implementation "org.eclipse.swt:org.eclipse.swt.win32.win32.x86_64:${swtVersion}"
        }
}

version "${osType}-1.0-SNAPSHOT"

compileKotlin {
    kotlinOptions.jvmTarget = "1.8"
}
compileTestKotlin {
    kotlinOptions.jvmTarget = "1.8"

и вот мой сценарий оболочки (buildAll.sh), который я запускаю из терминала в Idea.

#!/bin/sh
./gradlew -PosType=macos distTar
./gradlew -PosType=linux distTar
./gradlew -PosType=windows distTar
./gradlew -PosType=windows distZip
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...