【发布时间】:2015-12-21 07:32:33
【问题描述】:
当从旧版本的 SBT 切换到最新版本时,我们失去了快速获取所有 jar 依赖项并将它们复制到目录的能力。在 XSBT 0.11.2 中是否有一种简单的方法可以做到这一点?
【问题讨论】:
当从旧版本的 SBT 切换到最新版本时,我们失去了快速获取所有 jar 依赖项并将它们复制到目录的能力。在 XSBT 0.11.2 中是否有一种简单的方法可以做到这一点?
【问题讨论】:
将以下内容添加到您的 build.sbt 将所有依赖项复制到项目根目录中的 lib_managed 文件夹中。
retrieveManaged := true
这是你要求的吗?
【讨论】:
lib_managed 目录,其中包含该模块所依赖的所有库的整个传递闭包,包括另一个模块该项目中的两个模块和它们的依赖项?
我们使用与此类似的自定义任务定义来复制 jar。我不知道这是否是推荐的方法——那里没有丑陋的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
}
}
【讨论】:
另请参阅:How to declare a project dependency in SBT 0.10?
是的,你加了
retrieveManaged := true
你会在 lib_managed 文件夹中看到 jars
【讨论】:
使用 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(
//...
)
)
【讨论】:
copyOutpath 而不是maxDynamicJarDir 吗?
也许我对这个问题的回答对你有帮助:Is there a way to get all dependencies of the project via sbt plugin? 这是我所知道的最简单的方法(我使用的是 sbt 0.11.2)。
【讨论】: