使用测试套件有条件地编译库
Conditional compilation of library using test suite
我正在尝试为 haskell 项目正确编译我的测试套件,该项目使用 CPP 扩展有条件地导入不同的模块。一个模块将输出发送到网络,另一个发送到终端,用于调试。
这工作正常,但是当我尝试设置我的测试套件时,它似乎不遵守 .cabal 文件中设置的 cpp 选项,而是始终构建网络版本。
Cabal 文件:
name: server
version: 0.1.0.0
build-type: Simple
cabal-version: >= 1.10
library
hs-source-dirs:
src
build-depends:
base >=4.9 && <=4.11
, lens
, random
, transformers
, safe
, uuid-types
, QuickCheck
, network
, bytestring
, binary
exposed-modules:
Betting
Game
Input.Network.Input
Input.Terminal.Input
Lenses
Main
Output.Network.Output
Output.Terminal.InputMessages
Output.Terminal.Output
Output.Terminal.OutputMessages
RunLocal
RunNetwork
Showdown
Showdown.Best
Showdown.Ord
Showdown.Value
TestStates
Types
Utilities.Card
Utilities.Player
Utilities.Showdown
Utilities.Terminal.Output
Utilities.Types
other-modules:
Paths_server
default-language: Haskell2010
executable local-server
main-is: Main.hs
hs-source-dirs:
src
cpp-options: -DDEBUG
build-depends:
base >=4.9 && <=4.11
, lens
, random
, transformers
, safe
, uuid-types
, QuickCheck
, server
other-modules:
Betting
Game
Input.Network.Input
Input.Terminal.Input
Lenses
Output.Network.Output
Output.Terminal.InputMessages
Output.Terminal.Output
Output.Terminal.OutputMessages
RunLocal
RunNetwork
Showdown
Showdown.Best
Showdown.Ord
Showdown.Value
TestStates
Types
Utilities.Card
Utilities.Player
Utilities.Showdown
Utilities.Terminal.Output
Utilities.Types
default-language: Haskell2010
executable networked-server
main-is: Main.hs
hs-source-dirs:
src
build-depends:
base >=4.9 && <=4.11
, lens
, random
, transformers
, safe
, uuid-types
, QuickCheck
, server
, network
, bytestring
, binary
other-modules:
Betting
Game
Input.Network.Input
Input.Terminal.Input
Lenses
Output.Network.Output
Output.Terminal.InputMessages
Output.Terminal.Output
Output.Terminal.OutputMessages
RunLocal
RunNetwork
Showdown
Showdown.Best
Showdown.Ord
Showdown.Value
TestStates
Types
Utilities.Card
Utilities.Player
Utilities.Showdown
Utilities.Terminal.Output
Utilities.Types
default-language: Haskell2010
test-suite test-server
type: exitcode-stdio-1.0
main-is: Tests.hs
hs-source-dirs:
tests
cpp-options: -DDEBUG
build-depends:
base >=4.9 && <=4.11
, lens
, random
, transformers
, safe
, uuid-types
, QuickCheck
, server
, poker-eval
other-modules:
BettingTests
CardTests
PlayerTests
ShowdownTests
default-language: Haskell2010
有条件编译的模块之一的示例:
{-# LANGUAGE CPP #-}
module Utilities.Card where
#ifdef DEBUG
import Output.Terminal.Output (outputPlayerCards)
#else
import Output.Network.Output (outputPlayerCards)
#endif
dealCards :: GameStateT ()
dealCards = do
updateCards =<< numPlayersT
outputPlayerCards
在我的测试套件中,网络版本的 outputPlayerCards 总是被调用,尽管在 cpp-options:-DDEBUG 设置中。
但是,networked-server 和 local-server 被正确编译,并调用了适当的函数。
我以前的方法只有一个为网络或本地编译并带有标志的可执行文件有效,但是我读到这不是编写测试套件的正确方法,因为我没有链接它,并且而是通过将其源目录包含在 .cabal 文件中来直接构建它。
我正在使用堆栈进行构建,如果需要可以包含该文件。
我会使用 cabal 标志:设置为 true 时,编译库和测试套件的本地调试版本;当设置为 false 时,编译库的网络版本但禁用测试套件。
您还应该将可执行文件的主要文件与库放在一个单独的目录中,这是您提到不链接库的问题背后的主要原因。
我正在尝试为 haskell 项目正确编译我的测试套件,该项目使用 CPP 扩展有条件地导入不同的模块。一个模块将输出发送到网络,另一个发送到终端,用于调试。
这工作正常,但是当我尝试设置我的测试套件时,它似乎不遵守 .cabal 文件中设置的 cpp 选项,而是始终构建网络版本。
Cabal 文件:
name: server
version: 0.1.0.0
build-type: Simple
cabal-version: >= 1.10
library
hs-source-dirs:
src
build-depends:
base >=4.9 && <=4.11
, lens
, random
, transformers
, safe
, uuid-types
, QuickCheck
, network
, bytestring
, binary
exposed-modules:
Betting
Game
Input.Network.Input
Input.Terminal.Input
Lenses
Main
Output.Network.Output
Output.Terminal.InputMessages
Output.Terminal.Output
Output.Terminal.OutputMessages
RunLocal
RunNetwork
Showdown
Showdown.Best
Showdown.Ord
Showdown.Value
TestStates
Types
Utilities.Card
Utilities.Player
Utilities.Showdown
Utilities.Terminal.Output
Utilities.Types
other-modules:
Paths_server
default-language: Haskell2010
executable local-server
main-is: Main.hs
hs-source-dirs:
src
cpp-options: -DDEBUG
build-depends:
base >=4.9 && <=4.11
, lens
, random
, transformers
, safe
, uuid-types
, QuickCheck
, server
other-modules:
Betting
Game
Input.Network.Input
Input.Terminal.Input
Lenses
Output.Network.Output
Output.Terminal.InputMessages
Output.Terminal.Output
Output.Terminal.OutputMessages
RunLocal
RunNetwork
Showdown
Showdown.Best
Showdown.Ord
Showdown.Value
TestStates
Types
Utilities.Card
Utilities.Player
Utilities.Showdown
Utilities.Terminal.Output
Utilities.Types
default-language: Haskell2010
executable networked-server
main-is: Main.hs
hs-source-dirs:
src
build-depends:
base >=4.9 && <=4.11
, lens
, random
, transformers
, safe
, uuid-types
, QuickCheck
, server
, network
, bytestring
, binary
other-modules:
Betting
Game
Input.Network.Input
Input.Terminal.Input
Lenses
Output.Network.Output
Output.Terminal.InputMessages
Output.Terminal.Output
Output.Terminal.OutputMessages
RunLocal
RunNetwork
Showdown
Showdown.Best
Showdown.Ord
Showdown.Value
TestStates
Types
Utilities.Card
Utilities.Player
Utilities.Showdown
Utilities.Terminal.Output
Utilities.Types
default-language: Haskell2010
test-suite test-server
type: exitcode-stdio-1.0
main-is: Tests.hs
hs-source-dirs:
tests
cpp-options: -DDEBUG
build-depends:
base >=4.9 && <=4.11
, lens
, random
, transformers
, safe
, uuid-types
, QuickCheck
, server
, poker-eval
other-modules:
BettingTests
CardTests
PlayerTests
ShowdownTests
default-language: Haskell2010
有条件编译的模块之一的示例:
{-# LANGUAGE CPP #-}
module Utilities.Card where
#ifdef DEBUG
import Output.Terminal.Output (outputPlayerCards)
#else
import Output.Network.Output (outputPlayerCards)
#endif
dealCards :: GameStateT ()
dealCards = do
updateCards =<< numPlayersT
outputPlayerCards
在我的测试套件中,网络版本的 outputPlayerCards 总是被调用,尽管在 cpp-options:-DDEBUG 设置中。
但是,networked-server 和 local-server 被正确编译,并调用了适当的函数。
我以前的方法只有一个为网络或本地编译并带有标志的可执行文件有效,但是我读到这不是编写测试套件的正确方法,因为我没有链接它,并且而是通过将其源目录包含在 .cabal 文件中来直接构建它。
我正在使用堆栈进行构建,如果需要可以包含该文件。
我会使用 cabal 标志:设置为 true 时,编译库和测试套件的本地调试版本;当设置为 false 时,编译库的网络版本但禁用测试套件。
您还应该将可执行文件的主要文件与库放在一个单独的目录中,这是您提到不链接库的问题背后的主要原因。