2014-02-05 39 views
4

我正在做一個Haskell項目(Happstack服務器+ Blaze HTML /作爲主庫的前端),我想添加一個靜態數據目錄。Haskell Cabal包 - 找不到Paths_模塊

看起來您可以使用Cabal使用自動生成的Path_<package_name>模塊進行此操作。所以在我的例子中,這個包叫做new-website,所以這個模塊應該叫做Paths_new_website

Link to Cabal docs re: a custom package's Paths_pkgname module.

在命令行中使用cabal repl,我想確認我將有機會獲得Paths_模塊。但是,我發現在運行cabal_repl時,Cabal沒有導入Paths_new_website模塊。

Here's a link to some relevant code and terminal output via a gist.

有沒有人有這方面的經驗,得到一個挑剔Paths_模塊與我的包加載?我懷疑這可能是Main.hs(主要源文件)與cabal_repl中的上下文之間的詞彙範圍問題...

+1

您在編譯或加載GHCi時遇到問題嗎?在構建過程中,Cabal只生成這些'Paths_ *'模塊。 (編輯:哦,只是看到它,'cabal repl') –

+0

@ J.Abrahamson謝謝你!事實證明,我只需要在'Main.hs'中執行'import Paths_ *'(其中'*'是我的'.cabal'構建文件中的包名)。 cabal文檔使得它看起來好像只需要在我的'.cabal'文件的'other-modules'下添加'Paths_ *',我就可以自動訪問'Paths_ *'模塊。不是這樣!事實上,即使沒有添加到我的'.cabal'文件中,我也可以將自動生成的'Paths_ *'模塊導入到Main中。 – mecampbellsoup

+0

@ J.Abrahamson當你說「構建過程中」時,我的理解是'cabal repl'正在執行構建 - 是否正確? – mecampbellsoup

回答

4

Paths_*模塊僅在構建期間由Cabal生成。如果您使用GHCicabal repl運行程序包,則它們將不存在,並且代碼將因「無法找到模塊」錯誤而失敗。

雖然有一個鬼鬼祟祟的開發模式技巧:只要建立自己的Paths_*模塊並將其放入您的haskell-source-dir。在開發過程中,GHCi將加載該模塊,您可以調整其導出的符號以使您的開發環境飛行。在構建過程中,Cabal會自行覆蓋您的模塊,並考慮構建模塊所需的最終信息。

因此,在這種特殊情況下,只需製作一個文件src/Paths_stackbuilders.hs併爲其提供一個相對於datadir的路徑。

+4

你也可以做'ghci -idist/build/autogen' –

+3

我按照你的建議,用手寫的放入假模塊來試試。但'cabal build'使用了假模塊,並沒有覆蓋或取代它(cabal 1.18) – NobbZ