如何创建自定义包任务以在SBT中包含类的子集

时间:2014-07-17 14:48:21

标签: scala sbt

我正在尝试定义单独的包任务,而不在编译配置中修改原始任务。这个新任务只打包一个符合API的类的子集,我们需要能够与其他团队共享,这样他们就可以为我们的应用程序编写插件。所以最终结果将是两个罐子,一个是完整的应用程序,另一个是类的子集。

我通过创建一个名为pluginApi的不同配置来解决这个问题,并且会在这个新配置中重新定义packageBin任务,因此它不会更改packageBin的原始定义。这个想法来自这里:

How to create custom "package" task to jar up only specific package in SBT?

在我的build.stb中,我有:

lazy val PluginApi = config("pluginApi") extend(Compile) describedAs("Custom plugin api configuration")

lazy val root = project in file(".") overrideConfigs (PluginApi)

这有效地创建了我的新配置,我可以调用

sbt pluginApi:packageBin

以与编译相同的方式生成完整的jar:packageBin会这样做。然后我尝试使用以下命令修改新packageBin任务中的映射:

mappings in (PluginApi, packageBin) ~= { (ms: Seq[(File, String)]) =>
  ms filter { case (file, toPath) =>
    toPath.startsWith("some/path/defining/api")
  }
}

但这没有效果。我认为原因是因为调用pluginApi:packageBin被委托编译:packageBin而不是它是一个克隆任务。

我可以在新范围内重新定义新的packageBin,如:

packageBin in PluginApi := {

}

但是我必须重写所有packageBin功能,而不是重用现有代码。此外,如果重写是不可避免的,我不确定该实现将如何。

有人可以举例说明如何实现这个目标吗?

2 个答案:

答案 0 :(得分:2)

您可以按照以下方式完成

lazy val PluginApi = config("pluginApi").extend(Compile)

inConfig(PluginApi)(Defaults.compileSettings) // you have to have standard

mappings in (PluginApi, packageBin) := {
  val original = (mappings in (PluginApi, packageBin)).value
  original.filter { case (file, toPath) => toPath.startsWith("some/path/defining/api") }
}

unmanagedSourceDirectories in PluginApi := (unmanagedSourceDirectories in Compile).value

请注意,如果您将来源保留在src/main/scala中,则必须在新创建的配置中覆盖unmanagedSourceDirectories

通常unmanagedSourceDirectories包含配置名称。例如。 src/pluginApi/scalasrc/pluginApi/java

答案 1 :(得分:0)

我遇到过类似的问题(每个项目有多个jar)。我们的项目使用蚂蚁 - 在这里你可以做到,你只会重复自己。

但是,我得出的结论是,这个场景(一个项目的2个JAR)实际上可以通过拆分项目来简化 - 即从中制作2个模块。 这样,我就不必去战斗"假设项目==神器的工具(比如sbt,也许是maven ?, IDEA的默认设置,......)。 作为奖励点,编译器帮助我验证我的依赖关系是否正确,即我不小心让我的API包依赖于实现包 - 当一起编译所有内容并且只在JAR步骤中拆分类时,你运行在您的设置中获得无效依赖的风险,您只能在测试时看到,因为在编译期间,所有内容都会一起编译。