Есть ли простой способ скопировать все зависимости jar в определенный каталог в XSBT 0.11.2?

При переключении с одной из старых версий SBT на последнюю версию мы потеряли способность быстро захватить все jar-зависимости и скопировать их в каталог. Есть ли простой способ сделать то же самое в XSBT 0.11.2?

Ответы

Ответ 1

Добавление следующего в ваш build.sbt копирует все зависимости в папку lib_managed в корневом каталоге вашего проекта.

retrieveManaged := true

Это то, о чем вы просите?

Ответ 2

Мы используем настраиваемое определение задачи, подобное этому, чтобы скопировать банки. Я понятия не имею, рекомендуется ли это для этого - там нет уродливого collect. Не стесняйтесь публиковать улучшения (или, если хотите, изменить мой ответ в строке).

copyJarsFolder <<= (crossTarget in (Compile, packageBin)).apply(_ / "jars")

copyJars <<= inputTask { (argTask: TaskKey[Seq[String]]) =>
  (copyJarsFolder, dependencyClasspath in Compile) map { (folder, cpEntries) =>
    ("mkdir -p " + folder).!
    //
    // find all dependencies
    val jars = cpEntries.collect {
      case attrFile if attrFile.metadata.keys.exists(_.label == "artifact") =>
        // probably an external jar
        attrFile.data
    }
    val copyCmd = jars.mkString("cp -p ", " ", " " + folder)
    copyCmd.!
    folder
  }
}

Ответ 4

Использование sbt 0.13.7, IO.copy и друзей.

  • Определите несколько настроек где-нибудь в определении сборки:

    val copyOutpath             = settingKey[File]("Where to copy all libs and built artifact")
    val copyAllLibsAndArtifact  = taskKey[Unit]("Copy runtime dependencies and built artifact to 'copyOutpath'")
    
  • Определите поведение для этих настроек:

    lazy val myProject = project
      .in(file("."))
      .settings(
        copyOutpath              := baseDirectory.value / "specialFolderForMyProgram",
        copyAllLibsAndArtifact   := {
          val allLibs:                List[File]          = dependencyClasspath.in(Runtime).value.map(_.data).filter(_.isFile).toList
          val buildArtifact:          File                = packageBin.in(Runtime).value
          val jars:                   List[File]          = buildArtifact :: allLibs
          val `mappings src->dest`:   List[(File, File)]  = jars.map(f => (f, maxDynamicJarDir.value / f.getName))
          val log                                         = streams.value.log
          log.info(s"Copying to ${copyOutpath.value}:")
          log.info(s"  ${`mappings src->dest`.map(_._1).mkString("\n")}")
          IO.copy(`mappings src->dest`)
        },
        libraryDependencies       ++= Seq(
          //...
        )
      )