簡體   English   中英

如何構建具有可選依賴項的 Haskell 程序?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM