2013-06-11 40 views
14

tôi có thể tự động thực thi một nhiệm vụ trước khi biên dịch với:SBT áp dụng công tác sau khi Compile

compile in Compile <<= (compile in Compile).dependsOn(myTask) 

Làm thế nào để làm điều tương tự nhưng sau biên dịch?

Tôi biết tôi có thể làm:

compile in Compile <<= (compile in Compile) map{x=> 
    // post-compile work 
    doFoo() 
    x 
} 

để thực thi mã Scala tùy ý, nhưng tôi cần phải tự động thực hiện các nhiệm vụ mục tiêu riêng của mình khi một sự kiện biên dịch xảy ra

Làm cái gì đó như:

val foo = TaskKey[Unit]("foo", "...") 
val fooTask = foo <<= scalaInstance map {si => 
... 
} dependsOn(compile in Compile) 

hoạt động nếu tôi nhập lời nhắc "foo" từ sbt>; nghĩa là tác vụ được thực hiện sau khi biên dịch, nhưng mục đích là để móc vào nhiệm vụ biên dịch, vì vậy bất cứ khi nào một trình biên dịch xảy ra, nhiệm vụ foo được tự động gọi sau khi biên dịch hoàn thành.

Điều này có thể, hoặc tôi đang đi về những điều sai cách để móc vào công việc biên dịch được xây dựng trong?

+0

Bạn có thể giải thích trường hợp sử dụng không? –

+0

@MarkHarrah, Chơi có giới hạn nơi định tuyến ngược javascript cho các dự án phụ chỉ có thể được tạo khi chạy. Tôi cần các tuyến được tạo ra dưới dạng một tệp tĩnh tại thời gian biên dịch, mà tôi đã hoàn thành, ngoại trừ việc gắn vào nhiệm vụ như một thao tác sau khi biên dịch (tức là trước tiên tôi cần biên dịch ứng dụng, nếu không các tuyến mới sẽ không được tính cho trong công việc tạo luồng). – virtualeyes

+0

Những tệp này đang được tạo ra có được xem là tài nguyên không? –

Trả lời

13

Nói chung, có một số tác vụ phụ thuộc vào nhiệm vụ của bạn.

Nếu compile đang được sử dụng để "biên dịch và thiết lập mọi thứ cho Grunt", sau đó tạo một tác vụ prepareGrunt phụ thuộc vào compilemyTask và chạy thay thế.

Nếu myTask nên chạy trước khi các lớp và tài nguyên của dự án được sử dụng bởi cái gì khác, sau đó biến nó thành phụ thuộc của exportedProducts. Các tác vụ như runtest và các tác vụ trong các dự án phụ thuộc sẽ nhận được các mục nhập classpath đã xuất từ ​​nhiệm vụ đó.

Sự nguy hiểm trong "chạy đôi khi sau khi biên dịch" là myTask sẽ không chạy trước nhiệm vụ thực sự cần đến. Có phương pháp triggeredBy trên Initialize[Task[T]], nhưng nó dễ bị lạm dụng và chỉ nên được sử dụng khi đầu ra của tác vụ được biết là chỉ được sử dụng sau khi tất cả các tác vụ được thực thi.

+3

+1 cảm ơn Mark, bạn đang làm công việc đáng kinh ngạc với SBT, giữ nó lên (đừng quên ngủ mặc dù ;-)) – virtualeyes