Haskell xây dựng và tạo môi trường tương tự như Maven


20

Tôi đã từng là một nhà phát triển Java trong một thời gian dài, nhưng gần đây, tôi đã tham gia một nhóm Haskell. Trong thế giới java, nếu bạn có một dự án lớn, với một vài nhóm làm việc với nó, một cách tiếp cận phổ biến là sử dụng một máy chủ tạo tác như Maven để dễ dàng và tăng tốc độ phát triển. Nhiều công cụ xây dựng, chẳng hạn như Ant, Maven, Gradle, có thể xây dựng dự án và tải một tệp jar lên máy chủ tạo tác có thể được sử dụng bởi phần còn lại của nhóm mà không bị đau. Do đó, bằng cách chia dự án thành các tiểu dự án nhỏ hơn, thời gian xây dựng cũng giảm đáng kể.

Về phía Haskell, chúng tôi đang sử dụng cabalđể xây dựng dự án. Dự án của chúng tôi mất khoảng 10-15 phút để xây dựng mà không cần tối ưu hóa. Phải mất vài giờ nếu bật tối ưu hóa trình biên dịch, điều này thật đau đớn.

Tôi tự hỏi, làm thế nào chúng ta có thể làm điều tương tự như chúng ta làm trong Java ở đây. Có cách nào dễ dàng để biên dịch và tải lên tệp nhị phân của các gói (thư viện) đến một máy chủ tạo tác và sử dụng các nhị phân dựng sẵn tại thời điểm xây dựng không? Tôi biết rằng vì Haskell tạo mã máy (chứ không phải mã byte trong Java) có thể có các vấn đề tương thích, nhưng chúng tôi có thể có các nhị phân khác nhau cho các kiến ​​trúc / HĐH khác nhau được lưu trữ trên máy chủ tạo tác.


Không phải là một câu trả lời cho câu hỏi của bạn, nhưng bạn có gọi "cabal build / install" với tùy chọn -j không?
Daniel Díaz Car rời

Có, nhưng tôi không thấy tăng tốc nhiều. Sử dụng CPU là khoảng 15% -20% khi xây dựng. Tôi không chắc chắn nơi mà vấn đề là: cabal, GHC, Test.Frameworkhoặc các mối liên kết.
Oxy

Theo câu trả lời SO stackoverflow.com/questions/27173910/ này , lý do chính là bản chất tự nhiên của các tệp thực thi Haskell.
Daniel Díaz Carret 6/03/2015

Tôi chủ yếu nói về sự phát triển. Đúng là nhị phân có thể gây ra sự không tương thích do các hệ điều hành khác nhau, kiến ​​trúc CPU và thậm chí các phiên bản trình biên dịch. Nhưng, tại sao tôi phải lãng phí quá nhiều thời gian khi tôi đang phát triển trên cùng một máy, cùng một hệ điều hành và cùng một trình biên dịch mỗi ngày?
Oxy

Có vẻ như Halcyon với bộ đệm có thể hữu ích: halcyon.sh/reference/#private-st Storage
Lubomír Sedlář

Câu trả lời:


2

Bạn có thể cân nhắc sử dụng Nix , một trình quản lý gói đa nền tảng, đa mục đích với sự hỗ trợ tốt cho Haskell.

Nix có một ngôn ngữ lập trình tùy chỉnh để xác định các gói (điều này thực sự là thuần túy, chức năng và lười biếng). Xác định các gói mới và mở rộng các gói hiện có là khá dễ dàng (ví dụ: để thay đổi các phụ thuộc, lấy nguồn từ một repo git khác, v.v.).

Các gói được xác định bằng băm, bao gồm các phụ thuộc. Do đó, nhiều phiên bản, hoặc cùng một phiên bản với các phụ thuộc khác nhau, có thể sống cạnh nhau mà không có xung đột. Nix có thể tra cứu hàm băm mong muốn trên máy chủ "bộ đệm nhị phân", để xem liệu gói cụ thể đó với các phụ thuộc cụ thể đó đã được xây dựng chưa; nếu vậy, nó sẽ tải xuống sản phẩm xây dựng thay vì biên dịch.

Hiện tại, kho lưu trữ nixpkgs bao gồm hầu hết / tất cả các bản Hackage, một số phiên bản GHC (7.10.1, 7.8.4 và một số phụ trợ JS) và một cabal2nixtiện ích thực hiện khá tốt việc tạo các gói Nix từ các tệp .cabal. Ngoài ra còn có máy chủ CI "hydra" dựa trên Nix, mà bạn có thể sử dụng để kích hoạt các bản dựng dựa trên các cam kết SCM.

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.