【问题标题】:Why does sbt report "error: '.' expected but eof found." for an AutoPlugin?为什么 sbt 报告“错误:'。'预期但发现 eof。”自动插件?
【发布时间】:2014-09-14 21:23:27
【问题描述】:

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

所有代码都在这里:

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

}

project/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来复制它

【问题讨论】:

  • 请尝试 sbt0.13.6
  • 它也有助于删除 build.sbt - 似乎是解析器/code_generator 的问题
  • 用sbt0.13.6,错误消失了,但是我在其他项目还是不能使用这个插件

标签: scala sbt


【解决方案1】:
sbt 中的

Project 是不可变的,即所有方法 transform 它。 Sbt 会反思性地找到你根据价值观定义的项目。

基本上:

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

【讨论】:

  • 我只是按照您的建议修复了它,但错误仍然存​​在
【解决方案2】:

最后,我修复了插件,你可以在这里看到更新的代码: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),我们必须在使用此插件的项目中添加build.sbtBuild.scala中的enablePlugins部分。

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

【讨论】:

  • 谢谢!与 (2) 相得益彰,让我免去了很多悲伤。尽管 SBT 很酷,但像这样奇怪的边缘情况会使曲线变得非常陡峭,尤其是在第一次尝试使用它来解决不平凡的问题时。
猜你喜欢
  • 2016-10-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-02
  • 2019-02-12
相关资源
最近更新 更多