Maven과 유사한 Haskell 빌드 및 아티팩트 환경


20

예전에는 Java 개발자 였지만 최근에 Haskell 팀에 합류했습니다. 자바 세계에서 여러 팀이 작업하는 대규모 프로젝트가있는 경우 일반적인 접근 방식은 Maven과 같은 아티팩트 서버를 사용하여 개발을 쉽고 빠르게하는 것입니다. Ant, Maven, Gradle과 같은 수많은 빌드 도구는 프로젝트를 빌드하고 jar 파일을 아티팩트 서버에 업로드 할 수 있습니다.이 파일은 팀의 다른 팀이 고통없이 사용할 수 있습니다. 따라서 프로젝트를 더 작은 하위 프로젝트로 분할하면 빌드 시간도 크게 단축됩니다.

Haskell 측에서는 cabal프로젝트를 빌드하는 데 사용 하고 있습니다. 우리 프로젝트는 최적화하지 않고 구축하는 데 약 10-15 분이 걸립니다. 컴파일러 최적화가 켜져 있으면 몇 시간이 걸리며, 이는 고통 스럽습니다.

Java에서와 동일한 방법으로 어떻게 할 수 있을지 궁금합니다. 패키지 (라이브러리)의 바이너리를 아티팩트 서버로 컴파일하고 업로드하고 빌드시 사전 빌드 된 바이너리를 사용하는 쉬운 방법이 있습니까? Haskell이 Java의 바이트 코드가 아닌 머신 코드를 생성하므로 호환성 문제가있을 수 있지만 아티팩트 서버에 저장된 다른 아키텍처 / OS에 대해 다른 바이너리가있을 수 있습니다.


귀하의 질문에 대한 답변은 아니지만 -j 옵션을 사용하여 "cabal build / install"을 호출합니까?
Daniel Díaz Carrete

예,하지만 속도가 크게 향상되지는 않습니다. 빌드시 CPU 사용량은 약 15 % -20 %입니다. 나는 문제가 어디 있는지 확실하지 않다 : cabal, GHC, Test.Framework또는 링커.
Oxy

이 SO 답변 stackoverflow.com/questions/27173910/… 에 따르면 주된 이유는 Haskell 실행 파일의 기본 특성입니다.
Daniel Díaz Carrete

나는 주로 개발에 대해 이야기하고 있습니다. 바이너리는 OS, CPU 아키텍처 및 컴파일러 버전이 다르기 때문에 비 호환성을 유발할 수 있습니다. 그러나 매일 같은 컴퓨터, 동일한 OS 및 동일한 컴파일러에서 개발할 때 왜 많은 시간을 낭비해야합니까?
Oxy

캐시가있는 Halcyon이 유용 할 것 같습니다 : halcyon.sh/reference/#private-storage-options
Lubomír Sedlář

답변:


2

Haskell을 적절히 지원하는 범용 크로스 플랫폼 패키지 관리자 인 Nix 사용을 고려할 수 있습니다 .

Nix에는 패키지를 정의하기위한 사용자 정의 프로그래밍 언어가 있습니다 (순수하고 기능적이며 게으른 것입니다). 새 패키지를 정의하고 기존 패키지를 확장하는 것은 매우 쉽습니다 (예 : 종속성 변경, 다른 자식 리포지토리에서 소스 가져 오기 등).

패키지는 종속성을 포함하는 해시로 식별됩니다. 따라서 여러 버전 또는 종속성이 다른 동일한 버전이 충돌없이 나란히 살 수 있습니다. Nix는 "이진 캐시"서버에서 원하는 해시를 찾아 특정 종속성이있는 특정 패키지가 이미 빌드되어 있는지 확인할 수 있습니다. 그렇다면 컴파일하는 대신 빌드 제품을 다운로드합니다.

현재 nixpkgs 리포지토리에는 대부분 / 모든 Hackage, 여러 GHC 버전 (7.10.1, 7.8.4 및 일부 JS 백엔드) 및 cabal2nix.cabal 파일에서 Nix 패키지를 생성 하는 유틸리티가 포함되어 있습니다. SCM 커밋을 기반으로 빌드를 트리거하는 데 사용할 수있는 Nix 기반 "hydra"CI 서버도 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.