传递代替常春藤模块

Mil*_*bin 5 scala ivy sbt

我正在以编程方式使用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模块是不够的.

这可能吗?如果是的话,非常欢迎指向必要机制的指针.如果不是,那么对于变通方法的建议也会非常受欢迎.

Mil*_*bin 0

这可以使用 Ivy 来完成DependencyDescriptorMediatormodule下面将执行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 中看到这一点。