Scala 为什么sbt报告;错误:'';预期但发现eof。”;自动驾驶?

Scala 为什么sbt报告;错误:'';预期但发现eof。”;自动驾驶?,scala,sbt,Scala,Sbt,我正在尝试使用新的AutoPlugin功能创建sbt插件,但失败了 所有代码都在这里: 构建.sbt sbtPlugin := true name := "my-sbt-plugin" version := "0.1.0" organization := "test20140913" project/MySbtPlugin.scala import sbt._ object MySbtPlugin extends AutoPlugin { object autoImport {

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

所有代码都在这里:

构建.sbt

sbtPlugin := true

name := "my-sbt-plugin"

version := "0.1.0"

organization := "test20140913"
project/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
  )

}
import sbt._

object MySbtPluginBuild extends Build {

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

  root.enablePlugins(MySbtPlugin)

}
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)

}
project/build.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
  )

}
import sbt._

object MySbtPluginBuild extends Build {

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

  root.enablePlugins(MySbtPlugin)

}
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)

}
当我在其上运行
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
回购


您可以克隆它:,然后运行
/sbt
以在sbt中复制它

项目
是不可变的,即所有方法都会转换它。Sbt将反射性地查找您根据值定义的项目

基本上:

project/build.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
  )

}
import sbt._

object MySbtPluginBuild extends Build {

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

  root.enablePlugins(MySbtPlugin)

}
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)
}

最后,我修复了插件,您可以在这里看到更新的代码:

问题中有几个问题:

  • 不需要
    项目/build.scala
    enablePlugins
    的部分只需要添加到使用此插件的项目中,而不应该添加到插件项目本身中

  • 使用
    sbt0.13.5
    (我在问题中使用过),插件必须在包中,不能是顶级插件。此问题已在sbt 0.13.6中修复

  • 插件无法自动启用,除非我们在插件中添加以下行:

    override def trigger = allRequirements
    
    否则(或不重写
    触发器
    ),我们必须将
    build.sbt
    build.scala
    中的
    enablePlugins
    部分添加到使用此插件的项目中

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


  • 请尝试sbt0.13.6,因为它有助于删除build.sbt-似乎解析器/代码生成器有问题。sbt0.13.6的错误消失了,但我仍然无法在其他项目中使用此插件。我只是按照您的建议修复了它,但错误仍然存在。谢谢!与(2)一刀两断使我免去了许多悲痛。尽管SBT很酷,但像这样奇怪的边缘情况会使曲线变得非常陡峭,特别是当首次尝试使用它来解决非平凡问题时。