使用自定义 sbt 插件

Posted

技术标签:

【中文标题】使用自定义 sbt 插件【英文标题】:Using a custom sbt plugin 【发布时间】:2014-12-05 20:08:36 【问题描述】:

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

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

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

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

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

我正在使用 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

【问题讨论】:

在定义插件的项目的sbt配置中,你有没有用sbtPlugin := true指定它是一个sbt插件?? 是的,我有。我已经编辑了问题并为插件项目提供了整个build.sbt 【参考方案1】:

问题最终出在项目的project/build.properties 尝试使用插件上。该文件将 sbt 版本设置为 0.13.1,由于某些原因,我的插件和 sbt plugins 命令都不起作用。

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

【讨论】:

以上是关于使用自定义 sbt 插件的主要内容,如果未能解决你的问题,请参考以下文章

可选择在 SBT 中使用自定义配置运行测试

Scala SBT - sbt-native-packager,如何指定自定义阶段目录

如何在 Intellij Idea 中使用自定义 sbt 版本?

如何在 sbt 中的测试任务之前附加自定义任务以执行?

使用 -Xfatal-warnings 但忽略弃用警告/使用 SBT 的自定义报告器

SBT 不支持自定义解析器