安装可执行文件时硬编码 datadir 路径

时间:2021-02-15 21:19:09

标签: haskell cabal haskell-stack cabal-install

问题:我有一个用 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 答案。)

1 个答案:

答案 0 :(得分:4)

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!
相关问题