2014-03-04 33 views
7
lazy val buildDb = taskKey[Unit]("Initializes the database") 

buildDb := { 
    (compile in Compile).value 
    val s: TaskStreams = streams.value 
    s.log.info("Building database") 
    try { 
    ... 
    } catch { 
    case e: Throwable => 
     sys.error("Failed to initialize the database: " + e.getMessage) 
    } 
    s.log.info("Finished building database") 
} 

這將產生以下錯誤SBT 0.13 taskKey宏不能與[Unit]一起使用?

C:\work\server\build.sbt:98: error: type mismatch; 
found : Unit 
required: T 
    s.log.info("Finished building database") 
      ^
[error] Type error in expression 

但如果我把它定義這樣lazy val buildDb = taskKey[String]("Initializes the database"),然後添加到最後一行的任務"Happy end!"串一切似乎工作。我該責怪,還是宏觀上有什麼問題?

+1

如果最後一行是(),會發生什麼。我之前使用過taskKey [Unit],所以這裏有些東西看起來很不錯。 – jsuereth

+0

它適用於SBT'0.13.2-M2'。你可以刪除try-catch塊並重新啓動它嗎?你可以在這個問題上加上'sbt'嗎? –

+0

try/catch塊也引起了我的注意。我想知道你是否可能需要將其移至自己的方法。 –

回答

6

同樣的事情發生在我身上。我能解決這個問題,例如通過在taskKey定義中添加一個: TaskKey[Unit]。這裏是我的SBT 0.13.5結果:

下面的定義是OK(它似乎是純粹的運氣,這是OK):

lazy val collectJars = taskKey[Unit]("collects JARs") 

collectJars := { 
    println("these are my JARs:") 
    (externalDependencyClasspath in Runtime).value foreach println 
} 

下面的定義(同上無第一的println)得到了同樣的錯誤「發現:單位,要求:T」:

lazy val collectJars = taskKey[Unit]("collects JARs") 

collectJars := { 
    (externalDependencyClasspath in Runtime).value foreach println 
} 

我的發現是,這絕對是神奇的東西:例如,如果我用一個空行縮進lazy val collectJars = ...,然後它合作mpiles。我期望(但沒有檢查).sbt和.scala構建定義也有不同的表現。

然而,如果添加的類型簽名,似乎總是編譯

lazy val collectJars: TaskKey[Unit] = taskKey[Unit]("collects JARs") 

collectJars := { 
    (externalDependencyClasspath in Runtime).value foreach println 
} 

最後但並非最不重要的:這個問題似乎是具體的TaskKey [單位]。單元任務不是一個好主意 - 在你的例子中,你至少可以返回布爾值(對於成功爲true,對於失敗爲false)。

+0

我有一個'TaskKey [Seq [File]]'任務,其行爲也很奇怪。起初我以爲我在我的.sbt文件中有一個錯誤,但後來我意識到爲一個字符串添加一個空格,或者一個額外的換行符也導致它引發一個類型不匹配錯誤。添加類型簽名似乎已修復它。謝謝! –

+1

事實證明,該類型是無關緊要的,只是導致sbt刷新導致問題的上一次運行的數據。即使是類型簽名,它也發生在我身上。刪除所有我的/目標目錄清除它。 –

+0

哇,這太可怕了...... – Owen

相關問題