2015-07-12 82 views
2

我有包第三方库foo.bar如何处理不同版本的不同软件包名称?

我通常用它作为:

import foo.bar.{Baz => MyBaz} 

object MyObject { 
    val x = MyBaz.getX // some method defined in Baz 
} 

库的新版本改名为包从foo.barnewfoo.newbar。我现在有一个我的代码的另一个版本,如下所示:

import newfoo.newbar.{Baz => MyBaz} 

object MyObject { 
    val x = MyBaz.getX // some method defined in Baz 
} 

请注意,只有第一个导入是不同的。 有没有什么办法可以保持我的代码版本相同,并且在需要时仍然可以在不同版本的第三方库之间切换?

我需要类似conditional imports或其他方法。

回答

0

你可以尝试使用类型别名:

package myfoo 

object mybar { 
    type MyBaz = newfoo.newbar.Baz 
    // val MyBaz = newfoo.newbar.Baz // if Baz is a case class/object, then it needs to be aliased twice - as a type and as a value 
} 

然后你可以简单地import myfoo.mybar._并更换object mybar切换到不同版本的库。

2

另一个答案是在正确的轨道上,但并不真正让你在那里。在Scala中做这种事最常见的方式是提供一个基本兼容性特征,每个版本都有不同的实现。在我的小abstracted库,例如,我有以下MacrosCompat斯卡拉2.10:

package io.travisbrown.abstracted.internal 

import scala.reflect.ClassTag 

private[abstracted] trait MacrosCompat { 
    type Context = scala.reflect.macros.Context 

    def resultType(c: Context)(tpe: c.Type)(implicit 
    tag: ClassTag[c.universe.MethodType] 
): c.Type = { 
    import c.universe.MethodType 

    tpe match { 
     case MethodType(_, res) => resultType(c)(res) 
     case other => other 
    } 
    } 
} 

而这其中的2.11:

package io.travisbrown.abstracted.internal 

import scala.reflect.ClassTag 

private[abstracted] trait MacrosCompat { 
    type Context = scala.reflect.macros.whitebox.Context 

    def resultType(c: Context)(tpe: c.Type): c.Type = tpe.finalResultType 
} 

然后我的班,特点,和对象使用宏反射API只能扩展MacrosCompat,他们将得到适当的Context和我们当前正在构建的版本的resultType的实现(由于宏API在2.10和2.11之间发生更改,这是必要的)。

(这本来不是我的想法或模式,但我不知道是谁把它归功于。大概尤金Burmako?)

如果您正在使用SBT,有一个为特定版本的特殊支持源树 - 你可以有一个src/main/scala为你的共享代码和例如src/main/scala-2.10src/main/scala-2.11用于特定于版本的代码的目录,而SBT将负责其余部分。

相关问题