临时替换常春藤模块

迈尔斯·萨宾

我正在以编程方式(在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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章