我的项目依赖于一个包含路径日期的包的库,例如:
import xyz.abc.201301.utils._
其中201301是注明日期的版本。
有没有办法在一个地方声明这个包名,以便我可以在使用这个依赖项的各个类中引用它? 这样,当版本更改时,我只需要在我的代码中的一个位置更改它。
理想情况下,我想象我可以宣布
val libVersion = 201301
在一个地方,然后在客户端类中:
import xyz.abc.$libVersion.utils._
我知道这不起作用,但是有办法做类似的事吗?
答案 0 :(得分:4)
简答:不。
答案很长:你可以以某种方式完成这项工作。您可以使用模板语言或排序预处理器,然后创建一个构建过程,在将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)
通过这种方式,您可以限制与日期相关的"进口"只有一个文件。
答案 1 :(得分:1)
您无法动态导入,但可以使用反射动态调用。
如果库是Java,则可以使用Java reflection。如果是Scala,reflection library仍然标记为实验性的。
在任何一种情况下,我都与Madoc合作 - 除非你真的需要,否则不要去那里。写作困难,难以阅读,如果在热点地区,很慢。
无论是谁打包......(单词失败)。