sbt + AutoPlugins =



sbt + AutoPlugins =

0 0


sbt-autoplugins-psug-talk


On Github pdalpra / sbt-autoplugins-psug-talk

sbt + AutoPlugins =

Pierre Dal-Pra / @pierre_dalpra / pdalpra Paris Scala User Group, 17/09/2015

Présentation

  • Devops @ Teads
  • Contributeur Gatling
  • Auteur/mainteneur de plugins SBT
  • « The sbt guy »

Plugins vs. AutoPlugins

Un plugin classique

						object MyPlugin extends Plugin {

  val myKey = settingKey[String]("my key")

  lazy val mySettings = Seq(
    myKey := "the value"
  )
}
					

Utilisation du plugin

						// project/plugins.sbt
addSbtPlugin("mygroupId" % "myplugin" % "1.0") // ~ libraryDependencies

// Dans le build
mySettings
					
Comment ça marche ? Import automatiquement ajouté :
						import MyPlugin._
					

Ça marche mais...

  • Que faut-il ajouter pour «activer» les settings du plugin ?
  • Pas de moyen simple de savoir sans aller voir les sources/une doc

Pas idéal pour les utilisateurs du plugin

Peut-on faire mieux ?

AutoPlugins

  • Introduits par sbt 0.13.5
  • mySettings enablePlugins(MyPlugin)
  • Remplaceront à terme les plugins «classiques»
  • Utilisés par sbt en interne
  • Offrent de nouvelles possibilités

AutoPlugins disponibles

						> plugins
In file:/Users/pierredalpra/Work/Teads/tools/service-platform-apps/
  sbt.plugins.IvyPlugin: enabled in ... // <= Activé
  sbt.plugins.JvmPlugin: enabled in ...
  sbt.plugins.CorePlugin: enabled in ...
  sbt.plugins.JUnitXmlReportPlugin: enabled in ...
  tv.teads.build.MavenPublishPlugin // <= Pas activé
					

AutoPlugins: plus structuré

  • Plus de import MyPlugin._
  • Un ensemble de méthodes à implémenter
    • trigger, requires
    • autoImport
    • projectConfigurations
    • projectSettings, buildSettings, globalSettings

Exemple

						object MyPlugin extends AutoPlugin {
  object autoImport {
    val myKey = settingKey[String]("my key")
  }

  override def projectSettings = Seq(
    myKey := "the value"
  )
}
					

trigger / requires

  • Contrôlent dépendances entre plugins et activation.
  • Interagissent, différentes combinaisons possibles

Exemple

Si:

						object MyPlugin extends AutoPlugin {
  def requires = BasePlugin
  def trigger = allRequirements
}
					

enablePlugin(BasePlugin) active aussi MyPlugin

Si:

						object MyPlugin extends AutoPlugin {
  def requires = BasePlugin
  def trigger = noTrigger // défaut
}
					

enablePlugin(MyPlugin) active aussi BasePlugin

Activation par défaut

						def trigger = allRequirements
					

seul suffit à activer le plugin par défaut dans un build

Ordre d'activation

  • Un seul moyen de contrôler l'ordre d'activation : requires
  • les dépendances sont initialisés avant les plugins qui en dépendent
  • Exemple vicieux : JvmPlugin

autoImport

  • Contrôle ce qui est importé auto. dans un fichier .sbt
  • Définition: un object ou une val qui pointe sur un object
  • Protip: préférer la deuxième solution

Mouais

						// => build .scala : import myOrg.myPlugin.MyPlugin.autoImport._ -> NOPE
object MyPlugin extends AutoPlugin {
  object autoImport {
    val myKey = ...
  }
}
					

Mieux

						object MyKeys {
  val myKey = ...
}
// => build .scala : import myOrg.myPlugin.MyKeys._ -> YEP
object MyPlugin extends AutoPlugin {
  val autoImport = MyKeys
}
					

projectConfigurations &*Settings

Respectivement, les configurations et settings/tasks qui seront automatiquement ajoutés au build une fois le plugin «activé».

Auto activation =

Cette capacité à activer automatiquement des plugins ajoute de nouveaux use cases !

Projet multi-module

  • AutoPlugins dans project/
  • + trigger = allRequirements
  • Partage de settings automatique

Multiples projets

  • Plugins «automatiques» ou non
  • Rassemblés dans un JAR
  • Uniformisation des projets facile

Exemple: teads-build-plugin

teads-build-plugin

  • Largement inspiré de gatling-build-plugin
  • 9 plugins: 5 automatiques, 4 manuels
  • Integré à tous les projets basés sur sbt chez Teads

Plugins automatiques

  • Conversion de plugins classiques en AutoPlugins
  • Configuration du prompt sbt
  • Config Scala (version, options compilo, etc...)
  • Recherche de nouvelles versions du plugin (sbt-updates)
  • Génération de metadata sur le projet (sbt-buildinfo + sbt-git)

Plugins manuels

Merci !

1 / 26
sbt + AutoPlugins = Pierre Dal-Pra / @pierre_dalpra / pdalpra Paris Scala User Group, 17/09/2015