我正在尝试定义单独的包任务,而不在编译配置中修改原始任务。这个新任务只打包一个符合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功能,而不是重用现有代码。此外,如果重写是不可避免的,我不确定该实现将如何。
有人可以举例说明如何实现这个目标吗?
答案 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/scala
或src/pluginApi/java
。
答案 1 :(得分:0)
我遇到过类似的问题(每个项目有多个jar)。我们的项目使用蚂蚁 - 在这里你可以做到,你只会重复自己。
但是,我得出的结论是,这个场景(一个项目的2个JAR)实际上可以通过拆分项目来简化 - 即从中制作2个模块。 这样,我就不必去战斗"假设项目==神器的工具(比如sbt,也许是maven ?, IDEA的默认设置,......)。 作为奖励点,编译器帮助我验证我的依赖关系是否正确,即我不小心让我的API包依赖于实现包 - 当一起编译所有内容并且只在JAR步骤中拆分类时,你运行在您的设置中获得无效依赖的风险,您只能在测试时看到,因为在编译期间,所有内容都会一起编译。