Présentation
- Devops @ Teads
- Contributeur Gatling
- Auteur/mainteneur de plugins SBT
- « The sbt guy »
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
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)
1 / 26
sbt + AutoPlugins =
Pierre Dal-Pra / @pierre_dalpra / pdalpra
Paris Scala User Group, 17/09/2015