首页 文章

传递代替常 Spring 藤模块

提问于
浏览
5

我正在以编程方式使用Ivy(在SBT的上下文中),我需要能够使用兼容集替换一小组模块,这些模块具有不同的组织,但共享工件名称,修订等 .

举一个具体的例子,我想替换,

org.scala-lang#scala-reflect;2.11.8

用,

org.typelevel#scala-reflect;2.11.8

依赖图中的任何地方 . 请注意,我只想添加对org.typelevel的依赖#scala-reflect; 2.11.8如果依赖于org.scala-lang #scala-reflect; 2.11.8在图中的某处(我不是提前知道),因此无条件地排除org.scala-lang模块并包含org.typelevel模块是不够的 .

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

2 回答

  • 0

    虽然这不是最干净的解决方案,但我认为您可以通过劫持项目解析器(负责解决SBT中的项目间依赖关系)来实现这一目标 .

    在您的构建文件中的某个位置:

    // ...
    .settings(
      projectResolver <<= (projectDescriptors, streams) map { (m, s) =>
        new RawRepository(new ProjectResolver("custom-resolver", m) {
          import org.apache.ivy.core.module.descriptor.DependencyDescriptor
          import org.apache.ivy.core.resolve.ResolveData
          import org.apache.ivy.core.resolve.ResolvedModuleRevision
    
          override def getDependency(dd: DependencyDescriptor, data: ResolveData): ResolvedModuleRevision = {
            s.log.info("Resolving " + dd.getDependencyId.getName)
    
            // adjust your dependency descriptor and possibly resolve
            // from another source?
    
            super.getDependency(dd, data)
          }
        })
      }
    )
    

    这个新项目解析器可以调整某些依赖描述符,然后针对常规解析器链解决它们......我想 . 您可能必须覆盖一些其他方法 .

  • 0

    这可以使用常 Spring 藤 DependencyDescriptorMediator 来完成 . 以下将执行 DefaultModuleDescriptor 类型的 module 问题中描述的重写,

    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 here中看到这一点 .

相关问题