我的项目依赖于一个库,该库的路径中包含带有日期的包,例如:
import xyz.abc.201301.utils._
Run Code Online (Sandbox Code Playgroud)
其中 201301 是过时的版本。
有没有一种方法可以在一个地方声明这个包名称,以便我可以在使用此依赖项的各种类中引用它?这样,当版本更改时,我只需在代码中的一个位置进行更改即可。
理想情况下,我想我可以声明
val libVersion = 201301
Run Code Online (Sandbox Code Playgroud)
在一个地方,然后在一个客户端类中:
import xyz.abc.$libVersion.utils._
Run Code Online (Sandbox Code Playgroud)
我知道这行不通,但是有没有办法做类似的事情?
简短的回答:不。
长答案:你可以以某种方式使这项工作有效。您可以使用模板语言或某种预处理器,然后创建一个构建过程,在将 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
}
Run Code Online (Sandbox Code Playgroud)
您更改构建过程,以便从某种模板生成此 Scala 文件;我对您的构建过程了解不够,无法提出建议。
使用 API 的代码可以简单地使用相同的导入:
import current_api._
// ...
val someInstance:SomeType = SomeCompanionObject.apply(arg1, arg2)
Run Code Online (Sandbox Code Playgroud)
通过这种方式,您可以将与日期相关的“导入”范围限制为仅一个文件。