Pro dan kontra menggunakan sbt vs maven dalam proyek Scala [ditutup]

140

Alat build mana yang terbaik untuk Scala? Apa pro dan kontra dari masing-masingnya? Bagaimana cara menentukan yang mana yang akan digunakan dalam sebuah proyek?

Konstantin Solomatov
sumber
5
Saya beralih dari Maven ke Gradle untuk proyek Scala, karena dukungannya yang superior untuk build multi-modul. Pengalaman Twitter dengan SBT digambarkan oleh mereka sebagai "rasa sakit yang membutakan" dan mereka mencoba menjauh darinya (dengan Maven sebagai stop-gap dalam proses itu).
Ben Manes
26
Pertanyaan tertutup keren lainnya ...
Cedric H.
15
Begitu banyak pertanyaan bagus yang saya lihat baru saja ditutup; Saya tidak tahu siapa yang memberikan kekuasaan kepada orang-orang ini untuk memutuskan secara sewenang-wenang untuk menutup pertanyaan atau tidak. Saya bahkan tidak memperhatikan apakah mereka dekat atau tidak lagi.
pengguna1888243
2
Setuju. Untungnya kami punya 2 jawaban sebelum pertanyaan ini ditutup. Miskin bagi mereka yang memilih untuk menutup pertanyaan ini ...
HQt

Jawaban:

84

Kami menggunakan Maven untuk membangun proyek Scala di tempat kerja karena terintegrasi dengan baik dengan server CI kami. Kami hanya dapat menjalankan skrip shell untuk memulai pembuatan, tentu saja, tetapi kami memiliki banyak informasi lain yang keluar dari Maven yang ingin kami masukkan ke CI. Itulah satu-satunya alasan yang dapat saya pikirkan untuk menggunakan Maven untuk proyek Scala.

Jika tidak, gunakan saja SBT. Anda mendapatkan akses ke dependensi yang sama (benar-benar bagian terbaik tentang maven, IMHO). Anda juga mendapatkan kompilasi inkremental, yang sangat besar. Kemampuan untuk memulai shell di dalam proyek Anda, yang juga bagus.

ScalaMock hanya bekerja dengan SBT, dan Anda mungkin ingin menggunakannya daripada perpustakaan tiruan Java. Selain itu, jauh lebih mudah untuk memperpanjang SBT karena Anda dapat menulis kode skala penuh di file build, jadi Anda tidak perlu melalui semua kesulitan dalam menulis Mojo.

Singkatnya, cukup gunakan SBT kecuali Anda benar-benar membutuhkan integrasi yang erat ke server CI Anda.

mblinn.dll
sumber
21
Saya tidak setuju dengan hal-hal di atas, tetapi hanya ingin menunjukkan bahwa saya sedang dalam proses menulis ScalaMock 3 , salah satu tujuan utamanya adalah untuk membuat mendukung sistem build lain lebih mudah.
Paul Butcher
1
Hanya untuk kelengkapan, perlu disebutkan bahwa ScalaMock 2 berfungsi dengan baik dengan sistem build apa pun (ini hanya toples) selama Anda tidak perlu menggunakan tiruan yang dihasilkan (yaitu selama Anda hanya perlu meniru sifat / antarmuka ).
Paul Butcher
3
mengapa mereka tidak menulis kompilasi tambahan untuk maven? IMHO, sbt adalah contoh utama dari sindrom NIH yang tidak diobati ...
Cpt. Senkfuss
1
Mengapa masalah dengan CI karena SBT?
Daniel
21

Pertanyaannya adalah bahaya hanya menghasilkan banyak opini; akan lebih baik untuk memiliki daftar persyaratan yang jelas atau deskripsi tentang lingkungan Anda, pengetahuan sebelumnya, dll.

FWIW, ada lebih banyak pendapat di utas milis scala ini .

