2014-11-06 105 views
3

我正在尝试构建一个自动设置scalariform首选项集的插件。无法使用sbt.AutoPlugins添加编译依赖关系

我插件的build.sbt:

name := "my-scalariform" 

organization := "com.my" 

version := "1.0-SNAPSHOT" 

sbtPlugin := true 

scalacOptions ++= Seq("-feature", "-deprecation", "-unchecked") 

addSbtPlugin("com.typesafe.sbt" % "sbt-scalariform" % "1.3.0") 

我最初的插件设计:

package com.my.plugins 

import com.typesafe.sbt.SbtScalariform 
import com.typesafe.sbt.SbtScalariform.{ 
    ScalariformKeys, 
    scalariformSettings 
} 
import sbt.AutoPlugin 
import sbt.{ Compile, Test } 
import sbt.Keys.{ compile, compileInputs } 
import scalariform.formatter.preferences.{ 
    DoubleIndentClassDeclaration, 
    FormattingPreferences, 
    IndentSpaces, 
    IndentWithTabs, 
    PreserveDanglingCloseParenthesis 
} 

object MyScalariformPlugin extends AutoPlugin { 

    override def trigger = allRequirements 

    lazy val formattingPreferences = { 
    import scalariform.formatter.preferences._ 
    Seq(
     ScalariformKeys.preferences := FormattingPreferences() 
     .setPreference(DoubleIndentClassDeclaration, true) 
     .setPreference(IndentSpaces, 2) 
     .setPreference(IndentWithTabs, false) 
     .setPreference(PreserveDanglingCloseParenthesis, true) 
    ) 
    } 

    override lazy val projectSettings = scalariformSettings ++ formattingPreferences 
} 

当我将这个插件项目中,我可以看到我的梯状设置:

> scalariform-preferences 
[info] FormattingPreferences(Map(DoubleIndentClassDeclaration -> true, IndentSpaces -> 2, IndentWithTabs -> false, PreserveDanglingCloseParenthesis -> true)) 

但是compileInputs缺少scalariform格式依赖关系:

> inspect compile:compile::compileInputs 
... 
[info] Defined at: 
[info] (sbt.Defaults) Defaults.scala:792 
[info] Dependencies: 
[info] compile:compile::incCompileSetup 
[info] compile:compile::streams 
[info] compile:compile::dependencyClasspath 
[info] compile:compile::compileOrder 
[info] compile:compile::scalacOptions 
[info] compile:compile::classDirectory 
[info] compile:compile::javacOptions 
[info] compile:compile::sourcePositionMappers 
[info] compile:compile::compilers 
[info] compile:compile::sources 
[info] compile:compile::maxErrors 
[info] Reverse dependencies: 
[info] compile:compile 
... 

如果我明确添加梯状command overrides在我的插件值,然后明确地把它添加到项目中,我得到正确的依赖关系:

lazy val commandSettings = Seq(
    compileInputs in (Compile, compile) <<= (compileInputs in (Compile, compile)) dependsOn (ScalariformKeys.format in Compile), 
    compileInputs in (Test, compile) <<= (compileInputs in (Test, compile)) dependsOn (ScalariformKeys.format in Test) 
) 

依赖关系:

> inspect compile:compile::compileInputs 
... 
[info] Defined at: 
[info] (sbt.Defaults) Defaults.scala:792 
[info] (com.my.plugins.MyScalariformPlugin) MyScalariformPlugin.scala:22 
[info] Dependencies: 
[info] compile:compile::incCompileSetup 
[info] compile:compile::streams 
[info] compile:compile::dependencyClasspath 
[info] compile:scalariformFormat 
[info] compile:compile::compileOrder 
[info] compile:compile::scalacOptions 
[info] compile:compile::classDirectory 
[info] compile:compile::javacOptions 
[info] compile:compile::sourcePositionMappers 
[info] compile:compile::compilers 
[info] compile:compile::sources 
[info] compile:compile::maxErrors 
[info] Reverse dependencies: 
[info] compile:compile 
... 

我已尝试使用autoImport自己指定此依赖关系,但会导致错误:

object autoImport { 
    lazy val commandSettings = Seq(
     compileInputs in (Compile, compile) <<= (compileInputs in (Compile, compile)) dependsOn (ScalariformKeys.format in Compile), 
     compileInputs in (Test, compile) <<= (compileInputs in (Test, compile)) dependsOn (ScalariformKeys.format in Test) 
    ) 
    } 

    import autoImport._ 

错误:

[error] References to undefined settings: 
[error] 
[error] */test:compile::compileInputs from */test:compile::compileInputs ((com.my.plugins.MyScalariformPlugin.autoImport) MyScalariformPlugin.scala:24) 
[error]  Did you mean test:compile::compileInputs ? 
[error] 
[error] */test:scalariformFormat from */test:compile::compileInputs ((com.my.plugins.MyScalariformPlugin.autoImport) MyScalariformPlugin.scala:24) 
[error]  Did you mean test:scalariformFormat ? 
[error] 
[error] */compile:compile::compileInputs from */compile:compile::compileInputs ((com.my.plugins.MyScalariformPlugin.autoImport) MyScalariformPlugin.scala:23) 
[error]  Did you mean compile:compile::compileInputs ? 
[error] 
[error] */compile:scalariformFormat from */compile:compile::compileInputs ((com.my.plugins.MyScalariformPlugin.autoImport) MyScalariformPlugin.scala:23) 
[error]  Did you mean compile:scalariformFormat ? 
[error] 

回答

1

此行添加到MyScalariformPlugin(不要问我为什么:))

override def requires = plugins.JvmPlugin 
+1

这是固定在1.x中,但我已经创建的https:/反正/github.com/sbt/sbt/issues/3843。在这个bug上花了一天半的时间。 – 2017-12-27 23:19:34