在当前项目中,我构建了用于与特定数据源交互的Python代码;现在,我正在构建一个Scala版本。
我重新安排了一些事情,以便所有Python代码都存放在我的Scala代码的SBT项目中的src/main/python
内,但这让我想到:有没有什么好方法可以在两者之间集成项目管理?设置SBT以便我可以将我的Python distutils
安装/ sdist生成或sphinx文档生成作为SBT任务运行?
或者,更一般地说:是否有通过SBT运行任意系统任务的标准方法?
答案 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")