2c saya adalah: Gunakan sbt jika Anda tidak memiliki persyaratan khusus

  • untuk proyek sederhana, ini sangat mudah (Anda bahkan tidak memerlukan file build sampai Anda memiliki dependensi)
  • ini biasanya digunakan di seluruh proyek open source Scala. Anda dapat dengan mudah mempelajari tentang konfigurasi dengan mengintip proyek orang lain. Ditambah banyak proyek menganggap Anda menggunakan sbt dan memberi Anda instruksi salin + tempel siap pakai untuk menambahkannya sebagai dependensi ke proyek Anda.
  • jika Anda menggunakan IntelliJ IDEA, ini dapat diintegrasikan sepenuhnya. Anda dapat meminta IDEA menggunakan sbt untuk terus mengompilasi proyek Anda, dan sebaliknya Anda dapat menggunakan sbt untuk membuat proyek IDEA dengan cepat . Yang terakhir sangat berguna jika Anda berada dalam siklus 'snapshot' dengan bergantung pada library Anda sendiri yang diubah dari versi minor ke versi minor - cukup tutup proyek, perbarui versi dalam file build, jalankan ulang gen-ideatugas, dan buka kembali proyek: pembaruan selesai.
  • datang siap dengan tugas yang paling Anda akan perlu ( compile, test, run, doc, publish-local, console) - yang consolemerupakan salah satu fitur terbaik.
  • beberapa orang menyoroti fitur yang dependensi dapat menjadi repositori sumber yang langsung diambil dari GitHub. Saya belum pernah menggunakan ini jadi tidak bisa berkomentar di sini.

Beberapa orang membenci sbt karena menggunakan Ivy untuk manajemen ketergantungan (saya tidak dapat mengomentari pro dan kontra, tetapi sebagian besar waktu itu bukan masalah), beberapa orang membenci sbt karena Anda menentukan file build dalam hal a Scala DSL, bukan XML. Beberapa orang kecewa karena format sbt berubah dari v0.7 menjadi v0.10, tetapi jelas, migrasi tidak akan memengaruhi Anda jika Anda memulai dari awal.

0__
sumber
28
Saya benci sbt karena penyalahgunaan operator simbolik dan beberapa keputusan bodoh, seperti mendukung format definisi .sbt dan .scala tetapi meletakkannya di lokasi yang berbeda, dan pernyataan dalam .sbt harus dipisahkan oleh setidaknya baris kosong, dll. Dokumen sbt membaik tetapi tidak cukup baik saat ini. Yang paling saya rindukan adalah beberapa file contoh lengkap (minimal hingga dunia nyata) .sbt / .scala dijelaskan baris demi baris, yang mencakup semua fitur sbt. Konon, saya menggunakan sbt setiap hari karena Maven lebih menyebalkan.
xiefei
6
Sayangnya pertanyaan ini ditutup, saya yakin ada perbedaan faktual juga: misalnya kutipan dari buku Manning tentang SBT ini: "Jika ada ketergantungan antara tujuan Maven (katakanlah satu tujuan menghasilkan file yang dikonsumsi oleh yang lain) maka Anda tidak dapat memparalelkan build Anda dengan Maven. Dengan sbt, Anda harus menentukan ketergantungan eksplisit antar tugas. Hal ini memungkinkan sbt untuk menjalankan tugas secara paralel DENGAN DEFAULT. Jika tugas A bergantung pada B, dan C juga bergantung pada B, maka sbt menjalankan tugas B dan kemudian menjalankan A dan C secara paralel. " Semoga komentar ini membantu beberapa pembaca.
jhegedus
20
Saya menemukan utas ini sangat berguna. Saya sangat sering berpikir bahwa moderator Stackoverflow menutup utas terlalu bersemangat. Siapa yang peduli jika mereka "keluar dari topik" ketika mereka sering kali persis seperti yang dicari pengguna (dan menemukannya melalui pencarian web). Seolah-olah mod Stackoverflow mencoba membuat ulang xkcd 979 dengan sengaja .
Ville
3
@Ville Pikiranku juga. Merendahkan, mengedit, dan menutup menjadi terlalu agresif.
ankush981
2
Untuk siapapun yang melihat ini sekarang, keluhan @xiefei telah ditangani. SBT telah menghapus lebih banyak operator / sintaks khusus, dan pernyataan dalam file / sbt tidak lagi memerlukan pemisahan spasi.
Grogs