我升级到 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)
我不知道为什么它修复了它...
我认为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)