2014-01-06 67 views
3

此問題與sbt 0.13對KLists的實現有關,如this commit。我想複製this behaviour,因爲KList實施改變了,所以不再有效。如何使用Def.app和KList映射任務的依賴關係

之所以這樣,sbt只允許多達11個依賴關係,如果你把它們分組在一個元組中。我聽說有性能影響,爲什麼它不允許更多,所以我正在尋找替代使用元組,並呼籲RichTaskables.map,我正在考慮使用KLists作爲這種替代。

編輯:以前我不知道如何將klist的轉換成KL[M[_]]類型的東西,Def.appAList.klist預計(在被要求由前後者)。後來我意識到,一個KLIST實例可以通過

  • 明確寫這樣一類構造函數,抽象了更高的實物製作成表格KL[M[_]]的類型構造,M(馬克哈拉指出在他的回答) ,或
  • (我相信)通過直接訪問有問題的klist klkl.Transform類型。

我在使用kl.Transform了個去和它的作品,如果所有的依賴都是要麼設置或任務,但如果將它們混合它不直接編譯。

有了這些信息,我的問題是:

我怎麼能寫一些SettingKey & TaskKey依賴作爲KLIST和使用Def.app自己的價值觀映射了嗎?我提到Def.app由於缺乏更好,更高層次的方法。

回答

1

我已經想通了一個的方式來使它的工作,但我覺得它應該比這更優雅。回去我要複製的例子,具有相同行爲的新代碼是這樣:

lazy val yodawg = TaskKey[String]("yo-dawg", "I heard you liked settings, so I put a setting in your setting") 

val kl = moduleName :^: version :^: isSnapshot :^: KNil 

yodawg <<= Def.app(kl: kl.type#Transform[Def.Initialize]) { 
    case a :^: b :^: c :^: KNil => task(List(a, b, c).mkString("~")) 
}(AList.klist) 

但是:

  • 我必須明確地在AList.klist通(也許預計,這不似乎被定義爲隱含在任何地方)
  • 我必須將klist保存在val中,並訪問它的Transform內部類型,它應該是klist的實現細節。另外,我不得不用Def.Initialize來實例化它。

我也可以提供在方括號中的類型,但它看起來像:

Def.app[kl.type#Transform, Task[String]](kl) { ... } 
//       ^~~~~~~~~~~~ 

在我不得不提供內部類型此設置,我定義爲好。

+0

你可以批准答案或**更新**的問題,使其更具體(如果需要可能會產生其他問題)? –

+1

這種方法仍然存在問題。首先,混合'TaskKey'和'SettingKey'依賴時,我無法編譯它。我將編輯該問題以刪除/解釋不清楚的內容。 – Dan

1

Def.app,AList以及相關代碼絕對不打算手動使用。什麼是用例?

要回答這個問題,你正在尋找klist的樣型的構造是:

type KSS[M[_]] = KCons[String, KCons[String, KNil, M], M] 

像原來KLIST,它抽象了適用於每個元素類型構造M。特別是,它不應該被應用於例子中的類型構造函數SettingKey

+0

感謝您的回答!我想依賴於超過11個設置,這是不可能使用元組(我知道允許這會讓編譯變慢),而這個KList解決方案是我聽到過的唯一一個正在討論的解決方案。從我所看到的,你描述的'KSS'和'myKList.Transform'是一樣的,這正是我一直在嘗試使用的。但是,當我混合SettingKey和TaskKey依賴時,我發現這是有問題的。 – Dan

+1

使用':='的標準語法適用於任意數量的輸入。爲了混合'SettingKey/TaskKey'輸入,'SettingKey'需要被提升爲'Task's。標準語法在幕後爲你做到這一點。 –

+0

好的。我一直在試圖避免這種情況(僅僅因爲它突破了IntelliJ中的突出顯示),但是這樣做卻變得太複雜以致不值得。另外,出於好奇,是否有像'.value'這樣的類似宏來應用於'Def.Initialize'事物? (如果我不想將它們分配給設置,但直接使用它們的值) – Dan