Cross platform build with SBT

前端 未结 1 1264
小鲜肉
小鲜肉 2020-12-19 21:37

I\'m currently testing out SBT Native Packager and my desired result is to have a native installer for each supported platform. Obviously to do this the platform specific SB

相关标签:
1条回答
  • 2020-12-19 22:24

    TL;DR version: use separate sbt projects.

    As you probably noted, the JDKPackager plugin creates native packages on the various platforms. The trick to building and testing the primary artifacts once is to publish them to an artifact server, and then have a separate project for creating the installer.

    If you your project only needs one installer per platform, then all you should need to do is add the dependency, set the mainClass key, and add enablePlugins(JDKPackagerPlugin):

    enablePlugins(JDKPackagerPlugin)
    
    name := "JDKPackagerPlugin Example"
    
    version := "0.1.0"
    
    organization := "com.foo.bar"
    
    libraryDependencies += "com.foo.bar" %% "myProject" % "0.1.0"
    
    mainClass in Compile := Some("com.foo.bar.ExampleApp")
    
    // Optional: provide application file associations
    jdkPackagerAssociations := Seq(
        FileAssociation("foobar", "application/foobar", "Foobar file type"),
        FileAssociation("barbaz", "application/barbaz", "Barbaz file type", jdkAppIcon.value)
    )
    

    If you have a scenario where you need multiple installers per platform (e.g. command-line tools vs. GUI), I typically structure a project to have a subdirectory called "packaging" with a stand-alone build.xml file, aggregating separate sub-projects defining each installer configuration:

    // Settings common across subprojects. Could also do this with a 
    // project-specific `AutoPlugin`
    val baseSettings = Seq(
        libraryDependencies += "com.foo.bar" %% "myProject" % "0.1.0"
    )
    
    // The packaging aggregation project
    lazy val packaging = project
       .in(file("."))
       .aggregate(a, b)
    
    // Project with CLI configuration
    lazy val a = Project(id = "my-project-cli", base = file("my-project-cli"))
      .settings(baseSettings: _*)
    
    // Project with GUI configuration    
    lazy val b = Project(id = "my-project-gui", base = file("my-project-gui"))
      .settings(baseSettings: _*)
    
    // Create a task for invoking the sub-projects as needed
    val packageSubs = taskKey[Seq[File]]("Build packages in subprojects")
    (packageSubs in packaging) := {
      Seq(
        (packageBin.in(a, Universal)).value,
        (packageBin.in(b, JDKPackager)).value
      ) 
    }
    

    I find breaking up the installer configurations like this helps keep straight the dependencies, and effects of specific customizations.

    0 讨论(0)
提交回复
热议问题