2012-08-07 2 views
9

을 입력으로 사용하는 lazy val task = TaskKey[Unit] 작업이 있습니다. 또한 각각의 구성 범위 (setting in stage := "foo" ...)에 대해 setting에 다른 값을 지정하는 세 가지 다른 독립 구성 범위 (config("dev"), config("stage"), config("prod")) 및 build.sbt 파일이 있습니다.sbt 작업을 특정 구성 범위를 사용하는 방법?

내가 예상하는 작업이 (각각의 설정 범위에서 값을 사용하여 만드는 것이 설정 범위 접두어를 사용하여 task를 호출 예를 들어 >dev:task 작업이 작업은 setting를 사용 할 것 명령 >stage:task을 사용하여, dev에서 setting 값을 사용 할 것 stage의 값 ...). 그러나 이것은 효과가없는 것 같습니다.

task에 특정 구성 범위의 설정을 강제로 적용하려면 어떻게해야합니까?

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

답변

1

난 당신처럼 당신은 또한 별도의 작업 키를 정의 할 수 있습니다

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

같은 것을 쓸 필요가 있다고 생각 이

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

그래서 런타임에 사용할 구성 범위를 결정할 수 없습니다. 가능한 구성마다 작업을 정의해야합니까? – esarbe

+0

잘 모르겠습니다. 하지만'map '에 대해 _same function_ (작업 본문)을 여러 번 사용할 수 있습니다. 여기 전문가가 아니므로 더 많은 댓글을 기다릴 수도 있습니다. –

+0

글쎄, 시작이야! 감사! :디 – esarbe

5

How can i make an SBT key see settings for the current configuration?에서 설명한대로 inConfig을 다음과 같이 사용할 수 있습니다.

settings = Defaults.defaultSettings ++ Seq(taskTask) 

이것 :이

변경

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

봐라은 : 당신이 더 깊이 파고에 관심이 있다면

$ 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에 정의되어 있습니다)를 "작업/설정의 하위 그래프를 다른 범위 "(@MarkHarrah가 설명하는대로). 또한 http://eed3si9n.com/sbt-010-guide을 살펴보고 "범위 변경"까지 스크롤하여 inConfig(conf)(ss)이 "범위를 지정하지 않은 경우에만 설정으로 들어갑니다"라는 설명을 작성자에게 설명합니다.

관련 문제