我正在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文件中。
答案 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"