插件的globalSettings中的ivyPaths

时间:2015-12-29 22:46:13

标签: sbt

object BlaBlaPlugin extends AutoPlugin {
  object autoImport {
    lazy val blabla = settingKey[Unit]("")
  }
  import autoImport._

  override lazy val globalSettings = Seq(
    blabla := println(ivyPaths.value.ivyHome.get.getPath)
  )
}

我明白了:

[error] Reference to undefined setting:
[error]
[error] */*:ivyPaths from */*:blabla ((BlaBlaPlugin) BlaBlaPlugin.scala:11) 

ivyPaths不是在全球范围内定义的吗? 我可以在.sbt / global.sbt中访问它,但不能在插件的globalSettings中访问它。

干杯

1 个答案:

答案 0 :(得分:0)

插件有几个问题。

projectSettings

  

ivyPaths不是在全球范围内定义的吗?

不,不是。

> inspect ivyPaths
[info] Setting: sbt.IvyPaths = sbt.IvyPaths@13e5338f
[info] Description:
[info]  Configures paths used by Ivy for dependency management.
[info] Provided by:
[info]  {file:/Users/xxx/foo/}root/*:ivyPaths
[info] Defined at:
[info]  (sbt.Classpaths) Defaults.scala:1128
[info] Dependencies:
[info]  *:appConfiguration
[info]  *:baseDirectory
[info] Reverse dependencies:
[info]  *:cleanCacheIvyDirectory
[info]  *:ivyConfiguration
[info]  *:blabla
[info] Delegates:
[info]  *:ivyPaths
[info]  {.}/*:ivyPaths
[info]  */*:ivyPaths

这表明ivyPaths的格式为{file:/Users/xxx/foo/}root/*:ivyPaths,其范围限定为当前项目root。如果您喜欢星球大战编码(使用源代码,Luke Defaults.scala通常是一个很好的起点。

所以要改变的第一件事就是使用projectSettings

覆盖需要

另请注意,sbt的内置设置和任务是使用自动插件加载的,因此如果您依赖它们,则需要确保将插件放在它们之后。为此,您需要覆盖requires方法,如下所示:

override def requires: Plugins = sbt.plugins.IvyPlugin

把它们放在一起

import sbt._
import Keys._

object BlaBlaPlugin extends AutoPlugin {
  override def requires: Plugins = sbt.plugins.IvyPlugin
  object autoImport {
    lazy val blabla = settingKey[Unit]("")
  }
  import autoImport._

  override lazy val projectSettings = Seq(
    blabla := println(ivyPaths.value.ivyHome.get.getPath)
  )
}