如何在 运行 时间确定 Scala.js 和 JVM 的 Scala 版本?
How to determine Scala version at run-time for both Scala.js and JVM?
这个问题类似于How do I get the Scala version from within Scala itself?,只是我也想支持Scala.js。
我尝试了 util.Properties
方法。很遗憾,它在 Scala.js:
上不可用
https://scalafiddle.io/sf/dzNAhWB/0
ScalaFiddle.scala:-5: ERROR: There were linking errors
Referring to non-existent class java.util.jar.Attributes$Name
called from scala.util.Properties$.()
called from ScalaFiddle$.()
exported to JavaScript with @JSExport
Referring to non-existent method java.util.Properties.load(java.io.InputStream)scala.Unit
called from scala.util.PropertiesTrait.$$anonfun$scalaProps(java.util.Properties,java.io.InputStream)scala.Unit
called from scala.util.Properties$.$$anonfun$scalaProps(java.util.Properties,java.io.InputStream)scala.Unit
called from scala.util.PropertiesTrait.scalaProps()java.util.Properties
called from scala.util.Properties$.scalaProps$lzycompute()java.util.Properties
called from scala.util.Properties$.scalaProps()java.util.Properties
called from scala.util.PropertiesTrait.scalaPropOrNone(java.lang.String)scala.Option
called from scala.util.Properties$.scalaPropOrNone(java.lang.String)scala.Option
called from scala.util.PropertiesTrait.$$init$()scala.Unit
called from scala.util.Properties$.()
called from ScalaFiddle$.()
exported to JavaScript with @JSExport
involving instantiated classes:
scala.util.Properties$
Referring to non-existent method java.lang.Class.getResourceAsStream(java.lang.String)java.io.InputStream
called from scala.util.PropertiesTrait.scalaProps()java.util.Properties
called from scala.util.Properties$.scalaProps$lzycompute()java.util.Properties
called from scala.util.Properties$.scalaProps()java.util.Properties
called from scala.util.PropertiesTrait.scalaPropOrNone(java.lang.String)scala.Option
called from scala.util.Properties$.scalaPropOrNone(java.lang.String)scala.Option
called from scala.util.PropertiesTrait.$$init$()scala.Unit
called from scala.util.Properties$.()
called from ScalaFiddle$.()
exported to JavaScript with @JSExport
involving instantiated classes:
scala.util.Properties$
Referring to non-existent method java.util.jar.Attributes$Name.(java.lang.String)
called from scala.util.Properties$.()
called from ScalaFiddle$.()
exported to JavaScript with @JSExport
那么,如何在 运行 时为所有 Scala 后端确定 Scala 版本?
恐怕 Scala.js 一开始就没有办法做到这一点,更不用说独立于平台的解决方案了。
你可以做的是在你的构建工具(sbt?)中编写一个小任务,它将生成一个编码信息的小源文件。
例如,释义sbt documentation on source generators:
sourceGenerators in Compile += Def.task {
val file = (sourceManaged in Compile).value / "scalaversion" / "ScalaVersion.scala"
val scalaV = scalaVersion.value
IO.write(file,
s"""
object ScalaVersion {
val Full = "$scalaV"
}
""")
Seq(file)
}.taskValue
然后您可以从您的代码中读取 ScalaVersion.Full
。
这个问题类似于How do I get the Scala version from within Scala itself?,只是我也想支持Scala.js。
我尝试了 util.Properties
方法。很遗憾,它在 Scala.js:
https://scalafiddle.io/sf/dzNAhWB/0
ScalaFiddle.scala:-5: ERROR: There were linking errors
Referring to non-existent class java.util.jar.Attributes$Name
called from scala.util.Properties$.()
called from ScalaFiddle$.()
exported to JavaScript with @JSExport
Referring to non-existent method java.util.Properties.load(java.io.InputStream)scala.Unit
called from scala.util.PropertiesTrait.$$anonfun$scalaProps(java.util.Properties,java.io.InputStream)scala.Unit
called from scala.util.Properties$.$$anonfun$scalaProps(java.util.Properties,java.io.InputStream)scala.Unit
called from scala.util.PropertiesTrait.scalaProps()java.util.Properties
called from scala.util.Properties$.scalaProps$lzycompute()java.util.Properties
called from scala.util.Properties$.scalaProps()java.util.Properties
called from scala.util.PropertiesTrait.scalaPropOrNone(java.lang.String)scala.Option
called from scala.util.Properties$.scalaPropOrNone(java.lang.String)scala.Option
called from scala.util.PropertiesTrait.$$init$()scala.Unit
called from scala.util.Properties$.()
called from ScalaFiddle$.()
exported to JavaScript with @JSExport
involving instantiated classes:
scala.util.Properties$
Referring to non-existent method java.lang.Class.getResourceAsStream(java.lang.String)java.io.InputStream
called from scala.util.PropertiesTrait.scalaProps()java.util.Properties
called from scala.util.Properties$.scalaProps$lzycompute()java.util.Properties
called from scala.util.Properties$.scalaProps()java.util.Properties
called from scala.util.PropertiesTrait.scalaPropOrNone(java.lang.String)scala.Option
called from scala.util.Properties$.scalaPropOrNone(java.lang.String)scala.Option
called from scala.util.PropertiesTrait.$$init$()scala.Unit
called from scala.util.Properties$.()
called from ScalaFiddle$.()
exported to JavaScript with @JSExport
involving instantiated classes:
scala.util.Properties$
Referring to non-existent method java.util.jar.Attributes$Name.(java.lang.String)
called from scala.util.Properties$.()
called from ScalaFiddle$.()
exported to JavaScript with @JSExport
那么,如何在 运行 时为所有 Scala 后端确定 Scala 版本?
恐怕 Scala.js 一开始就没有办法做到这一点,更不用说独立于平台的解决方案了。
你可以做的是在你的构建工具(sbt?)中编写一个小任务,它将生成一个编码信息的小源文件。
例如,释义sbt documentation on source generators:
sourceGenerators in Compile += Def.task {
val file = (sourceManaged in Compile).value / "scalaversion" / "ScalaVersion.scala"
val scalaV = scalaVersion.value
IO.write(file,
s"""
object ScalaVersion {
val Full = "$scalaV"
}
""")
Seq(file)
}.taskValue
然后您可以从您的代码中读取 ScalaVersion.Full
。