James Moore
James Moore

Reputation: 9026

How do you reference tasks in a .scala file in sbt 13?

I'd like to create a task that does a deliver-local followed by a copy of the .xml file to ivy.xml in the project root. I'd like it to be available from every sbt command line, so I'm putting it in ~/.sbt/0.13/plugins.

I'm confused about how to reference the value from deliverLocal, though. If I do this:

import sbt._
import Keys._

object JivyBuild extends Build {

lazy val jivy = TaskKey[String] ( "jivy", "Copy the ivy file created by deliverLocal to ivy.xml" )

lazy val jivyTask = jivy := {
  val ivyFile = deliverLocal.value
  com.google.common.io.Files.copy(ivyFile, baseDirectory.value / "ivy.xml")
  println(s"base dir is " + baseDirectory.value.toString)
  ivyFile.toString
}

    override lazy val settings = super.settings ++
        Seq(jivyTask, resolvers := Seq())

    lazy val root = Project(id = "root",
                            base = file("."),
                            settings = Project.defaultSettings ++ settings)
}

I get this error when I start sbt:

[error] Reference to undefined setting: 
[error] 
[error]   {.}/*:deliverLocal from {.}/*:jivy (/Users/james/.sbt/0.13/plugins/Jivy.scala:8)
[error]      Did you mean *:deliverLocal ?
[error]  
[error] Use 'last' for the full log.

Upvotes: 0

Views: 164

Answers (1)

ishaaq
ishaaq

Reputation: 6779

You are overriding the default settings and so the deliverLocal setting gets obliterated. Don't do so, instead change:

override lazy val settings = super.settings ++
    Seq(jivyTask, resolvers := Seq())

to something like:

lazy val mysettings = super.settings ++
    Seq(jivyTask, resolvers := Seq())

And refer to it in root instead of settings:

lazy val root = Project(id = "root",
                        base = file("."),
                        settings = Project.defaultSettings ++ mysettings)

Upvotes: 3

Related Questions