2016-03-21 6 views
0

Soweit ich weiß, ist der Zugriff auf streams.value.log nur im Kontext des Autoplugins verfügbar, wenn eine neue Aufgabe oder Einstellung über den Operator := erstellt wird.Entwurfsmuster für die Anmeldung bei einer scala SBT Autoplugin

Ich bin auf der Suche nach einem guten Muster oder vielleicht einige verbesserten Kenntnissen über den Kontext von streams.value.log so dass ich folgendes vermeiden:

  1. Passing stream.value.log in jede Funktionskette, z. B. GetBucket (..., Logger: sbt.Logger) => ParseBucketName (..., Logger: sbt.Logger) => GetBucketName (..., Logger: sbt.Logger) => etc ..

  2. mache ich etwas mit einem globalen wandelbar wie diese

    trait AWSPluginUtils 
    { 
    
        //mutable logger: don't have to pass sbt.logger through every function 
    
        private var _logger: Any = None 
    
        def setLogger(sbtLogger: Logger): Unit = { 
         _logger = sbtLogger 
        } 
    
        def getLogger(): Logger = { 
         _getLogger 
        } 
    
        lazy val _getLogger: Logger = _logger match { 
         case l: sbt.Logger => l 
        } 
    
        def infoLog(message: String): Unit = { 
        getLogger().info(message) 
        } 
    
        def debugLog(message: String): Unit = { 
        getLogger().info(message) 
        } 
    
        def errLog(message: String): Nothing = { 
        getLogger().error(message) 
        throw new RuntimeException(message) 
        } 
    } 
    
+0

Warum möchten Sie 1 vermeiden? Das ist die richtige Antwort, IMO. Wenn Sie das Boilerplate reduzieren möchten, können Sie die Logger- und impliziten Parameter Ihrer Funktionen festlegen. – sjrd

Antwort

0

I Implizite Parametern endete so, dass ich weitergeben müssen nicht explizit die streams.value.log durch Funktion Hierarchien, zB passieren.

trait PluginUtils { 

def debugLog(message: String)(implicit logger: Logger): Unit = { 
    logger.info(message) 
    } 


//auto plugin definition (with my trait) 
object doStuffPlugin extends AutoPlugin with PluginUtils { 


//in override of set settings 

private lazyval settings: Seq[Setting[_]] = Seq(
    doStuff in Global := { 
      implicit val logger: Logger = streams.value.log 
      doStuff(
      region = region.value, 
      ......... 


//function that I'm calling 
private def doStuff(region: String)(implicit logger: Logger) 
debugLog("doStuff now") } 

Jetzt kann ich (implicit logger: Logger) zu jeder Funktion in der Aufrufkette implizite Parameter fügen Sie einfach und ich muß nicht die Protokollierung Referenzen nach unten 4 Ebenen passieren.

Verwandte Themen