плагин sbt, который настраивает другой плагин

#sbt #sbt-native-packager

#sbt #sbt-native-packager

Вопрос:

У меня есть много проектов sbt, которые имеют общее поведение, добавляя настройки к собственным пакетам sbt.

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

Вот структура:

 object MyPlugin extends AutoPlugin {

  // my custom task 
  val customTask = Def.task { ...}

  override def requires: Plugins = JavaAppPackaging

  object autoImport {
     addSbtPlugin("com.typesafe.sbt" % "sbt-native-packager" % "1.1.1")
  }

  import autoImport._


  override def projectSettings: Seq[Setting[_]] =
     Seq(
        packageZipTarball in Universal <<= (packageZipTarball in Universal) dependsOn customTask
     )

  }
  

плагин компилируется нормально, но когда я импортирую его в свой проект следующим образом:

 lazy val myProj: Project = (project in file("."))
   .settings(MyPlugin.projectSettings: _*)
  

и я запускаю:

   sbt universal:packageZipTarball
  

Я получаю:

  References to undefined settings: 

     universal:packageZipTarball from universal:packageZipTarball       
  

Что мне нужно, чтобы это исправить?

Ответ №1:

Я думаю, вы добавляете плагин не в том месте. Чтобы добавить sbt-native-packager в ваш sbt-плагин, выполните следующие действия

build.sbt

Вам нужно добавить плагин туда

 sbtPlugin := true
addSbtPlugin("com.typesafe.sbt" % "sbt-native-packager" % "1.1.1")
  

AutoPlugin

Теперь вы можете получить доступ к native-packager в своем AutoPlugin.

 import com.typesafe.sbt.SbtNativePackager.Universal
import com.typesafe.sbt.NativePackagerKeys.packageZipTarball

object MyPlugin extends AutoPlugin {
   // ... your code
}
  

Отладка

В качестве общего совета: отладка неопределенных настроек и автоматических плагинов всегда должна начинаться с просмотра включенных автоматических плагинов. Вы можете перечислить все плагины в проекте, которые включены путем вызова sbt plugins .

Надеюсь, это поможет, Муки

Комментарии:

1. спасибо, Муки, ты указал мне правильное направление: на самом деле мне также нужно было импортировать собственный упаковщик в проект, который использует как мой пользовательский плагин, так и универсальный. Добавление. enablePlugins (JavaAppPackaging) исправил все. Спасибо!