我有一个包含多个较小项目的项目,其中一些相互依赖,例如,有一个公用项目取决于commons项目。其他项目可能会或可能不会取决于公用事业或公共场所,也可能都不取决于它们。
在build.sbt文件的末尾有程序集合并策略,程序集中的测试是{}。
我的问题是:这是正确的吗,每个项目都应该有自己的合并策略;如果是这样,依赖该项目的其他项目是否会从他们那里继承该策略?将合并策略包含在所有项目定义中似乎很麻烦,并且可能意味着很多重复的代码。
这个问题也适用于测试,每个项目都应该有一条线来确定是否应该执行测试,还是应该继承?
提前致谢。如果有人知道与明智(相对复杂)示例的链接,那也很好。
在我的日常工作中,我目前从事大型大型项目。不幸的是它是封闭的,所以我不能分享细节,但是我可以分享一些指导。
创建一个rootSettings
仅由根/容器项目使用的,因为它通常不是程序集或发布步骤的一部分。它包含如下内容:
lazy val rootSettings := Seq(
publishArtifact := false,
publishArtifact in Test := false
)
创建一个commonSettings
由所有子项目共享的项目。在此处放置基础/共享装配体设置:
lazy val commonSettings := Seq(
// We use a common directory for all of the artifacts
assemblyOutputPath in assembly := baseDirectory.value /
"assembly" / (name.value + "-" + version.value + ".jar"),
// This is really a one-time, global setting if all projects
// use the same folder, but should be here if modified for
// per-project paths.
cleanFiles <+= baseDirectory { base => base / "assembly" },
test in assembly := {},
assemblyMergeStrategy in assembly := {
case "BUILD" => MergeStrategy.discard
case "logback.xml" => MergeStrategy.first
case other: Any => MergeStrategy.defaultMergeStrategy(other)
},
assemblyExcludedJars in assembly := {
val cp = (fullClasspath in assembly).value
cp filter { _.data.getName.matches(".*finatra-scalap-compiler-deps.*") }
}
)
每个子项目都使用commonSettings
,并应用特定于项目的覆盖:
lazy val fubar = project.in(file("fubar-folder-name"))
.settings(commonSettings: _*)
.settings(
// Project-specific settings here.
assemblyMergeStrategy in assembly := {
// The fubar-specific strategy
case "fubar.txt" => MergeStrategy.discard
case other: Any =>
// Apply inherited "common" strategy
val oldStrategy = (assemblyMergeStrategy in assembly).value
oldStrategy(other)
}
)
.dependsOn(
yourCoreProject,
// ...
)
顺便说一句,如果使用IntelliJ。不要命名您的根项目变量root
,因为这是在最近的项目菜单中显示为项目名称的名称。
lazy val myProjectRoot = project.in(file("."))
.settings(rootSettings: _*)
.settings(
// ...
)
.dependsOn(
// ...
)
.aggregate(
fubar,
// ...
)
您可能还需要添加用于合并reference.conf
文件的自定义策略(用于Typesafe Config库):
val reverseConcat: sbtassembly.MergeStrategy = new sbtassembly.MergeStrategy {
val name = "reverseConcat"
def apply(tempDir: File, path: String, files: Seq[File]): Either[String, Seq[(File, String)]] =
MergeStrategy.concat(tempDir, path, files.reverse)
}
assemblyMergeStrategy in assembly := {
case "reference.conf" => reverseConcat
case other => MergeStrategy.defaultMergeStrategy(other)
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句