问题描述
问题:我有一个用 Haskell 编写的命令行工具,可以读取数据文件。安装程序后,我希望该程序能够读取该数据文件,而不管我发现自己在哪个目录中。也就是说,在安装时,程序知道的路径应该与安装程序的路径对齐选择。
初始尝试:我被定向到 Cabal(图书馆)中的 7.6. Accessing data files from package code 部分,并了解到我可以从 getDataDir :: IO FilePath
导入 Paths_myprog
,只要我添加 {{1} } 到 Paths_myprog
(虽然默认情况下为 Hpack auto-includes this)并且在安装我的程序后,我可以运行它:
other-modules
然后我需要做的就是让安装程序将数据文件移动到这个目录,因为 myprog_datadir=~/tmp ~/.local/bin/myprog
动态访问该路径而不是一些硬编码值。但是我不想每次运行程序时都在我的环境中指定 myprog
,我希望它硬编码到二进制文件中!而且似乎在构建和安装时设置 myprog_datadir=~/tmp
并没有设置编译时默认值。
所以:有没有办法在安装时硬编码这条路径?
(最好是与 Stack 相关的答案,但也非常感谢 cabal-install 答案。)
解决方法
data-files
中列出的文件已自动安装在正确的位置,以便 Paths_pkg
可以找到它们。这是一个最小的例子:
% cat Main.hs
import Paths_so_test
main :: IO ()
main = getDataDir >>= putStrLn
% cat so-test.cabal
cabal-version: >=1.10
name: so-test
version: 0.1.0.0
build-type: Simple
data-files: test
executable so-test
main-is: Main.hs
other-modules: Paths_so_test
autogen-modules: Paths_so_test
build-depends: base >=4.14 && <4.15
default-language: Haskell2010
% cat test
Hello,world!
% cabal install
Wrote tarball sdist to
/home/dmwit/projects/oneoff/tmp.dir/dist-newstyle/sdist/so-test-0.1.0.0.tar.gz
Resolving dependencies...
Up to date
Symlinking 'so-test'
% cat `so-test`/test
Hello,world!