SBT如何创建自定义命令

ssu*_*ski 1 scala sbt

鉴于我有 build.sbt

name := """app"""

version := "1.0-SNAPSHOT"

lazy val root = (project in file(".")).enablePlugins(PlayScala)

scalaVersion := "2.11.7"

// <-- some other code -->

import Fixtures._

lazy val fixtures = inputKey[Unit]("Generating Cassandra fixtures")

fixtures := {
  Fixtures.generate()
}
Run Code Online (Sandbox Code Playgroud)

和Fixtures.scala在project目录中

object Fixtures {
  def generate (): Unit = {
    println("generating fixtures")
  }
}
Run Code Online (Sandbox Code Playgroud)

我能够运行命令./activator fixtures,我正在"生成固定装置"

但是我怎么能调用某些服务,比如说GenerateUserFixtureService.scalaapp/scala/com/MyProject/Service目录中调用.导入包不起作用,因为project目录属于不同的包.我无法Fixtures.scala从Play 导入任何内容

|
|___app
|   |__scala
|      |__com
|         |__MyProject
|            |__Service
|               |--GenerateUserFixtureService.scala
|___project
|   |--Fixtures.scala
|___
    |--build.sbt
Run Code Online (Sandbox Code Playgroud)

实际上问题是,为什么我只能导入目录中的build.sbt文件project.或者如何从appdir 调用另一个文件?

或许我想的方式完全错了.我只是想创建一些命令upload:fixtures send:emails等,并调用一些scala类.我怎样才能做到这一点?

Art*_*sia 8

要创建自定义命令,必须指定与命令逻辑对应的函数.让我们考虑几个例子:首先打印问候消息:

 def helloSbt = Command.command("hello") { state =>
        println("Hello, SBT")
        state
    }

commands += helloSbt
Run Code Online (Sandbox Code Playgroud)

只需将此代码放入build.sbt,commandsproject key其存在sbt.Keysval commands = SettingKey[Seq[Command]]

当然,您可以像成功或失败一样管理命令语句:

def failJustForFun = Command.single("fail-condidtion") {
        case (state, "true") => state.fail
        case (state, _) => state
    }
Run Code Online (Sandbox Code Playgroud)

您可以通过以下方式更改控制台中特定部分命令或此命令输出的颜色DefaultParsers:

    lazy val color = token( Space ~> ("blue" ^^^ "4" | "green" ^^^ "2") )
    lazy val select = token( "fg" ^^^ "3" | "bg" ^^^ "4" )
    lazy val setColor = (select ~ color) map { case (g, c) => "\033[" + g + c + "m" }
Run Code Online (Sandbox Code Playgroud)

或者,您可以扩展xsbti.AppMain和实施 - 您自己的逻辑