2012-08-07 31 views
9

Tôi có một nhiệm vụ lazy val task = TaskKey[Unit] cần có lazy val setting = SettingKey[String] làm đầu vào. Tôi cũng có ba phạm vi cấu hình độc lập khác nhau (config("dev"), config("stage"), config("prod")) và tệp build.sbt chỉ định các giá trị khác nhau cho setting cho mỗi phạm vi cấu hình (setting in stage := "foo" ...).Cách thực hiện tác vụ sbt sử dụng phạm vi cấu hình cụ thể?

tôi mong đợi rằng gọi task sử dụng tiền tố phạm vi cấu hình sẽ làm cho công việc sử dụng các giá trị từ phạm vi cấu hình tương ứng (ví dụ >dev:task sẽ làm nhiệm vụ sử dụng setting giá trị từ dev, sử dụng lệnh >stage:task sẽ làm nhiệm vụ sử dụng setting giá trị từ stage, ...). Tuy nhiên, điều này dường như không hoạt động.

Làm cách nào để bắt buộc task sử dụng cài đặt từ phạm vi cấu hình cụ thể?

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

Trả lời

1

Tôi nghĩ rằng bạn cần phải viết một cái gì đó giống như

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

Bạn cũng có thể xác định các phím nhiệm vụ riêng biệt, như này

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

Vì vậy, bạn không thể quyết định thời gian chạy phạm vi cấu hình nào để sử dụng, bạn phải xác định tác vụ cho từng cấu hình có thể? – esarbe

+0

Tôi không chắc chắn. Nhưng bạn có thể sử dụng hàm _same_ (task body) cho 'map' nhiều lần. Không phải là một chuyên gia ở đây, vì vậy có thể chờ đợi thêm ý kiến. –

+0

Vâng, đó là một sự khởi đầu! Cảm ơn! : D – esarbe

5

Như được thảo luận trong How can i make an SBT key see settings for the current configuration?, bạn có thể sử dụng inConfig như sau.

Thay đổi này:

settings = Defaults.defaultSettings ++ Seq(taskTask) 

này:

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

và thì đấy:

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

Nếu bạn quan tâm đến đào sâu hơn, inConfig được định nghĩa trong sbt.Project (http://harrah.github.io/xsbt/latest/api/index.html#sbt.Project$) như là một chức năng để "sao chép một biểu đồ con của nhiệm vụ/cài đặt vào các phạm vi khác nhau "(như @MarkHarrah mô tả nó). Ngoài ra, hãy xem http://eed3si9n.com/sbt-010-guide và cuộn xuống "thay đổi phạm vi", nơi tác giả giải thích cách inConfig(conf)(ss) "phạm vi cài đặt ss chỉ để conf khi nó chưa được dàn xếp đến cấu hình".

Các vấn đề liên quan