我正在以编程方式使用Ivy(在SBT的上下文中),我需要能够使用兼容集替换一小组模块,这些模块具有不同的组织,但共享工件名称,修订等.
举一个具体的例子,我想替换,
org.scala-lang#scala-reflect;2.11.8
Run Code Online (Sandbox Code Playgroud)
用,
org.typelevel#scala-reflect;2.11.8
Run Code Online (Sandbox Code Playgroud)
依赖图中的任何地方.请注意,我只想添加对org.typelevel的依赖#scala-reflect; 2.11.8如果依赖于org.scala-lang #scala-reflect; 2.11.8在图中的某处(我不是提前知道),因此无条件地排除org.scala-lang模块并包含org.typelevel模块是不够的.
这可能吗?如果是的话,非常欢迎指向必要机制的指针.如果不是,那么对于变通方法的建议也会非常受欢迎.
这可以使用 Ivy 来完成DependencyDescriptorMediator。module下面将执行type问题中描述的重写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
)
Run Code Online (Sandbox Code Playgroud)
您可以在此处的SBT 中看到这一点。