so sánh sbt và Gradle [đã đóng]


110

Tôi đang đi sâu vào Scala và nhận thấy sbt. Tôi khá hài lòng với Gradle trong các dự án java / groovy và tôi biết có một plugin scala cho Gradle.

Điều gì có thể là lý do chính đáng để ủng hộ sbt hơn Gradle trong một dự án Scala?


SBT theo một nghĩa nào đó giống như một Vim: nếu bạn tìm hiểu nó, bạn sẽ hài lòng. Và nhân tiện, cũng có maven và lein (được tạo ra để làm áo choàng, nhưng cũng hoạt động với bỏng nước).
om-nom-nom

18
Đừng cảm thấy áp lực khi chuyển sang SBT. Một số thành viên nổi tiếng của cộng đồng Scala sử dụng Gradle. Thay vào đó, hãy sử dụng SBT làm thử nghiệm, biết rằng bạn chỉ có thể sử dụng Gradle thay thế.
Daniel C. Sobral

6
cảm ơn tất cả ... Sau khi đọc những hiểu biết của bạn, tôi sẽ gắn bó với Gradle. Đối với tôi, dường như đó là nơi mà hầu hết các nỗ lực xây dựng công cụ cho không gian JVM sẽ diễn ra khi chúng tôi để Maven ở lại.
Hans Westerbeek

10
Thật khó chịu khi câu hỏi này được đánh dấu là 'dựa trên ý kiến' ở đây, có thể là bởi những người không làm việc trong JVM-space mọi lúc (và do đó thiếu sự giám sát). Các câu trả lời dưới đây là thực tế và không có chủ nghĩa thánh chiến.
Hans Westerbeek

4
Không, những câu trả lời đó chủ yếu là tuyên bố về các sự kiện có thể kiểm tra được, không phải ý kiến. Mặc dù câu hỏi này có thể thu hút những câu trả lời vô ích, nhưng trên thực tế, nó đã không làm được như vậy. Nó sẽ vẫn mở như một mô tả hữu ích về sự khác biệt thực tế giữa các công cụ.
erickson

Câu trả lời:


61

Lưu ý rằng một điểm khác biệt chính giữa SBT và Gradle là quản lý phụ thuộc của nó :

  • SBT : Ivy , với một bản sửa đổi có thể được cung cấp dưới dạng bản sửa đổi (1.5.2, chẳng hạn) hoặc mới nhất (hoặc động).
    Xem " Ivy Dependency "
    Điều đó có nghĩa là hỗ trợ cơ chế "-SNAPSHOT" có thể có vấn đề, mặc dù Mark Harrah đã nêu chi tiết trong chủ đề này :

Đúng là bộ nhớ cache có thể bị nhầm lẫn, nhưng không đúng là Ivy không hiểu cách giải quyết các ảnh chụp nhanh. Eugene giải thích điểm này trong một chủ đề khác, có lẽ trong danh sách quản trị viên. Có một vấn đề với tự động cập nhật của sbt đã được giải quyết trong 0.12.

Những gì Ivy không hỗ trợ, theo như tôi biết, là xuất bản ảnh chụp nhanh theo cách Maven làm. Tôi tin rằng tôi đã nói điều này ở nơi khác, nhưng nếu bất kỳ ai muốn cải thiện tình hình, ý kiến ​​của tôi là tốt nhất nên dành nỗ lực làm việc với nhóm Gradle để sử dụng lại mã quản lý phụ thuộc của họ.

Xin cho bạn biết, các vấn đề với sự phụ thuộc vào ảnh chụp nhanh Ivy và Maven là một trong những lý do tại sao Gradle cuối cùng đã thay thế Ivy bằng mã quản lý phụ thuộc của riêng mình. Đó là một nhiệm vụ lớn, nhưng đã mang lại cho chúng tôi rất nhiều điều tốt đẹp.

Dòng tweet này đề cập rằng mọi tình huống có thể phát triển trong tương lai:

Trước đây Mark từng nói rằng anh ấy quan tâm đến việc sử dụng Gradle thay vì Ivy cho SBT.

(cả hai công cụ có thể học hỏi lẫn nhau )


1
Điều bất tiện nhất mà tôi từng gặp là sbt là bạn không thể chỉ định quy tắc không biên dịch lại mỗi khi nó được đề cập. Các quy tắc tích hợp cho java và scala có chức năng này nhưng nó không được sử dụng để viết các quy tắc tùy chỉnh. Vì vậy, mỗi khi bạn tạo tệp chương trình hoặc tài liệu và ngay cả khi bạn tạo tệp jar, nhiệm vụ của bạn sẽ được thực hiện trên mỗi cuộc gọi bất kể mọi thay đổi đối với nguồn đã thực sự được thực hiện. Thậm chí làm là đủ thông minh, nhưng không SBT
ayvango

1
@ayvango Nó không phải là trường hợp của sbt ngày nay. Có rất nhiều plugin đó sử dụng chức năng này, giống như android-sdk-plugin
dant3

Bạn có biết API nào được sử dụng cho chức năng đó không?
ayvango

vì vậy đây là một cái gì đó ivy bị thiếu khi so sánh với cả maven & gradle? Điều đó thật kỳ lạ
tribbloid

53

Đối với tôi, các tính năng chính của SBT là:

  • Biên dịch nhanh (nhanh hơn fsc).
  • Biên dịch / kiểm tra liên tục: lệnh ~testsẽ biên dịch lại và kiểm tra dự án của bạn mỗi khi bạn lưu sửa đổi.
  • Tổng hợp chéo và xuất bản chéo, trên một số phiên bản scala.
  • Tự động truy xuất các phần phụ thuộc với khả năng tương thích đúng với phiên bản scala.

