[英]How can I build a Haskell program with optional dependencies?
我正在為自己的研究編寫一些模擬軟件,並制作了一個可視化工具作為項目的一部分。 這在我的工作站上運行得非常好,我可以用它來監視正在運行的模擬,或者稍后可視化日志數據。 我已經到了一個地步,我現在需要在集群上運行模擬,而OpenGL
既不可用,也不需要實際模擬。 但是,由於該項目依賴於OpenGL
,因此不會構建。
現在顯然我可以創建一個沒有OpenGL
部分的單獨分支,這可能是我的短期解決方案,但維護起來似乎有點痛苦。
我不確定最好的長期解決方案是什么。 理想情況下,我希望有一個設置,如果OpenGL
可用,則可以選擇構建可視化部分,如果不可用,則跳過它。 stack
(或cabal
)是否支持這種類型的東西?
另一種選擇是將可視化部分作為一個不同的項目,但這會使監控模擬運行變得更加困難。
解決這個問題的最佳方法是什么?
有幾種方法可以做到這一點。
第一個也是最簡單的方法是將您的代碼分成兩個不同的包。 一個是沒有 OpenGL 依賴的代碼,另一個是使用 OpenGL 的可視化工具。如果你沒有理由不能這樣做,這是迄今為止最好的選擇。
如果你不能這樣做,那么你可以使用 Cabal 標志,正如評論中提到的那樣。 帶有標志的 cabal 文件的示例是:
name: mylibname
description: some description
...
flag opengl
description: build opengl support
default: False
library
...
build-depends: base, containers, ...
if flag(opengl)
build-depends: OpenGL
cpp-options: -DWITH_OPENGL
...
現在在你的源文件中,你可以這樣做:
{-# LANGUAGE CPP #-}
...
#ifdef WITH_OPENGL
someOpenGLCode
#endif
默認情況下,您的構建不會包含 OpenGL 部分。 您可以使用 cabal 或 stack 來請求使用 OpenGL 構建 package。在 cabal 中,您可以在命令行上使用-f
或--flags
選項,或者在 cabal.project 文件中使用flags:
字段。 其他人已經鏈接到看起來像一些等效堆棧文檔的內容(盡管我對堆棧的了解還不足以評論其正確性)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.