2011-10-04 50 views

Trả lời

5

Sử dụng cabalvchk: http://hackage.haskell.org/package/cabalvchk-0.2

Ví dụ, để xác minh rằng phiên bản của parsec là> = 0.4, bạn có thể phát hành:

$ cabalvchk parsec '>= 0.4' 

Mã trả lại sẽ là zero nếu phiên bản hạn chế được thỏa mãn và khác không. Các ràng buộc phiên bản có thể được bất cứ điều gì cabal hiểu. Tham số thứ ba tùy chọn có thể không trống để yêu cầu đầu ra tiết.

+0

Điều này thực sự thú vị, ngay cả khi nó có nghĩa là tôi phải giới thiệu một sự phụ thuộc mới. –

+0

Cảm ơn! Dài hạn tôi có thể kiến ​​nghị các công cụ cabal folks để thêm chức năng này trực tiếp vào cabal mà sẽ làm giảm phụ thuộc, nhưng phụ thuộc bổ sung này sẽ là cần thiết cho nhu cầu trước mắt của bạn. –

3

Tôi không biết nhiều về configure; bạn có thể yêu cầu nó chạy một lệnh cụ thể không? Nếu có, thì ghc-pkg latest sẽ giúp bạn. Ví dụ, đây là một hoạt động trên máy tính của tôi cho gói zlib:

% ghc-pkg latest zlib 
zlib-0.5.3.1 
% ghc-pkg latest --global zlib 
zlib-0.5.3.1 
% ghc-pkg latest --user zlib 
ghc-pkg: cannot find package zlib 
zsh: exit 1  ghc-pkg latest --user zlib 

Các --global nên được sử dụng cho việc cài đặt toàn hệ thống, và không có cờ ở tất cả cho việc cài đặt sử dụng cụ thể. Chỉ sử dụng cờ --user khi bạn muốn kiểm tra xem người dùng có cài đặt gói địa phương không (có thể ghi đè lên gói chung).

Trừ khi bạn có lý do không, tôi khuyên bạn nên bỏ qua configure để ủng hộ cabal. Đối với cabal, giải pháp ở đây là để cabal init đầu tiên trong thư mục của dự án của bạn, sau đó kiểm tra xem bạn có một dòng như thế này trong các tập tin .cabal đó là tạo ra:

build-depends: zlib >= 0.5 

Các cabal toolchain là tiêu chuẩn cho các dự án Haskell (vì nó tự động hóa và đơn giản hóa nhiều thứ, bao gồm cả phụ thuộc theo đuổi). Bạn cũng có thể yêu cầu cabal để gọi configure nếu có các phụ thuộc khác. Hãy mở một câu hỏi riêng nếu bạn muốn biết thêm thông tin về điều này.

+0

Cảm ơn câu trả lời.Tôi đã sử dụng ghc-pkg, nhưng tôi không biết cách nói 'Tôi cần phiên bản> = x.y'. Lý do cho việc sử dụng 'configure' là các kịch bản haskell là một phần của một chương trình lớn hơn chủ yếu được viết bằng python, và tất cả các phụ thuộc đã được quản lý thông qua cấu hình. –

0

Sử dụng ghc-pkg list, bạn có thể nhận danh sách các phiên bản đã cài đặt của gói theo thứ tự tăng dần. Bạn hy vọng có thể lọc qua danh sách này để tìm kiếm kết quả phù hợp. (Tôi không biết làm thế nào để làm điều này với configure, xin lỗi).

$ ghc-pkg list yesod 
/home/ahammar/.haskell/lib/ghc-7.0.2/package.conf.d 
/home/ahammar/.ghc/x86_64-linux-7.0.2/package.conf.d 
    yesod-0.8.2.1 
    yesod-0.9.1 
    yesod-0.9.2.2 
0

Hãy thử một cái gì đó như thế này:

# Find ghc-pkg, so we can do version checks 
AC_ARG_VAR([GHC_PKG], [Path to ghc-pkg]) 
AC_PATH_PROG([GHC_PKG], [ghc-pkg]) 
AS_IF([test -z "$GHC_PKG"], [AC_MSG_ERROR([Cannot find ghc-pkg.])]) 

# Check that the package actually exists 
AC_MSG_CHECKING([for Haskell package foo]) 
AS_IF([$GHC_PKG latest foo > /dev/null 2>&1], 
    [AC_MSG_RESULT([yes])], 
    [AC_MSG_RESULT([no]) 
AC_MSG_ERROR([Cannot find foo])]) 

# Check its version 
AC_MSG_CHECKING([if foo is new enough]) 
foo_ver=`$GHC_PKG latest foo | sed 's/^foo-//'` 
# At this point you have the version of foo and the minimum version you want. 
# The rest of the test is pretty easy to write, use cut and test to compare the 
# version numbers. If it's new enough, AC_MSG_RESULT([yes]). 
# If not, AC_MSG_RESULT([no]) and AC_MSG_ERROR([foo is not new enough.]) 
1

Có lẽ câu hỏi tốt hơn là: nên bạn? Kiểm tra một số phiên bản cụ thể là một trong những đối số tuyệt vời trong thế giới autoconf, và người chiến thắng chung của cuộc tranh luận là bên mà nói rằng bạn không bao giờ nên làm điều đó. Bạn cần những tính năng cụ thể nào của Haskell? Thử nghiệm cho điều đó. Như một ví dụ đơn giản (không liên quan đến haskell), giả sử chương trình của bạn sử dụng inotify vì vậy bạn muốn cấu hình để kiểm tra nếu nó có sẵn. Bạn chỉ có thể kiểm tra phiên bản hạt nhân là> 2.6.13, nhưng sau đó khi Joe cố gắng xây dựng chương trình của bạn trên phiên bản 2.4.xx của mình, trong đó anh ta đã vá khả năng inotify, anh ta sẽ thực sự bị kích thích khi chương trình của bạn không công việc.

Bạn không quan tâm nếu Haskell> x.y có sẵn. Thay vào đó, có một số tính năng cụ thể của Haskell mà bạn muốn được giới thiệu trong x.y; kiểm tra tính năng đó.

Các vấn đề liên quan