我正在以编程方式(在SBT的背景下)使用Ivy,并且我需要能够用具有不同组织但共享项目名称,修订版等的兼容集以可替换的方式替换一小部分模块。
举一个具体的例子,我想替换一下,
org.scala-lang#scala-reflect;2.11.8
和,
org.typelevel#scala-reflect;2.11.8
依赖关系图中的任何地方。请注意,如果在图表中某处存在对org.scala-lang#scala-reflect; 2.11.8的依赖,我只想添加对org.typelevel#scala-reflect; 2.11.8的依赖(我没有这样做)提前知道),因此无条件地排除org.scala-lang模块并包含org.typelevel是不够的。
这可能吗?如果是这样,那么非常欢迎指向必要机制的指针。如果不是这样,也非常欢迎提供解决方法的建议。
这可以使用常春藤来完成DependencyDescriptorMediator
。以下将执行module
类型为的问题中描述的重写DefaultModuleDescriptor
,
class OverrideScalaMediator(scalaOrganization: String, scalaVersion: String)
extends DependencyDescriptorMediator {
def mediate(dd: DependencyDescriptor): DependencyDescriptor = {
val transformer =
new NamespaceTransformer {
def transform(mrid: ModuleRevisionId): ModuleRevisionId = {
if (mrid == null) mrid
else
mrid.getName match {
case name @ "scala-reflect" =>
ModuleRevisionId.newInstance(
scalaOrganization, name, mrid.getBranch, scalaVersion,
mrid.getQualifiedExtraAttributes
)
case _ => mrid
}
}
def isIdentity: Boolean = false
}
DefaultDependencyDescriptor.transformInstance(dd, transformer, false)
}
}
val mediator = new OverrideScalaMediator("org.typelevel", version)
module.addDependencyDescriptorMediator(
new ModuleId("org.scala-lang", "*"), ExactPatternMatcher.INSTANCE, mediator
)
您可以在此处的SBT中看到它。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句