2015-12-08 58 views
4
jniPath := { 
    val subProjectPath = projectDependencies.value map (module => (jniPath in LocalProject(module.name)).value) 

    val path = libraryDependencies.value flatMap (_.name) 

    path ++ subProjectPath mkString File.pathSeparator 
} 

有誰有解決方法嗎?看來,這個問題從(jniPath in LocalProject(module.name)).value來,但我看不出有什麼辦法做到,所以這是SBT的限制?非法動態參考

乾杯

回答

-1

乾杯的答案,我解決我的問題,通過在Def.taskDyn使用key.all(ScopeFilter(in))

jniPaths := jniPathsImpl(inDependencies(ThisProject)) 
def jniPathsImpl(in: ScopeFilter.ProjectFilter) = Def.taskDyn { 
    ivyJniPath.all(ScopeFilter(in)) map { ivyJniPaths => 
    libraryDependencies.value flatMap (_.name) 
    } 
} 
5

你需要在一個動態的任務http://www.scala-sbt.org/0.13/docs/Tasks.html#Dynamic+Computations+with,它允許您根據事情是不是在編譯時明確定義任務的依賴關係來定義你的工作。

請記住,在SBT的所有任務都是真正從他們的依賴性映射到結果上,任何時候你的類型thing.value你真的寫(thing).map { valueOfThing => ... }一旦宏有它的惡行。

1

由於fommil寫道dynamic task是要走的路。

要理解爲什麼在Execution semantics of tasks看一看:

不同於普通Scala的方法調用,調用上的任務value方法將不會被嚴格評估。相反,他們僅充當佔位符,表示sampleIntTask取決於startServerstopServer任務。

由於依賴任務計劃面前的任務的花括號開始,你不能使用,結果從另一個任務範圍另一個任務。