[英]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文件的新任務來設置run
, re-start
和我用sbt-docker生成的Docker鏡像中所需的-javaagent:...
選項。
仍然好奇這是否是最好的方式來做到這一點。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.