非法动态参考

时间:2015-12-08 17:41:29

标签: sbt

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的限制吗?

干杯

3 个答案:

答案 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取决于startServerstopServer任务。

由于在任务的大括号之前计划了依赖任务,因此您无法使用其他任务的结果来确定其他任务的范围。

答案 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)
   }
}