我开发了一个自定义sbt插件,可以导入sbt native packager和一堆其他插件。 这有助于引导scala项目,从而简化了导入我们在整个项目中使用的所有插件的过程。
我还有自定义任务,例如:
substituteTemplates
做自定义行为。
我也在改变我导入的插件的行为以应对我的自定义,例如:
packageZipTarball in Universal <<= (packageZipTarball in Universal) dependsOn substituteTemplates.
现在,一切正常但我的插件用户必须这样做:
val example = (project in file(".")).enablePlugins(JavaAppPackaging).settings(...
如果他不这样做,sbt将无法编译,因为sbt找到了不存在的东西(映射在Universal 等中的映射......)的定义。 以下是我试图解决的问题。
TAKE 1
现在,我想有可能应对需要启用某些插件的事实。 如果我启用了插件(例如JavaAppPackaging),那么我会进行一些其他更改,否则我会保持设置不变。 起初我尝试使用自定义设置键,例如:
val enableJavaAppPackaging = SettingKey[Boolean]("enableJavaAppPackaging","")
然后,我尝试使用它:
object MyWrapperPlugin extends AutoPlugin {
override def projectSettings: Seq[Setting[_]] = {
if (enableJavaAppPackaging.value) {
packageZipTarball in Universal <<= (packageZipTarball in Universal) dependsOn substituteTemplates,
mappings in Universal <++= templates.map {
_.keySet.map { k => file(s"target/templates/$k") -> k }.toList
},
// a lot of other stuff....
}
但是这不能像sbt抱怨那样起作用:
`value` can only be used within a task or setting macro, such as :=, +=, ++=, Def.task, or Def.setting
有一种方法可以用某种方式来做这种逻辑,对于sbt来说也可以吗?
TAKE 2
如果我不能这样做,至少我想默认转动JavaApp PAckaging插件,所以根本不做elsiffing。
object MyWrapperPlugin extends AutoPlugin {
override def requires: Plugins = AssemblyPlugin && DependencyGraphPlugin && JavaAppPackaging
但这也行不通。