2015-05-13 21 views
6

Trong một dự án hiện tại, tôi đã xây dựng mã Python để tương tác với một nguồn dữ liệu cụ thể; bây giờ, tôi đang làm việc để xây dựng một phiên bản Scala.Sử dụng SBT để quản lý các dự án có chứa cả Scala và Python

Tôi đã sắp xếp lại mọi thứ để tất cả mã Python tồn tại trong src/main/python trong dự án SBT cho mã Scala của tôi, nhưng điều này khiến tôi suy nghĩ: Có cách nào tốt đẹp để tích hợp quản lý dự án giữa hai không? Để thiết lập SBT để tôi có thể chạy thế hệ cài đặt/sdist của Python distutils hoặc tạo tài liệu nhân sư làm nhiệm vụ SBT?

Hoặc, nói chung: Có phương pháp chuẩn nào để chạy nhiệm vụ hệ thống tùy ý bằng cách SBT không?

Trả lời

1

Từ các tài liệu (http://www.scala-sbt.org/0.13/docs/Process.html):

SBT bao gồm một thư viện quá trình để đơn giản hóa quá trình làm việc với bên ngoài. Thư viện có sẵn mà không cần nhập trong các định nghĩa xây dựng và tại trình thông dịch được bắt đầu bởi tác vụ consoleProject.

Để chạy một lệnh bên ngoài, hãy làm theo nó với một dấu chấm than:

"find project -name *.jar" ! 
0

Bạn có thể tạo một nhiệm vụ python mà kéo khóa các tập tin nguồn. Ví dụ này phụ thuộc vào các nhiệm vụ lắp ráp:

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") 
1

Để chạy Python kiểm tra đơn vị mã python với SBT nhiệm vụ kiểm tra tôi đã làm điều này trong 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 
} 
Các vấn đề liên quan