- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试运行代码生成器,并将文件名传递给它以写入输出:
resourceGenerators in (proj, Compile) += Def.task {
val file = (resourceManaged in (proj, Compile)).value / "swagger.yaml"
(runMain in (proj, Compile)).toTask(s"api.swagger.SwaggerDump $file").value
Seq(file)
}.value
但是,这给了我:
build.sbt:172: error: Illegal dynamic reference: file
(runMain in (proj, Compile)).toTask(s"api.swagger.SwaggerDump $file").value
最佳答案
您的代码片段有两个问题:
{ ... }.value
而不是 { ... }.taskValue
。资源生成器的类型是 Seq[Task[Seq[File]]]
,当你执行 value
时,你得到的不是 Seq[File]
任务[序列[文件]]
。这会导致合法的编译错误。file
用作toTask
的参数,当前宏实现禁止使用。Sbt 强制任务实现对其他任务具有静态依赖性。否则,sbt 无法执行任务重复数据删除,也无法在 inspect
命令中提供正确的信息。这意味着您在任务中执行的任何任务评估都不能依赖于变量(仅在运行时已知的值),就像您在 toTask
中的 file
一样。
为了克服这个限制,存在动态任务,其主体允许您返回任务。每个“动态依赖项”都必须在动态任务中定义,然后您可以在返回的任务中依赖提升的动态值。
The following Scastie是你的任务的正确执行。我复制粘贴代码以便人们可以快速查看,但转到 Scastie 检查它是否成功编译和运行。
resourceGenerators in (proj, Compile) += Def.taskDyn {
val file = (resourceManaged in (proj, Compile)).value / "swagger.yaml"
Def.task {
(runMain in (proj, Compile))
.toTask(s"api.swagger.SwaggerDump $file")
.value
Seq(file)
}
}.taskValue
如果您修复了 taskValue
错误,您的任务实现是否应该正确编译?
在我看来,是的,但我还没有充分研究内部实现来断言您的任务实现不会阻碍任务重复数据删除和依赖项提取。如果没有,非法引用检查应该消失。
这是 sbt 当前的一个限制,我想通过改进整个宏实现(提升值并确保依赖分析涵盖更多情况)或仅仅改进“非法引用检查”来摆脱不要过于悲观。然而,这是一个难题,需要时间,而且短期内不太可能发生。
如果这对您来说是个问题,请在 sbt/sbt 中提交工单。这是了解解决此问题(如果有)的紧迫性的唯一方法。目前,我们能做的最好的事情就是记录下来。
关于scala - runMain 中的 sbt 非法动态引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43865941/
如何在 Windows 上从命令行执行 runMain 时为其设置系统属性? 我希望能够运行以下命令: sbt -Dconfig.resource=../application.conf "runMa
我有一个简单的任务: lazy val myCustomTask = TaskKey[Unit]("description of my task") myCustomTask := { val
我正在尝试运行代码生成器,并将文件名传递给它以写入输出: resourceGenerators in (proj, Compile) += Def.task { val file = (resou
使用sbt run时如下: sbt "project epa-recon" "run" 我们看到找到了两个主要的: [warn] Multiple main classes detected. Ru
问题 在多模块构建中,每个模块都有自己的 baseDirectory 但我想启动模块中定义的应用程序,使用根项目的 baseDirectory 而不是 baseDirectory 相对于所涉及的模块。
我正在尝试使用 sbt runMain 命令从 SBT 运行程序。但我遇到了以下错误 - [error] java.nio.file.NoSuchFileException: /home/user/j
我是一名优秀的程序员,十分优秀!