2016-03-21 27 views
0

Anladığım kadarıyla, streams.value.log erişim, yalnızca yeni bir görev oluştururken veya := işlecini kullanarak ayar yaparken otomatik dökümanın bağlamında kullanılabilir.Bir scalada oturum açma için tasarım deseni SBT Autoplugin

Ben bu yüzden şu önleyebilirsiniz streams.value.log bağlamında iyi bir desen ya da belki bazı gelişmiş bilgi arıyorum:

  1. örneğin her fonksiyon zincirine stream.value.log geçirilmesi. GetBucket (..., logger: sbt.Logger) => ParseBucketName (..., logger: sbt.Logger) => GetBucketName (..., logger: sbt.Logger) => vb ..

  2. Ben, mesela açıkça geçmesine fonksiyon hiyerarşileri aracılığıyla streams.value.log geçmek zorunda kalmamak için Örtülü parametreler kullanılarak sona erdi bu

    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

Neden 1'den kaçınmak istersiniz? Bu doğru cevap, IMO. Kazan plakasını kısmak isterseniz, fonksiyonlarınızın 'logger' ve implicit parametrelerini yapabilirsiniz. – sjrd

cevap

0

gibi global değişken ile bir şeyler yapmak.

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") } 

Şimdi sadece çağrı zincirindeki herhangi işleve örtülü parametre (implicit logger: Logger) ekleyebilir ve ben 4 seviyeleri aşağı günlüğü başvuruları geçmesi gerekmez.

İlgili konular