Haskell membangun dan membuat artefak mirip dengan Maven

20

Saya pernah menjadi pengembang Java untuk waktu yang lama, tetapi baru-baru ini, saya bergabung dengan tim Haskell. Di dunia java, jika Anda memiliki proyek besar, dengan beberapa tim mengerjakannya, pendekatan yang umum adalah dengan menggunakan server artefak seperti Maven untuk mempermudah dan mempercepat pengembangan. Banyak alat pembuatan, seperti Ant, Maven, Gradle, dapat membangun proyek dan mengunggah file jar ke server artefak yang dapat digunakan oleh anggota tim lainnya tanpa rasa sakit. Oleh karena itu, dengan memecah proyek menjadi sub-proyek yang lebih kecil, waktu pembangunan juga berkurang secara drastis.

Di sisi Haskell, kami menggunakan cabaluntuk membangun proyek. Proyek kami membutuhkan waktu sekitar 10-15 menit untuk membangun tanpa optimasi. Butuh beberapa jam jika optimisasi kompiler dihidupkan, yang menyakitkan.

Saya bertanya-tanya, bagaimana kita dapat melakukan hal yang sama seperti yang kita lakukan di Jawa di sini. Apakah ada cara mudah untuk mengkompilasi dan mengunggah biner paket (pustaka) ke server artefak dan menggunakan binari prebuilt pada waktu build? Saya tahu bahwa karena Haskell menghasilkan kode mesin (daripada kode byte di Jawa) mungkin ada masalah kompatibilitas, tetapi kita mungkin dapat memiliki binari yang berbeda untuk arsitektur / OS yang berbeda yang disimpan di server artefak.

Oxy
sumber
Bukan jawaban untuk pertanyaan Anda tetapi, apakah Anda memanggil "kompas / komplotan rahasia" dengan opsi -j?
Daniel Díaz Carrete
Ya, tapi saya tidak melihat banyak percepatan. Penggunaan CPU adalah sekitar 15% -20% saat membangun. Saya tidak yakin di mana masalahnya adalah: cabal, GHC, Test.Frameworkatau linker.
Oxy
Menurut jawaban SO ini stackoverflow.com/questions/27173910/... alasan utamanya adalah sifat asli dari executable Haskell.
Daniel Díaz Carrete
Saya kebanyakan berbicara tentang pembangunan. Memang benar bahwa biner dapat menyebabkan ketidakcocokan karena OS yang berbeda, arsitektur CPU dan bahkan versi kompiler. Tetapi, mengapa saya harus membuang banyak waktu ketika saya mengembangkan pada mesin yang sama, OS yang sama dan kompiler yang sama setiap hari?
Oxy
Sepertinya Halcyon dengan cache mungkin berguna: halcyon.sh/reference/#private-storage-options
Lubomír Sedlář

Jawaban:

2

Anda dapat mempertimbangkan untuk menggunakan Nix , yang merupakan manajer paket lintas platform untuk tujuan umum dengan dukungan yang layak untuk Haskell.

Nix memiliki bahasa pemrograman khusus untuk mendefinisikan paket (yang kebetulan murni, fungsional dan malas). Mendefinisikan paket baru dan memperluas yang sudah ada cukup mudah (mis. Untuk mengubah dependensi, dapatkan source dari git repo yang berbeda, dll.).

Paket diidentifikasi oleh hash, yang termasuk dependensi. Karenanya banyak versi, atau versi yang sama dengan dependensi berbeda, dapat hidup berdampingan tanpa konflik. Nix dapat mencari hash yang diinginkan pada server "binary cache", untuk melihat apakah paket tertentu dengan dependensi tertentu telah dibangun; jika demikian, itu akan mengunduh produk build daripada kompilasi.

Saat ini, repositori nixpkgs mencakup sebagian besar / semua Hackage, beberapa versi GHC (7.10.1, 7.8.4 dan beberapa backends JS) dan sebuah cabal2nixutilitas yang melakukan pekerjaan yang cukup baik dalam menghasilkan paket Nix dari file .cabal. Ada juga server CI "hydra" berbasis Nix, yang dapat Anda gunakan untuk memicu build berdasarkan komitmen SCM.

Warbo
sumber