2013-03-04 22 views
5

Tôi có một tập lệnh Bash ngắn để tìm và thay thế các nhận xét Scaladoc của tôi để tạo ra các liên kết đến tài liệu bên ngoài của thư viện của bên thứ ba. Tôi muốn tập lệnh này chạy mỗi khi tôi tạo Scaladocs bằng cách sử dụng tác vụ doc.Làm thế nào để chạy tập lệnh bash sau khi tạo scaladoc bằng cách sử dụng tác vụ doc?

Tôi làm cách nào để đạt được điều này?

Trả lời

5

Nó thực sự khá dễ dàng. Trước tiên, tôi kiểm tra doc để xem nó là cái gì (inspect doc trên dấu nhắc SBT), nhận thấy đó là một nhiệm vụ, và tiến hành với tuyên bố một sự phụ thuộc vào bản thân trên build.sbt:

doc in Compile <<= doc in Compile map { (file) => 
    Seq("bash", "-c", "ls >tmp.log").! // CWD is sbt's current dir 
    file 
} 

điều đó tôi sử dụng để thực hiện bash là cùng một thư viện với tên scala.sys.process, vì vậy bạn có thể tra cứu Scaladoc for that. Điều này đã được thử nghiệm trên SBT 0.12.2, và tôi nghĩ rằng có thể có một sự khác biệt nhỏ trên SBT 0.11.x hoặc 0.10.x.

1

Trong SBT 0.13 và các phiên bản mới nhất của trường hợp sử dụng cũng có thể đạt được với :=.value macro (đó đều nhằm mục đích là đơn giản hơn <<=):

doc in Compile := { 
    val f = (doc in Compile).value 
    // execute a shell script if you want with sbt's Process API 
    // http://www.scala-sbt.org/0.13/docs/Process.html 
    val ec = (baseDirectory.value/"myBashScript.sh").getAbsolutePath ! 
    val log = streams.value.log 
    log.debug(s"Exit code: $ec") 
    f 
} 

Bạn cũng có thể như triggeredBy phương pháp cho các nhiệm vụ như sau:

lazy val runMyBashScriptTask = taskKey[Unit]("Run myBashScript") 

runMyBashScriptTask := { 
    val ec = (baseDirectory.value/"myBashScript.sh").getAbsolutePath ! 
    val log = streams.value.log 
    log.debug(s"Exit code: $ec") 
} 

runMyBashScriptTask <<= runMyBashScriptTask triggeredBy (doc in Compile) 

Nó giả định rằng myBashScript.sh là trong thư mục chính của dự án như đã được chỉ bởi baseDirectory thiết lập.

Các vấn đề liên quan