OK, vậy đây là một câu hỏi đơn giản. Tôi đã viết một hàm debug :: String -> IO()
. Tôi muốn thiết lập mọi thứ để khi tôi biên dịch chương trình của mình theo một cách, hàm này ghi vào lỗi tiêu chuẩn, và nếu tôi biên dịch chương trình của tôi theo cách khác, hàm này sẽ trở thành no-op. Có một số chuyển đổi dễ dàng biên dịch thời gian để làm điều đó? Hay tôi phải tự mình thực hiện điều gì đó?Trình chuyển đổi trình biên dịch để bật/tắt thông báo gỡ lỗi?
Trả lời
Tôi không nghĩ rằng liên quan đến trace
là phương pháp phù hợp để giải quyết vấn đề này.
Thay vào đó, bạn có thể sử dụng bộ tiền xử lý để tắt/bật thông báo gỡ lỗi. Đặt những điều sau đây trong một file riêng biệt:
{-# LANGUAGE CPP #-}
import System.IO
debug :: String -> IO()
debug message =
#ifdef DEBUG
hPutStrLn stderr message
#else
return()
#endif
Dòng {-# LANGUAGE CPP #-}
phép tiền xử lý C cho file hiện hành. Sau đó, bạn có thể biên dịch tệp có/không cần gỡ lỗi bằng cách sử dụng ghc -DDEBUG
hoặc chỉ ghc
.
Bạn có thể thực hiện việc này bằng cách sử dụng bộ tiền xử lý CPP và #ifdef
.
Trước tiên, sử dụng
#ifdef
để chọn giữa hai phiên bản của hàm.{-# LANGUAGE CPP #-} module Logging (debug) where debug :: String -> IO() #ifdef DEBUG debug = putStrLn #else debug _ = return() #endif
Sau đó, thêm một lá cờ để tập
.cabal
của bạn để kiểm soát nó.... flag debug description: Enable debug logging default: False executable foo -- or library if flag(debug) cpp-options: -DDEBUG ...
Cuối cùng, để cho phép gỡ lỗi, bật cờ với
-f
khi cấu hình:$ cabal configure -f debug
Để bổ sung cho câu trả lời tuyệt vời đưa ra ở đây, tôi muốn đề cập đến phương pháp này, trong trường hợp những người (như tôi) đang sử dụng phiên bản mới nhất của stack
cùng với hpack
.
Trong tập tin package.yaml
tôi thêm như sau:
flags:
debug: # Or whatever name you want to give to the flag
description: Enable debug
manual: True
default: False
when:
- condition: flag(debug)
cpp-options: -DDEBUG
Sau đó, tôi sẽ khuyên bạn nên sử dụng traceIO
từ Debug.Trace
kết hợp với NoTrace
, do đó traceIO
sẽ không có hiệu lực khi mã được biên dịch mà không có sự debug
cờ :
{-# LANGUAGE CPP #-}
-- ...
#ifdef DEBUG
import Debug.Trace
#else
import Debug.NoTrace
#endif
-- ...
someFunc :: IO()
someFunc = do
-- ...
traceIO "Whatever..."
Khi sử dụng ngăn xếp, cờ debug
có thể được bật bằng cách sử dụng --flag
tùy chọn:
stack build --flag "your-package:debug"
Hoặc nếu bạn đang thử nghiệm gói của bạn:
stack build --flag "your-package:debug"
Nếu hpack
không được sử dụng, thì bạn có thể cấu hình file cabal của bạn như được giải thích bởi hammar.
Bạn đã cân nhắc sử dụng 'Debug.Trace' chưa? [Haskel Debugging] (http://en.wikibooks.org/wiki/Haskell/Debugging) cung cấp một số chi tiết khá chi tiết. – devnull
@devnull 'dấu vết' sẽ không làm những gì tôi muốn - nhưng' traceIO' có thể ... – MathematicalOrchid