2011-11-11 58 views
8

我的项目仍在使用sbt 0.7.7,我发现可以从sbt提示符运行的实用程序类非常方便。我还可以将它与单独维护的属性相结合 - 通常用于从主机到主机的环境相关值。这是我的项目定义的一个例子project/build目录下:sbt 0.11需要运行任务示例

class MyProject(info: ProjectInfo) extends DefaultProject(info) { 
    //... 
    lazy val extraProps = new BasicEnvironment { 
    // use the project's Logger for any properties-related logging 
    def log = MyProject.this.log 
    def envBackingPath = path("paths.properties") 
    // define some properties that will go in paths.properties 
    lazy val inputFile = property[String] 
    } 

    lazy val myTask = task { args => 
    runTask(Some("foo.bar.MyTask"), 
     runClasspath, extraProps.inputFile.value :: args.toList).dependsOn(compile) 
     describedAs "my-task [options]" 
    } 
} 

我就可以使用我的任务,因为my-task option1 option2的SBT shell下。

我读过的https://github.com/harrah/xsbt/wiki新的SBT 0.11文档包括TasksTaskInputs坦率地说,我仍然对如何完成我做了0.7.7挣扎的章节。

看起来额外的属性可以简单地替换为单独的environment.sbt,那么这些任务必须在project/build.scala中定义,然后才能设置为build.sbt。它看起来也有完成支持,看起来非常有趣。

除此之外,我有点不知所措。我怎样才能完成我对新手做的事情?

+0

我想帮助,但我不记得SBT 0.7.7细节。我想知道这个问题是否可以分解为多个关于sbt 0.11的自包含问题? –

+0

@KiptonBarros,当然,我们从基本的'runTask'开始,我可以在sbt shell中为其提供参数。 – huynhjl

+0

看来sbt的文档目前正在修改。我认为[输入任务](https://github.com/harrah/xsbt/wiki/Input-Tasks)wiki页面上的“基本输入任务定义”部分就是您要查找的内容。 –

回答

3

可以定义这样的任务:

val myTask = InputKey[Unit]("my-task") 

而且您的设置:

val inputFile = SettingKey[String]("input-file", "input file description") 

你也可以这样定义一个新的配置:

lazy val ExtraProps = config("extra-props") extend(Compile) 

这个配置增加您的项目并使用它来设置此配置的设置:

lazy val root = Project("root", file(".")).config(ExtraProps).settings(
    inputFile in ExtraProps := ... 
    ... 
    myTask in ExtraPops <<= inputTask { (argTask:TaskKey[Seq[String]]) => 
    (argTask, inputFile) map { (args:Seq[String], iFile[String]) => 
     ... 
    } 
    } 
).dependsOn(compile) 

然后用额外的道具发动你的任务:我的任务