2012-08-07 21 views
9

Giriş olarak bir lazy val setting = SettingKey[String] alan bir görevim var lazy val task = TaskKey[Unit]. Ayrıca, her bir yapılandırma kapsamı (setting in stage := "foo" ...) için setting için farklı değerler belirten bir build.sbt ve bir build.sbt dosya ve üç farklı bağımsız yapılandırma kapsamı var (setting in stage := "foo" ...).Sbt görevi nasıl oluşturulur belirli bir yapılandırma kapsamı kullanır?

beklediğim o görevi (ilgili yapılandırma kapsamından değerleri kullanın yapacak yapılandırma kapsamı öneki kullanılarak task arayarak örn >dev:task görev setting kullanmak yapacak komutu >stage:task kullanarak, dev den setting değerleri kullanın yapacak stage, ...) değerleri. Ancak, bu işe yaramıyor.

Ayarları belirli bir yapılandırma kapsamından kullanmak için task'u nasıl zorlayabilirim?

build.sbt:

setting := "default setting" 

setting in stage := "stage setting" 

setting in prod := "prod setting" 

Build.scala:

import sbt._ 
import Keys._ 

object TaskBuild extends Build { 
    val setting = SettingKey[String]("setting", "a simple string setting") 

    val task = TaskKey[Unit]("task", "a simple task experiment") 

    val taskTask = task <<= setting map { s: String => 
    println("Setting is: " + s) 
    } 

    lazy val dev = config("dev") describedAs("dev environment settings") 
    lazy val stage = config("stage") describedAs("stage environment settings") 
    lazy val prod = config("prod") describedAs("prod environment settings") 

    lazy val root = Project(
    "project", 
    file("."), 
    settings = Defaults.defaultSettings ++ Seq(taskTask) 
) 
    .configs(dev, stage, prod) 
} 

cevap

1

Ben sizin gibi Ayrıca ayrı görev tuşları tanımlanır

val devTaskSetting = task <<= setting in dev map { s: String => 
    println("Setting in Dev is: " + s) 
} 

gibi bir şey yazmaya gerek bu

val devTask = TaskKey[Unit]("task", "a simple task experiment") in dev 
val stageTask = TaskKey[Unit]("task", "a simple task experiment") in stage 
+0

Bu nedenle, çalışma zamanında hangi yapılandırma kapsamının kullanılacağına karar vermek mümkün değil, biri her olası yapılandırma için bir görev tanımlamalı mı? – esarbe

+0

Emin değilim. Ancak, "map" için _same function_ (görev gövdesi) 'ni birden çok kez kullanabilirsiniz. Burada uzman değil, belki daha fazla yorum için bekleyin. –

+0

Eh, bu bir başlangıç! Teşekkürler! : D – esarbe

5

How can i make an SBT key see settings for the current configuration?'da açıklandığı gibi, aşağıdaki gibi inConfig kullanabilirsiniz.

settings = Defaults.defaultSettings ++ Seq(taskTask) 

Buna: Bu

Değişim

settings = Defaults.defaultSettings ++ 
    Seq(taskTask) ++ 
    inConfig(dev)(Seq(taskTask)) ++ 
    inConfig(stage)(Seq(taskTask)) ++ 
    inConfig(prod)(Seq(taskTask)) 

ve işte budur daha derine kazma ilgileniyorsanız

$ sbt 
> task 
Setting is: default setting 
> dev:task 
Setting is: default setting 
> stage:task 
Setting is: stage setting 
> prod:task 
Setting is: prod setting 

, inConfig (http://harrah.github.io/xsbt/latest/api/index.html#sbt.Project$sbt.Project tanımlanır) "görevlerin/ayarların bir alt sınıfa" kopyalamak için bir işlev olarak farklı kapsamlar "(@MarkHarrah bunu açıklamaktadır). Ayrıca, http://eed3si9n.com/sbt-010-guide'a bir göz atın ve "kapsamları değiştirme" seçeneğine ilerleyin ve yazarın, inConfig(conf)(ss) "ayarların, yalnızca bir yapılandırma için henüz kapsama alınmadığında nasıl kullanılacağını belirlediğini" açıkladığı yere kaydırın.

İlgili konular