Scala 如何在使用SBT编译之前进行着色?

Scala 如何在使用SBT编译之前进行着色?,scala,sbt,sbt-assembly,Scala,Sbt,Sbt Assembly,主要由两部分组成 根项目所在的位置 其中一些外部依赖项用阴影表示。着色JAR将由根项目下的子项目通过unmanagedJars设置来确定 问题是如何在编译根项目之前组装着色项目。否则,根项目将无法编译,因为着色jar中的类不可用。正如我在评论中所说的,我将采取不同的方法。如果将依赖项作为托管依赖项,则可以在库本身和项目内部对它们进行着色 让我们看一个例子: 假设我有一个依赖于com.typesafe.config的项目。我可以在它自己的库中对其进行着色,也就是说在com.typesafe.c

主要由两部分组成

  • 根项目所在的位置
  • 其中一些外部依赖项用阴影表示。着色JAR将由根项目下的子项目通过
    unmanagedJars
    设置来确定

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

正如我在评论中所说的,我将采取不同的方法。如果将依赖项作为托管依赖项,则可以在库本身和项目内部对它们进行着色

让我们看一个例子:

假设我有一个依赖于
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

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

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

assemblyShadeRules in assembly ++= Seq(
  ShadeRule.rename("com.typesafe.config.**" -> "my_conf.@1")
    .inLibrary("com.typesafe" % "config" % "1.3.0")
    .inProject
)
这就是包现在的内部外观(
my_conf
在着色之前最初是
com.typesafe.config
):

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


为什么要使用单独的构建来隐藏外部依赖项?为什么不将它们作为托管依赖项,并在
Build.scala
root中对它们进行着色?因为着色后我需要依赖于类。“托管依赖项”将在着色之前引入类。不一定。如果同时在库中和项目中对项目进行着色处理,那么它也会消除内部依赖关系。这是什么意思?您有任何示例或文档吗?“托管依赖项”似乎不起作用。依赖项目无法编译,未找到着色类。“托管依赖项”是指类似于
项目(“核心”)。依赖项(阴影)
?顺便问一下,library.inProject与
inAll
有何不同?@manuzhang不,我所说的托管依赖关系是指SBT管理的依赖关系。你能展示一个
build.sbt
的例子吗?这样我们就可以用它来调整阴影了。我终于理解了你的意思,并且用托管依赖项对依赖项目进行阴影处理是有效的。谢谢你救了我一天。最后是我们的构建文件。该方法不是很干净,因此我必须手动添加/删除已发布pom文件中的依赖项,尽管为了清晰起见对.@tomek.xyz进行了编辑