【发布时间】:2020-07-30 23:33:05
【问题描述】:
我是 Scala 的新手 :)
如果我理解正确,您必须先将所需的库包含在 build.sbt 文件的 Library Dependencies 中,然后才能将所需的库import 到 scala脚本。
但是,我必须反其道而行之。我必须编写一个 Python 脚本来将 自动 Scala 的导入语句转换为库依赖语句,以便将它们插入到@987654323 @文件。
例如
发件人:
import org.apache.spark.sql.SparkSession
import json._
到:
libraryDependencies += "org.apache.spark" %% "spark-sql" % sparkVersion % "provided"
libraryDependencies += "com.mediamath" %%% "scala-json" % "1.0"
我知道库依赖的语法如下:
libraryDependencies += groupID % artifactID % revision % configuration
我们应该在maven central repository 中查找groupID、artifactID 和revision。
但是,此手动查找不允许我对转换进行自动编程。有什么我错过的吗?我可以用来完成此任务的其他语法?还有其他方法吗?
【问题讨论】:
-
一般来说是不可能的,充其量你可以有启发式。您可以拥有多个在同一命名空间下提供定义的库。即使不是,您也可以为来自同一组织/项目的所有库使用公共前缀。包名称不必与组织/包名称对齐(例如,有很多
cats库,它们共享cats命名空间,但在 Maven 上它们位于org.typelevel组织中)。在很多情况下它可以工作,但这不能完全自动化。 -
如果这些 Scala 脚本工作,它们应该已经构建或以某种方式运行 - 我会在那里搜索依赖项名称。
-
@MateuszKubuszok 非常感谢您的 cmets! “搜索依赖项名称”是指,例如,
如果导入语句中有sql,我会自动输入"org.apache.spark" %% "spark-sql" % sparkVersion。如果导入语句中有json,我会自动输入"com.mediamath" %%% "scala-json" % "1.0"?非常感谢您! -
我的意思是 scala 脚本并不存在于真空中。如果这是菊石,它将具有
import $ivy.organization::library:version`,笔记本通常也具有类似的功能。 Scastie 有一个用于运行脚本的库列表。所以通常依赖关系已经在某个地方定义了。 -
几乎不可能构建一个完全自动化的工具来“猜测”基于导入的库,因为为此必须废弃所有存在的库,检查每个 JAR 的内容,构建索引的包 -> 库名映射,然后解决多个库具有相同包的问题,因为没有规则禁止这样做。由于工作量大,甚至没有现有工具尝试将其自动化。充其量您可以维护映射列表并在新案例到来时手动扩展它。询问作者他们使用了什么应该更简单。
标签: regex scala sbt dependency-management