为什么sbt报告"错误:'。'预期但是找到了eof。"对于AutoPlugin?

时间:2014-09-13 16:48:02

标签: scala sbt

我尝试使用新的AutoPlugin功能创建一个sbt插件,但失败了。

所有代码都在这里:

build.sbt

sbtPlugin := true

name := "my-sbt-plugin"

version := "0.1.0"

organization := "test20140913"

项目/ MySbtPlugin.scala

import sbt._

object MySbtPlugin extends AutoPlugin {

  object autoImport {
    lazy val hello = taskKey[Unit]("hello task from my plugin")
  }

  import autoImport._

  val helloSetting = hello := println("Hello from my plugin")

  override def projectSettings = Seq(
    helloSetting
  )

}

项目/ build.scala

import sbt._

object MySbtPluginBuild extends Build {

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

  root.enablePlugins(MySbtPlugin)

}

当我在其上运行sbt时,会报告错误:

[info] Done updating.
[info] Compiling 2 Scala sources to /myplugin/project/target/scala-2.10/sbt-0.13/classes...
/sbttest/myplugin/build.sbt:0: error: '.' expected but eof found.
import _root_.sbt.plugins.IvyPlugin, _root_.sbt.plugins.JvmPlugin, _root_.sbt.plugins.CorePlugin, _root_.sbt.plugins.JUnitXmlReportPlugin, MySbtPlugin

回购

您可以克隆它:https://github.com/freewind/my-sbt-plugin,然后运行./sbt以重现它

2 个答案:

答案 0 :(得分:3)

sbt中的

Project是不可变的,即所有方法转换它。 Sbt将反思性地找到您在价值观上定义的项目。

基本上:

<强>项目/ build.scala

import sbt._

object MySbtPluginBuild extends Build {

  lazy val root = project.in(file("."))
  // here you're constructing a new project instance which is ignored.
  root.enablePlugins(MySbtPlugin)

}

您所要做的就是将项目DSL链接在一起并将结果分配给val,这是sbt唯一关注的事项:

import sbt._

object MySbtPluginBuild extends Build {
  lazy val root = project.in(file(".")).enablePlugins(MySbtPlugin)
}

答案 1 :(得分:3)

最后,我修复了插件,你可以在这里看到更新的代码:https://github.com/freewind/my-sbt-plugin

问题中有几个问题:

  1. 不需要project/build.scalaenablePlugins的部分只需要添加到使用此插件的项目中,不应该在插件项目本身中。

  2. 使用sbt 0.13.5(我在问题中使用过),插件必须位于包内,不能是顶级包。此问题已在sbt 0.13.6

  3. 中修复
  4. 除非我们将此行添加到插件中,否则无法自动启用该插件:

    override def trigger = allRequirements
    

    否则(或不覆盖trigger),我们必须将enablePluginsbuild.sbt中的Build.scala部分添加到使用此插件的项目中。

  5. 重要提示:如果您在开发过程中创建了另一个在本地尝试插件的项目,则需要在运行之前删除target dirs(例如target/project/targetsbt。否则你会遇到很多奇怪的问题。