如何修复 sbt 1.3.0 加载项目中的“Could not find proxy for val base”错误

per*_*son 5 scala sbt

我升级到 sbt 1.3.0 和相关的 plugins.sbt。当我尝试为我的项目启动 sbt 时,它无法初始化并显示错误

java.lang.IllegalArgumentException: Could not find proxy for val base: sbt.SettingKey in List(value base, method sbtdef$1, method $sbtdef, object $bd1712fb73ddc970045f, package <empty>, package <root>) (currentOwner= method $sbtdef )
[error]     at scala.tools.nsc.transform.LambdaLift$LambdaLifter.searchIn$1(LambdaLift.scala:316)
[error]     at scala.tools.nsc.transform.LambdaLift$LambdaLifter.$anonfun$proxy$4(LambdaLift.scala:321)
[error]     at scala.tools.nsc.transform.LambdaLift$LambdaLifter.searchIn$1(LambdaLift.scala:321)
[error]     at scala.tools.nsc.transform.LambdaLift$LambdaLifter.$anonfun$proxy$4(LambdaLift.scala:321)
[error]     at scala.tools.nsc.transform.LambdaLift$LambdaLifter.searchIn$1(LambdaLift.scala:321)
[error]     at scala.tools.nsc.transform.LambdaLift$LambdaLifter.$anonfun$proxy$4(LambdaLift.scala:321)
[error]     at scala.tools.nsc.transform.LambdaLift$LambdaLifter.searchIn$1(LambdaLift.scala:321)
[error]     at scala.tools.nsc.transform.LambdaLift$LambdaLifter.$anonfun$proxy$4(LambdaLift.scala:321)
[error]     at scala.tools.nsc.transform.LambdaLift$LambdaLifter.searchIn$1(LambdaLift.scala:321)
[error]     at scala.tools.nsc.transform.LambdaLift$LambdaLifter.proxy(LambdaLift.scala:330)
[error]     at scala.tools.nsc.transform.LambdaLift$LambdaLifter.proxyRef(LambdaLift.scala:370)
Run Code Online (Sandbox Code Playgroud)

我确实发现这个 stackoverflow 问题无法在宏中找到 ... 的代理,但我认为这对我的错误没有帮助。

我认为代码肇事者是

//Ensure that version.sbt is included with each package.
mappings in Universal ++= {
  val h=(packageBin in Compile, baseDirectory)
  val base=h._2
  val versionFile = (base.value / "version.sbt")
  versionFile.get.map(file => file -> file.name)
}

Run Code Online (Sandbox Code Playgroud)

出于某种原因,base 没有正确存储(编译中的 packageBin,baseDirectory)?

编辑:我不是 100% 但我想我通过删除中间变量和一个衬里来修复它。所以像这样:

mappings in Universal ++= {
((packageBin in Compile, baseDirectory)._2.value / "version.sbt").get.map(file => file -> file.name)
}
Run Code Online (Sandbox Code Playgroud)

我不知道为什么它修复了它...

Dar*_*hop 1

我认为OP将该示例与无效的元组使用混淆了;也许对某些 SBT API/DSL 的使用存在一些误解,即packageBin in Compile从未使用或解决(因为它的副作用)。

mappings in Universal 然而,我相信这个错误更多地与宏无法处理的方式表达任务值有关- 它会变得混乱 - 例如,期望宏/编译器在变量中找到任务键base这是_2在 a 中Tuple2

该示例可以重写为

mappings in Universal ++= {
  (baseDirectory.value / "version.sbt").get.map(file => file -> file.name)
}
Run Code Online (Sandbox Code Playgroud)

或者

mappings in Universal ++= {
  (baseDirectory in(Compile, packageBin)).value / "version.sbt").get.map(file => file -> file.name)
}
Run Code Online (Sandbox Code Playgroud)

取决于意图是什么(可能是后者)。

当然,新的语法是

mappings in Universal ++= {
  ((Compile / packageBin / baseDirectory).value / "version.sbt").get.map(file => file -> file.name)
}
Run Code Online (Sandbox Code Playgroud)