10

では、簡単な質問です。関数を書きましたdebug :: String -> IO ()。プログラムをある方法でコンパイルすると、この関数が標準エラーに書き込み、別の方法でプログラムをコンパイルすると、この関数がノーオペレーションになるように設定したいと思います。それを行うための簡単なコンパイル時の切り替えはありますか? それとも、自分で何かを実装する必要がありますか?

4

3 に答える 3

2

stackここで提供された優れた回答を補完するために、(私のような) 人々が最新バージョンのを使用している場合に備えて、このアプローチについて言及したいと思いhpackます

package.yamlファイルに次を追加しました。

  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

次に、 traceIOfromDebug.Traceと組み合わせて使用​​することをお勧めしますNoTrace。これにより、コードがフラグtraceIOなしでコンパイルされたときに効果がなくなります。debug

{-# LANGUAGE CPP #-}

-- ...

#ifdef DEBUG
import Debug.Trace
#else
import Debug.NoTrace
#endif              

-- ...
someFunc :: IO ()
someFunc = do
    -- ...
    traceIO "Whatever..."

スタックを使用する場合、次のオプションdebugを使用してフラグを有効にできます。--flag

stack build --flag "your-package:debug"

または、パッケージをテストしている場合:

stack build --flag "your-package:debug"

を使用しない場合は、 hammarhpackで説明されているように cabal ファイルを構成できます 。

于 2018-01-03T17:32:05.890 に答える