如何使用Gradle应用程序/分发插件创建具有不同依赖关系的分发?

时间:2018-10-10 16:30:26

标签: gradle intellij-idea

我正在IntelliJ,Idea中构建一个小的Kotlin项目,并试图弄清楚如何为要支持的每个OS定制自定义多个tar / zip文件。

似乎分发插件(使用应用程序插件时已包含)是正确的方向,但我似乎无法弄清楚如何使它完成我想要的事情。

我已经阅读了here上的插件文档,但是对我来说,如何完成我想做的事情还不清楚。

这是一个示例build.gradle,它至少显示了我想要做什么的想法,即要具有基本的应用程序设置,然后对这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。我可以添加更多代码,并在Windows上执行相同的操作,但我只想在一个任务中生成所有代码,并将其存储在不同的tar / zip文件中。

1 个答案:

答案 0 :(得分:0)

Opal在我尝试过的问题注释中提供了一些非常好的建议,但最终,我无法真正得到想要的东西。

这是我当前的解决方法,几乎​​可以完成我希望使用发行插件完成的工作。

基本上,我创建一个package math; import java.util.Optional; import java.util.function.*; import java.util.stream.IntStream; import static java.lang.Math.*; public class IntegralJava8 { public interface Riemann extends BiFunction<Function<Double, Double>, Integer, BinaryOperator<Double>> { } public static void main(String args[]) { int N=100000; Riemann s = (f, n) -> (a, b) -> IntStream.range(0, n) .mapToDouble(i -> f.apply(a + i * ((b - a) / n)) * ((b - a) / n)).sum(); Optional<Double> gaussIntegral = Optional.of(s.apply(x -> exp(-pow(x, 2)), N).apply(-1000.0, 1000.0)); gaussIntegral.ifPresent(System.out::println); } } 属性,并将其“默认”设置为正在开发的OS,在本例中为macos。然后,我将所有常见的依赖项放在一个依赖项关闭中,并在groovy switch语句中添加os特定的东西。然后,我只是编写了一个简短的shell脚本,该脚本将osType属性覆盖了我想要支持的每个os,并调用gradle任务依次构建了每个。

这是我的build.gradle文件。

osType

这是我从Idea中的终端运行的shell脚本(buildAll.sh)。

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"