Build 使用SBT进行跨平台构建

Build 使用SBT进行跨平台构建,build,sbt,cross-platform,sbt-native-packager,Build,Sbt,Cross Platform,Sbt Native Packager,我目前正在测试SBT Native Packager,我期望的结果是为每个受支持的平台提供一个本机安装程序。显然,要做到这一点,特定于平台的SBT任务需要在该平台上运行 建造工作将由亚特兰西的竹子或JetBrains的团队城市完成 理想情况下,我只做一次编译和测试,并为打包任务重用相同的工件 用SBT实现这一点的好方法是什么 我能想到的一种方法是在任何平台上进行编译和测试,然后将它们发布到本地存储库。然后包会以某种方式使用这些。但是,这也需要更改包装,使其不依赖于编译任务等。TL;DR版本:使用

我目前正在测试SBT Native Packager,我期望的结果是为每个受支持的平台提供一个本机安装程序。显然,要做到这一点,特定于平台的SBT任务需要在该平台上运行

建造工作将由亚特兰西的竹子或JetBrains的团队城市完成

理想情况下,我只做一次编译和测试,并为打包任务重用相同的工件

用SBT实现这一点的好方法是什么


我能想到的一种方法是在任何平台上进行编译和测试,然后将它们发布到本地存储库。然后包会以某种方式使用这些。但是,这也需要更改包装,使其不依赖于编译任务等。

TL;DR版本:使用单独的sbt项目

正如您可能注意到的,该插件在各种平台上创建本机软件包。一次构建和测试主要工件的诀窍是将它们发布到工件服务器,然后有一个单独的项目来创建安装程序

如果您的项目每个平台只需要一个安装程序,那么您需要做的就是添加依赖项,设置
mainClass
键,并添加
enablePlugins(JDKPackagerPlugin)

enablePlugins(JDKPackagerPlugin)
名称:=“JDKPackagerPlugin示例”
版本:=“0.1.0”
组织机构:=“com.foo.bar”
libraryDependencies+=“com.foo.bar”%%“myProject”%%“0.1.0”
编译中的mainClass:=Some(“com.foo.bar.ExampleApp”)
//可选:提供应用程序文件关联
jdkPackagerAssociations:=Seq(
文件关联(“foobar”、“应用程序/foobar”、“foobar文件类型”),
文件关联(“barbaz”、“应用程序/barbaz”、“barbaz文件类型”、jdkAppIcon.value)
)
如果您的场景中每个平台需要多个安装程序(例如,命令行工具与GUI),我通常会构建一个项目,使其具有一个名为“打包”的子目录,其中包含一个独立的
build.xml
文件,聚合定义每个安装程序配置的独立子项目:

//子项目之间的通用设置。也可以使用
//特定于项目的“AutoPlugin”`
val baseSettings=Seq(
libraryDependencies+=“com.foo.bar”%%“myProject”%%“0.1.0”
)
//包装聚合项目
lazy val打包=项目
.in(文件(“.”)
.合计(a、b)
//具有CLI配置的项目
lazy val a=Project(id=“my Project cli”,base=file(“my Project cli”))
.设置(基本设置:*)
//具有GUI配置的项目
lazy val b=Project(id=“我的项目gui”,base=file(“我的项目gui”))
.设置(基本设置:*)
//根据需要创建用于调用子项目的任务
val packageSubs=taskKey[Seq[File]](“在子项目中构建包”)
(包装中的UBS):={
序号(
(a,通用)中的包装箱价值,
(packageBin.in(b,JDKPackager)).value
) 
}

我发现像这样分解安装程序配置有助于理清依赖关系和特定定制的效果。

在我开始使用IntelliJ之前,这是一个非常棒的解决方案。现在它总是无法加载打包,除非我在每次提交后发布。指定
.dependsOn(…)
是否有问题?如
a.dependsOn(b)
所示。我也使用IntelliJ,而且没有问题。事实上,我使用的有点不同。我有
a
b
生产jar,我的第一个构建计划将生产并发布这些jar。然后,我有单独的特定于平台的构建,这些构建调用
packaging/rpm:packageBin
等,将
a
b
中的工件作为依赖项。因此,除非
a
b
已经发布,否则
打包/更新
将失败。我对此感到厌倦,并深入IntelliJ SBT源代码,最终找到了这个。将
ideSkipProject:=true
添加到打包项目中非常有效。“显然,要做到这一点,特定于平台的SBT任务需要在该平台上运行。”这绝对不明显,这是包括“javapackager”在内的众多打包机的典型限制SBT Native Packager在后台使用,但我自己的基于Java的Packager可以在Windows下创建Native OS X捆绑包,在Mac OS X下创建GNU Linux DEB&RPM,在GNU Linux下创建Windows可执行安装程序:例如,在GNULinux下进行一些持续集成是可能的,同时目标是Windows和OSX。您可以使用ant4sbt调用JNDT。