在Cabal构建中包含数据文件

12

我有一个包,其结构如下(好吧,这大大简化了一下,但是……)

app/
  src/
    Main.hs
  data/
    data.txt
  app.cabal
  Paths_app.hs
  Setup.hs

在 Paths_app.hs 中,我有:

module Paths_app where
getDataFileName :: FilePath -> IO FilePath
getDataFileName = return

而在 Main.hs 中我有:

module Main where
import Paths_app
main = do
    file <- getDataFileName "data/data.txt"
    data <- readFile file
    putStrLn $ "Your data is: " ++ data

我的app.cabal文件的相关部分如下:

name: app
version: 1.0
build-type: Simple
data-files: data/data.txt

executable foo
  build-depends: base, haskell98
  main-is: Main.hs
  hs-source-dirs: src
这可以成功构建(使用cabal configure后跟cabal install),但可执行文件报错找不到 data.txt 文件。我已尝试替换该行

file <- getDataFileName "data/data.txt"

使用

file <- getDataFileName "data.txt"

但是同样的问题仍然存在。我是否有明显的错误?


1
你在Other-modules字段中提到了Paths_app吗? - hammar
2
为什么你有一个Paths_app.hs文件?难道不是cabal应该创建它吗? - Ben Millwood
1
@benmachine 我应该早点想到这个。正如这个输出所证明的那样,它正在选择正确版本的 Paths_<packagename>Found directory: C:\Users\ctaylor\AppData\Roaming\cabal\haskeme-0.1\lib\stdlib.scm,尽管它仍然无法加载文件。我需要进一步调查。感谢您的帮助! - Chris Taylor
4
问题已解决:我正在Windows系统上进行构建,当我使用getDataFileName返回的文件名将数据加载到程序中时,我没有对反斜杠进行转义。感谢大家的帮助!我不确定是否应该将此作为答案(因为它实际上并不是问题的答案),还是只需删除该问题。 - Chris Taylor
2
为什么不回答呢,尽管回答吧。 - Ben Millwood
显示剩余5条评论
2个回答

2
我已经尝试复现它,但对我来说一切正常。
在您描述的设置中,我不得不放弃对 haskell98 的依赖,因为 basehaskell98 都提供了 Prelude。此外,文件 Main 无法编译,因为它将关键字 data 用作变量名,所以我将变量重命名为 dat。但之后一切都正常了。
我的设置一些信息:
$ ghc --version
The Glorious Glasgow Haskell Compilation System, version 7.4.1

$ cabal --version
cabal-install version 0.13.3
using version 1.14.0 of the Cabal library 

$ ls ~/.cabal/bin/
...  foo  ...   

$ ls ~/.cabal/share/app-1.0/data/
data.txt

2
我猜你是在*nix上编译?事实证明问题出在Windows上转义反斜杠的处理上。 - Chris Taylor
1
啊,这就说得通了。我在 Mac OS 上编译并运行了。 - Stefan Holdermans

2
问题在于我是在Windows系统上构建的,当我使用getDataFileName返回的文件名加载数据到我的程序时,我没有转义反斜杠。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接