我的项目依赖于一个库,该库包含在其路径中带有日期的包,例如:
import xyz.abc.201301.utils._
其中 201301 是过时版本。
有没有办法在一个地方声明这个包名,这样我就可以在使用这个依赖的各种类中引用它? 这样,当版本更改时,我只需要在我的代码中的一个地方更改它。
理想情况下,我想我可以声明
val libVersion = 201301
在一个地方,然后在客户端类中:
import xyz.abc.$libVersion.utils._
我知道这行不通,但有没有办法做类似的事情?
最佳答案
简短的回答:没有。
长答案:您可以以某种方式完成这项工作。您可以使用某种模板语言或预处理器,然后创建一个构建过程,在将 Scala 模板文件交给编译器之前对其进行预处理。
但这是个坏主意。这正是 Maven 或 SBT 等依赖管理系统的开发目的。在您的上下文中,版本化模块的想法是:您保留相同的包名称,包名称中没有日期。您创建一个构建过程,该过程还管理您的依赖项;为此,您需要使用 Maven 或 SBT。 (后者更适合 Scala。)您确保您所依赖的代码作为具有“快照”版本的单独模块交付,即每次解决依赖关系时,都会创建一个新版本。
如果您不希望或无法实现这样的过程,我建议至少限制损失。您可以创建一个中央包,为您需要使用的所有类型和对象设置别名:
package object current_api {
// for types, i.e. traits or classes:
type SomeType = xyz.abc.201301.SomeType
// for singleton objects:
val SomeCompanionObject = xyz.abc.201301.SomeCompanionObject
}
你改变你的构建过程,使这个 Scala 文件从某种模板生成;我对您的构建过程了解不足,无法提出建议。
使用 API 的代码可以简单地使用相同的导入:
import current_api._
// ...
val someInstance:SomeType = SomeCompanionObject.apply(arg1, arg2)
通过这种方式,您可以将依赖于日期的“导入”的范围限制为仅一个文件。
关于scala - 你能在 Scala 中动态导入吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29920117/