2015-10-12 3 views
3

В настоящее время я тестирую собственный сканер SBT и мой желаемый результат - иметь встроенный установщик для каждой поддерживаемой платформы. Очевидно, что для этого необходимо выполнить определенные на платформе задачи SBT на этой платформе.Кросс-платформенная сборка с SBT

Сборка будет либо выполнена с помощью команды Atlasian's Bamboo, либо Team Team City.

В идеале я бы сделал только компиляцию и тесты один раз и повторно использовал те же артефакты для задач упаковки.

Что такое хороший способ приблизиться к этому с SBT?

Один из способов, который я могу представить, - это выполнить компиляцию и тестирование на любой платформе, а затем опубликовать их в локальном репозитории. Тогда пакет каким-то образом их использовал. Однако это также потребует замены упаковки, чтобы она не зависела от задачи компиляции и т. Д.

+0

«Очевидно, для этого конкретные задачи SBT для платформы должны будут работать на этой платформе». Это совершенно не очевидно, это типичное ограничение множества пакетов, в том числе «javapackager», используемое под капотом SBT Native Packager, но мой собственный Java-упаковщик может создавать собственные пакеты OS X под Windows, GNU Linux DEB & RPM в Mac OS X и Windows-исполняемые установщики Windows под GNU Linux: http://tuer.sourceforge.net/en/documentation/#jndt. Например, можно выполнить некоторую непрерывную интеграцию в GNU Linux, ориентируясь на Windows и OS X. Вы можете вызвать JNDT с ant4sbt. – gouessej

ответ

3

TL; DR версия: использовать отдельные проекты sbt.

Как вы, вероятно, отметили, плагин JDKPackager создает собственные пакеты на разных платформах. Уловкой для создания и тестирования первичных артефактов является публикация их на сервере артефактов, а затем отдельный проект для создания установщика.

Если вам ваш проект нужен только один установщик каждой платформы, то все, что вам нужно нужно сделать, это добавить зависимость, установите ключ mainClass и добавьте 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) 
) 

Если у вас есть сценарий где вам нужно несколько инсталляторов на платформу (например, инструменты командной строки или графический интерфейс), я обычно структурирую проект, чтобы иметь подкаталог под названием «упаковка» с автономным файлом build.xml, объединяющий отдельные подпроекты, определяющие каждую конфигурацию установщика:

// 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 
) 
} 

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

+0

Это было действительно потрясающее решение, пока я не начал использовать IntelliJ. Теперь он всегда не загружает упаковку, если я не публикую ее после каждой фиксации. – Steiny

+0

Это проблема с заданием '.dependsOn (...)'? как в 'a.dependsOn (b)'. Я тоже использую IntelliJ, и у меня не было проблем. – metasim

+0

На самом деле то, что у меня есть, немного отличается. У меня есть '' и 'b' производят JAR, которые мой первый план сборки будет производить и публиковать. Затем у меня есть отдельные сборные платформы, которые называет 'упаковка/rpm: packageBin' и т. Д., Которые имеют артефакты из' a' и 'b' в качестве зависимостей. Поэтому 'упаковка/обновление' завершится неудачей, если не будут опубликованы' a' и 'b'. – Steiny