【发布时间】:2014-09-08 12:22:45
【问题描述】:
我正在尝试定义一个单独的包任务而不修改编译配置中的原始任务。这个新任务将仅打包符合 API 的类的子集,我们需要能够与其他团队共享这些类,以便他们可以为我们的应用程序编写插件。所以最终结果将是两个 jar,一个包含完整的应用程序,另一个包含类的子集。
我通过创建一个名为 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
它以与 compile:packageBin 相同的方式生成完整的 jar。然后我尝试修改新 packageBin 任务中的映射:
mappings in (PluginApi, packageBin) ~= { (ms: Seq[(File, String)]) =>
ms filter { case (file, toPath) =>
toPath.startsWith("some/path/defining/api")
}
}
但这没有任何效果。我认为原因是对 pluginApi:packageBin 的调用被委托给 compile:packageBin 而不是克隆任务。
我可以在新范围内重新定义一个新的 packageBin,例如:
packageBin in PluginApi := {
}
但是,我必须重写所有 packageBin 功能,而不是重用现有代码。另外,万一重写是不可避免的,我不确定该实现会如何。
有人可以提供一个关于如何实现这一目标的示例吗?
【问题讨论】: