2015-03-25 22 views
3

在sbt.Exctracted中有一個合適的方法來將TaskKey添加到當前狀態。假設我有inState: State爲什麼sbt.Extracted在append方法中刪除先前定義的TaskKey?

val key1 = TaskKey[String]("key1") 
Project.extract(inState).append(Seq(key1 := "key1 value"), inState) 

我都面臨着當我做了兩次奇怪的行爲。我在下面的示例中的異常:

val key1 = TaskKey[String]("key1") 
val key2 = TaskKey[String]("key2") 
val st1: State = Project.extract(inState).append(Seq(key1 := "key1 value"), inState) 
val st2: State = Project.extract(st1).append(Seq(key2 := "key2 value"), st1) 
Project.extract(st2).runTask(key1, st2) 

導致:

java.lang.RuntimeException: */*:key1 is undefined. 

的問題是 - 爲什麼它的工作原理是這樣?是否可以通過多次調用sbt.Extracted.append來執行特定任務時添加幾個TaskKey

的例子SBT項目sbt.Extracted append-example,重現該問題只運行sbt fooCmd

回答

3

喬希Suereth張貼answer到SBT-dev的郵件列表。 Quote:

append函數是很髒/低級別。這可能是其實現中的一個缺陷(或者缺少文檔),但是它在使用時會吹走任何其他附加設置。

你想要做什麼,(我認爲)被添加到當前的「會話」中,所以事情會停留在周圍,用戶可以通過「sesison clear」命令刪除你已經完成的操作。

另外,您傳遞的設置爲「原始」或「完全限定」形式。如果您希望設置的編寫工作與build.sbt文件完全相同,則需要首先對其進行轉換,以便範圍匹配當前項目等。

我們提供了一個實用程序SBT-服務器,使得它更容易一點追加設置到當前會話:

https://github.com/sbt/sbt-remote-control/blob/master/server/src/main/scala/sbt/server/SettingUtil.scala#L11-L29

我已經測試提出的解決方案和工程就像一個魅力。

相關問題