使用SBT管理包含Scala和Python的项目

时间:2015-05-13 03:10:39

标签: python scala sbt

在当前项目中,我构建了用于与特定数据源交互的Python代码;现在,我正在构建一个Scala版本。

我重新安排了一些事情,以便所有Python代码都存放在我的Scala代码的SBT项目中的src/main/python内,但这让我想到:有没有什么好方法可以在两者之间集成项目管理?设置SBT以便我可以将我的Python distutils安装/ sdist生成或sphinx文档生成作为SBT任务运行?

或者,更一般地说:是否有通过SBT运行任意系统任务的标准方法?

3 个答案:

答案 0 :(得分:2)

来自文档(http://www.scala-sbt.org/0.13/docs/Process.html):

  

sbt包含一个过程库,可以简化外部工作   流程。该库在构建时无需导入即可使用   定义以及由consoleProject任务启动的解释器。

     

要运行外部命令,请使用感叹号进行操作!:

"find project -name *.jar" !

答案 1 :(得分:2)

要使用SBT 测试任务运行python代码 Python 单元测试,我在 build.sbt 中执行了此操作:

//define task that should be run with tests.
val testPythonTask = TaskKey[Unit]("testPython", "Run python tests.")

val command = "python3 -m unittest app_test.py"
val workingDirectory = new File("python/working/directory")

testPythonTask := {
  val s: TaskStreams = streams.value
  s.log.info("Executing task testPython")
  Process(command,
    // optional
    workingDirectory,
    // optional system variables
    "CLASSPATH" -> "path/to.jar",
    "OTHER_SYS_VAR" -> "other_value") ! s.log
}

//attach custom test task to default test tasks
test in Test := {
  testPythonTask.value
  (test in Test).value
}

testOnly in Test := {
  testPythonTask.value
  (testOnly in Test).value
}

答案 2 :(得分:1)

您可以创建一个拉链源文件的python任务。此示例取决于装配任务:

  lazy val pythonAssembly = TaskKey[Unit]("pythonAssembly", "Zips all files in src/main/python")

  lazy val pythonAssemblyTask = pythonAssembly := {
    val baseDir = sourceDirectory.value
    val targetDir = assembly.value.getParentFile.getParent
    val target = new File(targetDir + s"/python/rfu-api-client-python-${Commons.appVersion}.zip")
    val pythonBaseDir = new File(baseDir + "/main/python")
    val pythonFiles = Path.allSubpaths(pythonBaseDir)

    println("Zipping files in " + pythonBaseDir)
    pythonFiles foreach { case (_, s) => println(s) }
    IO.zip(pythonFiles, target)
    println(s"Created $target")