Nhược điểm là:

  • Cú pháp chữ tượng hình có xu hướng không khuyến khích người dùng mới (đặc biệt nếu họ đến từ Java)
  • Không có cách nào dễ dàng để xác định một "nhiệm vụ": nếu bạn cần một quy trình xây dựng đặc biệt, bạn sẽ cần phải tìm một plugin hoặc tự viết một plugin.

Tôi có chính xác rằng có / cần thiết phải có tính năng biên dịch / xuất bản chéo do các vấn đề mà Scala gặp phải với sự không tương thích ngược nhị phân không?
Hans Westerbeek

1
Đúng. Và những vấn đề này có thể xảy ra một lần nữa khi chuyển sang Scala 2.10.
paradigmatic

1
Có hai điểm khác biệt nữa mà tôi muốn bổ sung: * Trong SBT, việc tự quản lý các phụ thuộc dễ dàng hơn, IMO. * Người chạy bài thi SBT có vẻ nhanh hơn; Tôi nghi ngờ có một số đồng thời xảo quyệt liên quan ở đây nhưng tôi đoán. SBT có vẻ như là một sản phẩm có khả năng hơn nhưng kém trưởng thành hơn.
Rick-777

25
+1 cho nhược điểm 'cú pháp chữ tượng hình'. Đó là mối quan tâm lớn nhất của tôi với SBT. Khai thác quá tải luôn luôn dẫn đến lạm dụng: - /
Ron Dahlgren

7
Cú pháp SBT khó hiểu mang lại điều tồi tệ nhất trong scala. Gradle dựa trên mô hình miền và cú pháp chuyển tiếp thẳng.
nemoo

40

sbt là một Scala DSL và đối với nó thì Scala là công dân hạng nhất, vì vậy về mặt cơ bản, nó có vẻ là phù hợp.

Nhưng sbt gặp phải những thay đổi lớn không tương thích giữa các phiên bản, điều này khiến cho việc tìm kiếm plugin hoạt động chính xác cho một tác vụ và nó hoạt động trở nên khó khăn.

Cá nhân tôi đã từ bỏ sbt, vì nó gây ra nhiều vấn đề hơn là nó giải quyết được. Tôi thực sự đã chuyển sang gradle.

Đi tìm hình.


2
Như xa, như tôi biết, chỉ có một sự thay đổi rất lớn: khi SBT chuyển từ 0.7.x đến 0.1.x
om-nôm-nom

1
Nếu bạn sử dụng plugin cho sbt 0.11.2 và sau đó chuyển đến sbt 0.12, bạn cần đợi tác giả plugin biên dịch phiên bản mới hoặc tự thực hiện. idea-sbt là một ví dụ.
fmpwizard

4
@fmpwizard Dòng sbt 0.12 vẫn chưa được bán lại ... Ngừng phát tán FUD.
paradigmatic

3
Nó không phải là sbt là không thể sử dụng, nhóm của chúng tôi sử dụng nó. Nhưng nhận xét của tôi là đưa ra câu trả lời này, có nội dung "... Nhưng sbt gặp phải những thay đổi lớn không tương thích giữa các phiên bản, điều này khiến cho việc tìm kiếm plugin hoạt động chính xác cho một tác vụ và nó hoạt động trở nên khó khăn ..." , Tôi không thể chỉ sử dụng plugin scct, tôi đã phải sửa đổi nó (có thay đổi nhỏ, nhưng sau đó tôi phải xuất bản nó ở đâu đó để cả nhóm của tôi có thể truy cập nó) Một nỗi đau không có lý do chính đáng.
fmpwizard

3
Bạn có thể biên dịch chéo cho các phiên bản Scala khác nhau bằng cách sử dụng gradle không?
Machisuji

4

Tôi khá mới với gradle và rất mới với sbt - điều tôi thực sự thích về sbt cho đến nay là bảng điều khiển tương tác. Nó cho phép tôi sử dụng các lệnh như 'kiểm tra' để hiểu rõ hơn về những gì đang xảy ra. AFAIK gradle không cung cấp một cái gì đó như thế này atm.


-11

Sbt và gradle, cả hai đều dựa trên các ngôn ngữ được nhập tĩnh .... nhưng sbt có một số ưu điểm:

  • hỗ trợ plugin tốt hơn, tự động bổ sung đặc biệt
  • tạo nhiệm vụ và quản lý sự phụ thuộc giữa các nhiệm vụ
  • sbt đặc biệt phù hợp với các dự án scala theo nghĩa là nó hỗ trợ các bản dựng tăng dần và hầu hết bản thân sbt được viết bằng scala và các định nghĩa về bản dựng sbt được viết bằng scala
  • sbt có hỗ trợ shell tương tác với nhiều tác vụ tích hợp hữu ích
  • vòng đời mặc định của sbt khá hữu ích và có thể bắt đầu với người mới bắt đầu với khá ít nỗ lực

1
Gradle dựa trên groovy không phải là ngôn ngữ được nhập tĩnh.
Vistritium

Gradle thực hiện quản lý sự phụ thuộc giữa các tác vụ, tạo một tác vụ dễ dàng nhất có thể, tôi không biết làm thế nào để viết một plugin dễ dàng hơn so với gradle có thể sử dụng các plugin groovy, Java, gradle và có thể hơn thế nữa.
Johnride
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.