Как сделать плагин sbt для плагина компилятора с поддержкой кросс-сборки?

У меня есть sbt-плагин, который обновляет параметры scalac, чтобы добавить плагин-компилятор. С выпуском Scala 2.11 мне нужно изменить версию плагина-компилятора в зависимости от версии scala, используемой в проекте пользователей.

Я понимаю, что SBT сам использует 2.10 независимо, поэтому я думаю, поэтому мой sbt-плагин должен быть скомпилирован только с помощью 2.10.

Однако я изменяю версию плагина compile-, который я передаю в сборку во время выполнения. На данный момент я это делаю:

val instrumentSettings: Seq[Setting[_]] = { Seq( libraryDependencies += "group" %% "artifact" % "version % "scope, ) }

Правильно ли это делать? У меня есть только один выпуск sbt-plugin (2.10) и он пытается найти правильную версию компилятора-плагина (либо 2.10, либо 2.11) во время выполнения.

Кроме того, сам sbt-plugin использует компилятор-плагин, поэтому я объявляю это в build.sbt как обычную зависимость. В этом случае sbt-plugin будет использовать только версию 2.10?

1 ответ

Я не совсем понимаю, каковы фактические вопросы, но вот некоторые мысли, которые пришли мне на ум:

  • Плагины sbt - это зависимые библиотеки в вашем проекте сборки, которые не будут влиять на ваш фактический код проекта или путь к классам. Итак, ваши плагины для серии sbt 0.13 опубликованы в Scala 2.10.
  • Плагины компилятора Scala - это банки, переданные в scalacOptions. sbt может управлять этим для вас, объявляя зависимости библиотек от "плагинов". См. Поддержка плагина компилятора.

Итак, что-то вроде этого должно работать:

val instrumentSettings: Seq[Def.Setting[_]] = Seq(
 libraryDependencies += "com.example" %% "foo_plugin" % "0.1.0" % "plugin",
 scalacOptons += ("-Pfoo:base-directory:" + (scalaSource in Compile).value.getAbsolutePath)
)

licensed under cc by-sa 3.0 with attribution.