簡體   English   中英

SBT:我可以根據另一個動態添加庫依賴項嗎?

[英]SBT: Can I dynamically add a library dependency based on another one?

我正在嘗試構建一個插件,它在特定庫(aspectj weaver JVM代理)上添加運行時依賴項,如果項目庫依賴libraryDependencies包含某組其他庫(其中一個需要運行時方面編織的Kamon庫)之一,那么然后我可以在創建Docker鏡像時引用下載的依賴文件(使用sbt-docker)。

Kamon將aspectj weaver指定為“提供”依賴項,但AFAICT指定那些依賴於其中一個Kamon庫的項目不能傳遞。

問題是我無法覆蓋插件中的libraryDependencies ,因為那時實際項目還沒有添加任何依賴項,所以我得到一個空列表。 因此,在項目設置了libraryDependencies但在SBT開始下載依賴項之前,我必須以某種方式添加此依賴項。

這可能嗎? 是否有其他設置可以覆蓋以實現此目的?

我的備份是以某種方式從我的插件中的任務下載那個aspectj jar。 是否有一些我可以使用的SBT子系統,以便jar文件被解析(或下載到)本地Ivy倉庫?

我用allDependencies想出來了。 這是(縮寫)代碼:

object AspectjWeaverPlugin extends AutoPlugin {
  private val aspectjWeaver = "org.aspectj" % "aspectjweaver" % "1.8.5" % "runtime"
  private val aspectjWeaverLibs = List("kamon-spray", "kamon-akka", "kamon-scala")

  val aspectjWeaverJarFile = taskKey[Option[File]]("The aspectj weaver jar file if it exists on the classpath.")

  override def requires = plugins.JvmPlugin
  override def projectSettings = Seq(
    allDependencies := {
      allDependencies.value ++ libraryDependencies.value.find(module => aspectjWeaverLibs.contains(module.name)).map(_ => aspectjWeaver)
    },
    aspectjWeaverJarFile := {
      val classpath = (managedClasspath in Runtime).value

      classpath.find(_.data.getName == s"${aspectjWeaver.name}-${aspectjWeaver.revision}.jar").map(_.data)
    }
  )
}

現在我可以使用帶有可選的aspectj weaver jar文件的新任務來設置runre-start和我用sbt-docker生成的Docker鏡像中所需的-javaagent:...選項。

仍然好奇這是否是最好的方式來做到這一點。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM