2014-08-31 16 views
8

Tôi đã gặp một vài trường hợp liên quan đến SBT khiến tôi bối rối. Có cách nào để nói với SBT bỏ qua một dự án phụ hoàn toàn cho các phiên bản scala nhất định khi bạn đang biên dịch chéo?Làm thế nào để có SBT bỏ qua biên dịch chéo cho một tiểu dự án nhất định?

Dưới đây là hai ví dụ mà điều này sẽ hữu ích.

1) Bản dựng với ba dự án A, B và C. Cả A và B đều là dự án scala và có 'scalaVersions ++ = Seq ("2.11.2", "2.10.4") trong cài đặt của chúng . Project C là một tạo phẩm Java thuần túy, và do đó tôi đã loại trừ các thư viện Scala khỏi các phụ thuộc của nó. Tôi muốn A và B phụ thuộc vào C, nhưng lý tưởng là tôi chỉ muốn xây dựng C một lần thôi. Nếu tôi sử dụng hành vi mặc định và làm "+ xuất bản" từ dự án tập hợp gốc, tôi nhận được hai bản sao của C-1.0.0.jar được tạo và SBT cố gắng xuất bản hai lần, điều này tất nhiên là không có kho lưu trữ maven.

2) Bản dựng với nhiều dự án scala, nhưng một dự án chỉ nên xây dựng dựa trên một phiên bản Scala duy nhất. Tôi đã thử xác định 'scalaVersions' trong cài đặt cho dự án này để chỉ giữ một phiên bản mà các dự án khác có hai, nhưng lại "xuất bản" từ trình tổng hợp gốc dường như bỏ qua điều này và vẫn biên dịch hai lần, lần thứ hai không thành công vì phụ thuộc của nó không có sẵn cho phiên bản Scala đó. Dự án này là một nút lá trong biểu đồ phụ thuộc, do đó, nó là một điều hoàn toàn tốt đẹp để muốn làm một cách hợp lý. Đối với trường hợp # 2, tôi đã nghĩ đến việc thiết lập các thư mục nguồn cho phiên bản scala 'xấu' thành/dev/null hoặc một cái gì đó tương tự, nhưng điều đó vẫn thực sự chạy và tạo ra một tạo phẩm rỗng. Tôi biết tôi có thể có thể đi vào và tìm thấy tất cả các phím có liên quan và làm điều gì đó như

publishArtifact := if(scalaBinaryVersion.value == "2.10") false else publishArtifact.value 

và sau đó săn lùng tất cả các cài đặt liên quan khác/nhiệm vụ (biên dịch, biên dịch trong thử nghiệm, thử nghiệm trong thử nghiệm, packageBin, vv) nhưng điều đó có vẻ khá hack-ish. Có cài đặt 'bỏ qua' ở đâu đó không?

Trả lời

4

Tôi đã viết sbt-doge để giải quyết tập hợp tác vụ trên các tiểu dự án tôn trọng crossScalaVersions của họ. Đối với các dự án Java, bạn có thể cần một mục nhập giả mạo crossScalaVersion.

+0

Điều này có vẻ cực kỳ hữu ích, nhưng tôi thẳng thắn nói thêm rằng "thử nghiệm quá nhiều" và như vậy đối với bản dựng của tôi: -/ –

+0

Và tôi đã bỏ lỡ "thay thế" hợp lý trong 0.1.4. Xin lỗi, thưa ngài! Công việc này như một cái duyên vậy! –

+0

@Tomer kiểm tra và "thay thế hợp lý" nào bạn đang đề cập đến? – matanster

1

Plugin sbt-doge có thể được sử dụng để chỉ định cài đặt crossScalaVersion trong mỗi tiểu dự án.

Trước tiên, hãy thêm dòng addSbtPlugin("com.eed3si9n" % "sbt-doge" % "0.1.5") vào projects/plugins.sbt của bạn.

Để tránh cú pháp doge vô lý ("biên dịch như vậy", thực sự?), Bạn cần phải enablePlugins(CrossPerProjectPlugin) trong dự án gốc của bạn. Với điều này, bạn có thể thêm một dấu cộng trước các lệnh sbt của bạn, và chúng sẽ tôn vinh các thiết lập cross build. Giống như thế này: + compile.

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