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的限制吗?
干杯
答案 0 :(得分:5)
您需要在动态任务http://www.scala-sbt.org/0.13/docs/Tasks.html#Dynamic+Computations+with中定义您的工作,这允许您根据在编译时未明确定义的事物来定义任务的依赖关系。
请记住,在sbt中,所有任务实际上都是从依赖关系到结果的地图,只要您的类型thing.value
在宏有其邪恶的方式时,您真正在写(thing).map { valueOfThing => ... }
。
答案 1 :(得分:1)
正如fommil写道dynamic task是要走的路。
要了解为何要查看Execution semantics of tasks:
与普通的Scala方法调用不同,不会严格评估对任务调用
value
方法。相反,它们只是作为占位符来表示sampleIntTask
取决于startServer
和stopServer
任务。
由于在任务的大括号之前计划了依赖任务,因此您无法使用其他任务的结果来确定其他任务的范围。
答案 2 :(得分:-1)
为答案干杯,我在key.all(ScopeFilter(in))
中使用Def.taskDyn
解决了我的问题:
jniPaths := jniPathsImpl(inDependencies(ThisProject))
def jniPathsImpl(in: ScopeFilter.ProjectFilter) = Def.taskDyn {
ivyJniPath.all(ScopeFilter(in)) map { ivyJniPaths =>
libraryDependencies.value flatMap (_.name)
}
}