2011-09-15 2 views
15

저는 패키지의 유지자인 lrucache입니다. 최근 BinaryNFData에 대한 인스턴스 추가 기능 요청이 접수되었습니다. 두 가지 모두 가지고있는 유용한 것들이며, 원칙적으로 그러한 경우에는 아무런 문제가 없습니다.새 패키지 종속성을 추가하는 기능 요청을 처리하는 방법

그러나 둘 다 새로운 패키지 종속성을 도입하고 패키지의 종속성 목록을 가능한 한 최소화하고 싶습니다. 이 문제를 처리 할 정상적인 방법이 있습니까? lrucache의 데이터 구조가 유용한 유형 클래스를 제공하는 20 가지 이상의 패키지가 있으며 구현할 수 있으며 이점을 얻을 수 있습니다.

분명히 모든 항목을 종속 항목으로 추가하는 것이 비 스타터입니다. 그러나 그 밖의 무엇을 할 수 있습니까?

lrucache.cabal에 다양한 인스턴스를 컴파일 할 수있는 플래그를 추가 할 수 있습니다. 의존성 목록을 최소화하려는 측면에서, 원하는 경우를 제외하고는 효과가 있습니다. 하지만 실제 상황에서는 끔찍한데, 왜냐하면 빌드에 의존하는 섹션에서 빌드 플래그를 지정할 수 없기 때문입니다. 따라서 특정 플래그가있는 패키지에 의존 할 수는 있지만 종속성은 지정하지 마십시오. 이것은 곧 거의 쓸모없는 것으로 줄어 듭니다.

고아 인스턴스 패키지를 만들 수 있습니다. 이것은 build-depends 섹션에서 이들 인스턴스에 대한 종속성을 지정할 수있는 이점이 있습니다. 가장 큰 단점은 해킹에 추가 패키지를 추가하는 것입니다. 패키지를 별도의 패키지로 유지해야합니다.

그 밖의 무엇을 할 수 있습니까? 무엇이 옳은 일입니까?

+2

"고아 인스턴스 패키지"접근 방식은 적어도 일반적인 전략 인 것으로 보입니다. 해야 할 일은 아마도 더 나은 의존성 관리를 고안하는 것이지만 ... –

+1

@C. A. McCann, 저는 소프트웨어가'./configure --enable-Z'를 사용할 때 그것을 개인적으로 싫어합니다. 나는 물건을 간단하게하는 것을 좋아한다. - 설치 한 것으로 표시된 패키지는 그것이 설치되어 있음을 의미한다. "옵션 X와 Y가 있지만 Z가 아닌 것은 설치되어 있지 않다". 아마 Hackage가 인스턴스 패키지를 고아로 만들 수는 있지만, 개념이 불법이라고 생각하지는 않습니다. – gatoatigrado

+0

@gatoatigrado : 동의합니다. 그들을 더 잘 조직하는 Cabal은 내가 언급 한 것처럼 "더 나은 의존성 관리"의 자격을 갖게 될 것이므로 자유롭게 그것을 고안하십시오. :] 나는 그런 시스템을 구현하는 데있어 장애물이 무엇인지 잘 모르겠습니다. –

답변

7

cabal (패키지 시스템) 자체의 선택적인 종속성 시스템의 부족은 옵션이 너무 좋지 않습니다.

하나의 옵션은 다음과 같습니다. 주 패키지를 통합하려는 각 추가 패키지에 대해 추가 패키지를 만들 수 있습니다.

예를 들어 과 을 통합하려면 lrucache-binary 패키지 (이 경우 통합 클래스 인스턴스)를 추가로 만들 수 있습니다. 마찬가지로 새 패키지에 lrucache-nfdatalrucachenfdata을 통합하십시오.

누군가가 과 binary의 통합을 원한다면 그는 [binary, lrucache, lrucache-binary]에 따라 달라질 수 있습니다.

+0

정확히 내가 언급 한 "고아 인스턴스 패키지"가 생각한 것입니다. – Carl

3

방금 ​​두 개의 패키지를 유지하는 경우 : lrucache입니다.이 패키지의 수는 다른 물건에 따라 다르며 현재는 다소 차이가있는 lrucache-lite (또는 lrucache-minimal)입니다. 그런 다음 사람들이 의존성을 최소화하기를 원한다면 라이트 버전을 사용하고, 종속성이 많은데 신경 쓰지 않는다면 표준 버전을 사용합니다. 큰 것은 아마도 코드 중복을 피하기 위해 lite에 의존 할 것입니다.

+0

나는 이것을'lrucache'와'lrucache-instances'라는 이름으로 보았습니다. 그렇게하면 패키지는 두 개 뿐이지 만 인스턴스를 선택하고 선택할 수는 없습니다. –

0

다양한 인스턴스를 컴파일 할 수 있도록 플래그를 lrucache.cabal에 추가 할 수 있습니다. 종속성 목록을 최소한으로 만드는 측면에서이를 제외하고는 을 제외하고 작동합니다. 빌드 의존 섹션에 빌드 플래그를 지정할 수 없으므로 현실 세계에서는 끔찍한 일입니다. 따라서 은 특정 플래그가있는 패키지에 의존하지만 종속성을 지정하지 않을 수 있습니다. 이것은 곧 거의 쓸모없는 것으로 줄어 듭니다.

정확히 말하면 위와 같이 작동하지 않을 수 있지만 수입 및 클래스 정의는 conditionally-compiled CPP pragma에 포함시킬 수 있습니까? 나는 imports의 내부 모듈을 감싸고 "optional dependencies"중 하나를 반입한다고 가정한다.

저는 이것을 시도하지는 않았지만 대답을 알기도합니다.

+0

예, 작동합니다. 하지만, 예를 들어, Binary 인스턴스의 경우에는 그랬다고 말할 수 있습니다. lrucache를 사용하고 이진 인스턴스를 사용하여 직렬화하려는 프로그램을 작성한다고 가정 해 보겠습니다. Cabal 파일의 build-depends 섹션에이를 표시 할 방법이 없습니다. 이것이 그 접근법의 문제점입니다. – Carl

1

게임에 조금 늦게,하지만 내 두 센트 :

  1. 라이브러리를 공개 API는 (클래스 인스턴스 포함) 빌드 플래그 또는 패키지의 가용성에 따라하지 달라 안 - 그것은 하향에 대한 처벌한다 스트림 개발자 및 배포자 패키지 관리자.

  2. 하스켈 플랫폼 ('unix'또는 'win32'등을 제외하고)에 종속성을 추가 할 것입니다.

그래도 'Hackage'페이지에 따르면 여러 개의 Linux 배포판에서 사용할 수 있으며 Windows 환경에서도 정상적으로 설치됩니다. 이 경우 패치를 수락하지만 직접 작성하지는 않습니다.

이 질문에 대한 답변은 실제로 나오지 않았지만 내가 사용할 생각 프로세스를 잘 보여줍니다.

관련 문제