2011-09-13 24 views
5

Tôi muốn xác định một tác vụ, yêu cầu các nhiệm vụ biên dịch và đóng gói, sau đó thực hiện các công việc của nó. Làm thế nào để làm điều đó? Hiện tại, điều này chỉ thực hiện phần thứ hai và bỏ qua khi biên dịch & các tác vụ của packageBin.Làm cách nào để phụ thuộc vào các tác vụ khác và thực hiện mã của bạn trong SBT 0.10?

lazy val dist = TaskKey[Unit](
    "dist", "Creates a project distribution in dist/ folder." 
) 
def distTask = { 
    dist <<= dist.dependsOn(compile, packageBin) 
    dist <<= (update, crossTarget).map { case (updateReport, out) => 
    updateReport.allFiles.foreach { srcPath => 
     val destPath = out/"lib"/srcPath.getName 
     IO.copyFile(srcPath, destPath, preserveLastModified=true) 
    } 
    } 
} 
+0

Cho đến nay, tôi đã có thể sử dụng ~; biên dịch; gói; công việc phân phối – arturaz

Trả lời

3

<<= là phương pháp trên TaskKey trả về giá trị. Nó không cập nhật trạng thái có thể thay đổi bất cứ nơi nào, vì vậy trong mã ví dụ, kết quả của cuộc gọi đầu tiên sẽ bị hủy bỏ. Để khắc phục điều này, hãy khai báo packageBin làm đầu vào, nhưng bỏ qua giá trị kết quả. Lưu ý rằng packageBin phụ thuộc vào biên dịch, do đó, tùy thuộc vào biên dịch là không cần thiết.

dist <<= (update, crossTarget, packageBin in Compile) map { (updateReport, out, _) => 

Nó không chắc rằng bạn muốn sao chép tất cả các tập tin trong một UpdateReport vào một thư mục chỉ dựa vào tên của tập tin. Có thể cho các phụ thuộc khác nhau có cùng tên tệp. Ngoài ra, điều này sẽ bao gồm các phụ thuộc từ tất cả các cấu hình, bao gồm các phụ thuộc kiểm tra.

Đối với vấn đề đầu tiên, hãy sử dụng liên kết ModuleID để tạo đường dẫn trong thư mục đích, như được thực hiện trong thư mục lib_managed khi retrieveManaged := true. Đối với vấn đề thứ hai, chỉ chọn các tệp cho cấu hình bạn muốn.

updateReport.matching(configurationFilter(Runtime.name)).foreach... 

Xem các tài liệu sbt.UpdateReportsbt.RichUpdateReport API cho các phương pháp hữu ích khác.

Nếu bạn không lo ngại về xung đột tên tệp, bạn có thể nhận tệp phụ thuộc từ dependencyClasspath. Ví dụ:

dist <<= (crossTarget, packageBin in Compile, dependencyClasspath in Runtime) map { (out, _, cp) => 

và nhận Seq[File] từ cp.files.

+0

Cảm ơn câu trả lời tuyệt vời. Tuy nhiên khi tôi cố gắng thêm packageBin như phụ thuộc, tôi nhận được điều này: [lỗi] sbt.Init $ Uninitialized: Tham chiếu đến cài đặt uninitialized {tệp:/home/arturas/work/spacegame/máy chủ/nhà cung cấp/SpaceMule /} SpaceMule/*: gói từ {tệp:/home/arturas/work/spacegame/máy chủ/nhà cung cấp/SpaceMule /} SpaceMule/*: dist [lỗi] Sử dụng 'last' cho toàn bộ nhật ký. – arturaz

+0

Bạn có bao gồm phần 'trong biên dịch' không? –

+1

Ồ, tôi phải bỏ lỡ nó. Nó hoạt động ngay bây giờ, cảm ơn :) – arturaz

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