Получение предоставленных зависимостей в SBT

Я пытаюсь использовать конфигурацию provided в SBT, но не могу понять, как получить полный путь к классам зависимостей provided.

Для простоты предположим, что у меня есть два проекта, A и B:

  • A имеет несколько зависимостей (JAR) и экспортирует скомпилированные файлы классов в path/to/A/target
  • B зависит от A в области provided ( Project("B") dependsOn(A % "provided")) и экспортирует скомпилированные файлы классов в path/to/B/target

В B это возвращает предоставленные файлы JAR, но не предоставленные внутренние зависимости:

providedDependencies <<= (update) map (_.select(Set("provided")))

Это возвращает внутренние зависимости (path/to/A/target) для каждой конфигурации, но не конкретно для области provided, и не выводит зависимости JAR:

providedDependencies <<= (internalDependencyClasspath) map (_.files)

Однако модуль A отображается в области provided при использовании show update в проекте B.

Есть идеи?


person F.X.    schedule 27.05.2013    source источник


Ответы (2)


В итоге я использовал эту задачу после прочтения этот ответ, но это было удивительно трудно найти:

def providedInternalDependenciesTask(proj: ProjectRef, struct: Load.BuildStructure) = {
    // "Provided" dependencies of a single ResolvedProject
    def providedDeps(op: ResolvedProject): Seq[ProjectRef] = {
      op.dependencies
        .filter(p => (p.configuration getOrElse "") == "provided")
        .map(_.project)
    }

    // Collect every "provided" dependency in the dependency graph
    def collectDeps(projRef: ProjectRef): Seq[ProjectRef] = {
      val deps = Project.getProject(projRef, struct).toSeq.flatMap(providedDeps)
      deps.flatMap(ref => ref +: collectDeps(ref)).distinct
    }

    // Return the list of "provided" internal dependencies for the ProjectRef
    // in argument.
    collectDeps(proj)
      .flatMap(exportedProducts in (_, Compile) get struct.data)
      .join.map(_.flatten.files)
  }

Пример использования:

val providedInternalDependencies = TaskKey[Seq[java.io.File]]
...
providedInternalDependencies <<= (thisProjectRef, buildStructure) flatMap providedInternalDependenciesTask
person F.X.    schedule 27.05.2013

Я попробовал решение, предоставленное FX., но оно продолжало показывать мне пустой список зависимостей (как для предоставленных, так и для других).

Я обнаружил, что вы можете запросить задачу «обновить», чтобы предоставить вам полное представление, а затем вы можете фильтровать на основе конфигурации (например, «при условии»).

val providedDependencies = TaskKey[Seq[java.io.File]]("task-provided-deps","The list of dependencies in the 'provided' scope")
...
providedDependencies <<= (update) map {
    up.select(configurationFilter("provided"))
},

Я использовал этот список, чтобы исключить искажение предоставленных отпечатков в моем плагине сонара «все в одном».

person jeckhart    schedule 05.08.2013