首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么sbt报告“错误:.”预期但发现。为了一个AutoPlugin?

为什么sbt报告“错误:.”预期但发现。为了一个AutoPlugin?
EN

Stack Overflow用户
提问于 2014-09-13 16:48:02
回答 2查看 5K关注 0票数 2

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

所有代码都在这里:

build.sbt

代码语言:javascript
复制
sbtPlugin := true

name := "my-sbt-plugin"

version := "0.1.0"

organization := "test20140913"

project/MySbtPlugin.scala

代码语言:javascript
复制
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

代码语言:javascript
复制
import sbt._

object MySbtPluginBuild extends Build {

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

  root.enablePlugins(MySbtPlugin)

}

当我在上面运行sbt时,它会报告一个错误:

代码语言:javascript
复制
[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来复制它

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-09-14 04:20:19

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

问题中有几个问题:

  1. 不需要project/build.scalaenablePlugins的部分只需要添加到使用此插件的项目中,不应该在插件项目本身中添加。
  2. 使用sbt 0.13.5(我在问题中使用),插件必须在包中,不能是顶级插件。此问题已在sbt 0.13.6中解决。
  3. 除非我们将这一行添加到插件中,否则无法自动启用插件: 覆盖def触发器= allRequirements 否则(或不覆盖trigger),我们必须将build.sbtBuild.scala中的enablePlugins部分添加到使用此插件的项目中。
  4. 注意:如果您在开发期间创建了另一个项目来在本地尝试插件,那么在运行target之前,您需要删除sbt的dirs(例如target/project/target)。否则你会有很多奇怪的问题。
票数 3
EN

Stack Overflow用户

发布于 2014-09-13 19:17:47

sbt中的Project是不变的,即所有的方法都对它进行了转换。Sbt会反思广益地查找您在值上定义的项目。

基本上:

project/build.scala

代码语言:javascript
复制
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关注的唯一事项:

代码语言:javascript
复制
import sbt._

object MySbtPluginBuild extends Build {
  lazy val root = project.in(file(".")).enablePlugins(MySbtPlugin)
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25825423

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档