Статьи

Легко кросс-компилировать и выпускать проекты Scala с помощью sbt

Отсутствие совместимости Scala

Хорошо, давайте покончим с этим — Scala не совместим двоично между второстепенными версиями (где под минорным я подразумеваю: MAJOR.MINOR.UPDATE ). Это поднимает очевидную проблему, например, что пользователи вашей библиотеки могут быть распределены между 2.9.2 и 2.10.0. И хотя ваша библиотека будет нормально работать с любой из этих версий, вам придется перекомпилировать и переиздать ее два раза — для этих пользователей.

Звучит как боль, не так ли? Ну, это так. В настоящее время экосистема Scala борется с этой проблемой путем стабилизации самой Scala, и библиотеки действительно выпускают гораздо быстрее новых выпусков Scala, чем раньше. Давайте посмотрим, как мы можем донести мою библиотеку scala-rainbow новым пользователям с минимальной болью, насколько это возможно, не так ли?

Целью является:

  • Скомпилируйте проект, используя 2 (или более) версии Scala ,
  • Развертывание всех в хранилище Sonatype ОСС,
  • сделать все это, используя только одну команду .

Подготовьте sbt плагины

Есть несколько плагинов, с которыми нам нужно pimp sbt для достижения нашей цели. Первый — это  xsbt-gpg-plugin,  который дает нам доступ к GPG из SBT. Добавить его в проект (или глобальные настройки) так же просто, как добавить эти строки в project / plugins.sbt ( обратите внимание на пустые строки, они важны — действительно):


// plugins.sbt

    resolvers += Resolver.url("sbt-plugin-releases",
      new URL("http://scalasbt.artifactoryonline.com/scalasbt/sbt-plugin-releases/"))(Resolver.ivyStylePatterns)
     
    addSbtPlugin("com.jsuereth" % "xsbt-gpg-plugin" % "0.6")

Затем вы захотите сгенерировать ваш ключ pgp, который мы будем использовать для подписи вашего JAR библиотеки (Sonatype требует от нас этого). Вы можете либо следовать тому, как плагин делает это, как объяснено здесь, либо делать это способом GPG, который действительно хорошо описан на этой странице руководства по  Ubuntu .

После того, как вы создали свой ключ и загрузили открытый ключ, убедитесь, что версия ключа «asc» (об этом читайте в руководстве по ubuntu) находится (или является символической ссылкой) в:

~/.sbt/gpg/my_funky_key.asc

Так как это место, плагин sbt gpg будет искать ключи для подписи ваших JAR-файлов.

Кросс-компиляция

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


// Build.scala

    val buildSettings = Defaults.defaultSettings ++ Seq(
      organization := "pl.project13.scala",
      name := "rainbow",
      version := "0.1",
      scalaVersion := "2.10.0-M3",
      crossScalaVersions := Seq("2.9.1", "2.9.2", "2.10.0-M3"),
      libraryDependencies ++= dependencies
    )

Обратите внимание, что прямо рядом с типичным параметром «scalaVersion» мы используем «crossScalaVersions», где мы определяем, с какими другими версиями Scala эта библиотека должна быть скомпилирована и выпущена. Это будет использоваться во время пакета, а также публиковать команды.

Вышеуказанные buildSettings используются так же в вашем проекте (на случай, если вы забыли):


// Build.scala

     
    lazy val root = Project (
      "rainbow",
      file("."),
      settings = buildSettings ++ sonatypeSettings ++
        Seq(/*…*/)
    )

Где sonatypeSettings — это образец XML, содержащий такие вещи, как ваш URL-адрес SCM, лицензия и так далее. Если вы застряли в создании Build.scala, взгляните на Build.scala из scala-rainbow , поскольку он «настолько прост, насколько это возможно» ?

С точки зрения конфигурации Sonatype, просто посмотрите на эту вики-страницу, что вам нужно настроить — или просто обратитесь к связанному выше Build.scala. Я не буду вдаваться в подробности об этом, так как это уже хорошо освещено в Интернете, не так много, как перекрестное построение… ?

Давайте скомпилируем + опубликуем!

Ключевой элемент этого абзаца уже немного подпорчен его названием. Команда, которую мы будем использовать для выполнения всех 3 шагов, необходимых для развертывания нашей библиотеки, для 3 версий Scala в sonatype:

+ publish

Знак плюс перед командой означает «для всех версий Scala», вы можете прочитать больше о Cross Building на вики-странице SBT .

И как небольшой аппетит, вот как будет выглядеть вывод (обрезано ;-)):


# пример вывода
> + publish
  Setting version to 2.9.1
  …
  [success] Total time: 0 s, completed Sep 27, 2012 12:16:52 AM   
  Setting version to 2.9.2
  …
  [success] Total time: 2 s, completed Sep 27, 2012 12:16:54 AM
  Setting version to 2.10.0-M3
  …
  [success] Total time: 0 s, completed Sep 27, 2012 12:16:54 AM
  Setting version to 2.10.0-M3
  >

Как видите, всего одна команда, но она запускается для всех версий Scala, и SBT позаботился о переключении всех версий Scala и выполнении этих задач.

Сказав это … В настоящее время очень легко кросс-компилировать ваши проекты для поддержки нескольких версий Scala. Если вы кодируете библиотеку — обязательно включите эти конфигурации в свой Build!