使用自定义sbt插件

时间:2014-10-10 15:39:09

标签: scala plugins sbt

我已经创建了一个新的scala项目,并在AutoPlugin目录和相应的命名空间下面编写了一个src/main/scala/com/company/plugin。插件代码是来自[1]的HelloPlugin3的剪切和粘贴,但我更改了名称。

然后,在第二个sbt项目中,我更新了project/plugins.sbt文件以包含我的新Hello World插件。第二个项目有其他商业代码'当我在第二个项目中运行sbt时,插件已经解决,我已经通过删除~/.ivy/local/...下面的jar然后重新加载项目并见证sbt抱怨它可以'来测试它。找到插件。当我再次publishLocal我的插件项目时,该错误消失了。

所以我很高兴插件被解析,并且jar文件不是空的,因为我已经检查了它的内容。

但是,当我执行sbt> about时,我的自定义插件未列出,并且我期望可用的命令不是。 (" [错误]不是有效命令:hello")。但我在plugins.sbt(io.spray sbt-revolver)中列出的另一个插件确实出现在输出中。

插件项目和第二个项目的scalaVersion := "2.10.3"文件都指定了build.sbt

我使用的是sbt 0.13.6。有趣的是,也许是相关的,sbt命令plugins在这个项目中显然没有效果,尽管它在插件项目中运行得很好。

为了让我的第二个项目可以使用该命令,我错过了什么额外的步骤?我如何检查是否发生了一些特别混乱的sbt配置?

为方便起见,插件代码如下所示,但如上所述,它是来自其下方链接的副本。

package com.company.plugin

import sbt._
import Keys._

object HelloPlugin extends AutoPlugin {

  object autoImport {
    val greeting = settingKey[String]("greeting")
  }

  import autoImport._
  override def trigger = allRequirements
  override lazy val buildSettings = Seq(
    greeting := "Hi",
    commands += helloCommand)
  lazy val helloCommand = 
    Command.command("hello") { (state: State) =>
      println("fred")
      state
    }   

}

编辑:

插件项目的build.sbt如下;

sbtPlugin := true

scalaVersion  := "2.10.3"

organization  := "com.company"

name    := "name"

version   := "0.0.1-SNAPSHOT"

我在此项目中创建的唯一其他文件是插件本身的.scala文件。

[1] http://www.scala-sbt.org/release/docs/Plugins.html

1 个答案:

答案 0 :(得分:0)

问题最终导致项目的project/build.properties试图使用该插件。此文件将sbt版本设置为0.13.1,由于某些原因,我的插件和sbt plugins命令都无法正常工作。

将值更改为0.13.6会使所有问题都消失。