【问题标题】:how to shade before compile with SBT?如何在使用 SBT 编译之前进行遮蔽?
【发布时间】:2017-03-16 18:37:19
【问题描述】:

Our project主要由两部分组成

问题是如何在编译根项目之前组装阴影项目。否则,根项目将无法编译,因为阴影 jar 中的那些类不可用。

【问题讨论】:

  • 为什么要使用单独的构建来遮蔽外部依赖项?为什么不将它们作为托管依赖项并将它们隐藏在 Build.scala 根目录中?
  • 因为我需要依赖于着色后的类。 “托管依赖项”将在着色之前引入类。
  • 不一定。如果您同时为项目添加了inLibraryinProject 的阴影,它也会摆脱内部依赖项
  • 你是什么意思?您有任何示例或文档吗?

标签: scala sbt sbt-assembly


【解决方案1】:

正如我在 cmets 中所说,我会采取不同的路线。如果您将依赖项作为托管的依赖项,您可以在库本身和项目内部对它们进行遮蔽。

我们来看一个例子:

假设我有一个依赖于com.typesafe.config 的项目。我可以在它自己的库中隐藏它,这意味着在 com.typesafe.config 的代码中,以及在消费库中。

你这样定义它:

assemblyShadeRules in assembly ++= Seq(
  ShadeRule.rename("com.typesafe.config.**" -> "my_conf.@1")
    .inLibrary("com.typesafe" % "config" % "1.3.0")
    .inProject
)

这基本上意味着“拿走任何带有com.typesafe.config 的包裹并将其遮蔽到my_conf。”

请注意,我们同时使用了inLibraryinProject。前者的意思是“在com.typesafe.config 中更改包名和对它们的引用”,inProject 的意思是“在我的代码中更改对com.typesafe.config 的所有引用”。

现在,它的输出如下所示:

这就是包内部现在的样子(my_conf 在阴影之前最初是com.typesafe.config):

这是您的代码将引用的包:

【讨论】:

  • “托管依赖项”似乎不起作用。依赖项目无法使用未找到的阴影类进行编译。 “托管依赖项”是指 Project("core").dependsOn(shaded) ?顺便问一下,inLibrary.inProjectinAll 有什么不同?
  • @manuzhang 不,托管依赖项是指由 SBT 管理的依赖项。您能否展示一个build.sbt 的示例,以便我们可以使用它来调整阴影。
  • 我终于明白了你的意思,并且使用托管依赖项对依赖项目进行着色是可行的。谢谢你拯救了我的一天。
  • This 最后是我们的构建文件。该方法不是很干净,但我必须在已发布的 pom 文件中手动添加/删除依赖项。
  • @tomek.xyz 为清楚起见已编辑
猜你喜欢
  • 2017-10-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-26
  • 2011-12-03
  • 1970-01-01
  • 2019-08-23
  • 2021-12-07
相关资源
最近更新 更多