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

Hardcode datadir path upon installing executable

问题:我有一个用 Haskell 编写的命令行工具可以读取数据文件。安装程序后,我希望程序能够读取该数据文件,而不管我在哪个目录中。也就是说,在安装时,程序知道的路径应该与安装程序的路径对齐选择。

初始尝试:默认情况下我被定向到 7.6. Accessing data files from package code in Cabal (the library) and learned that I can import getDataDir :: IO FilePath from Paths_myprog, as long as I add Paths_myprog to other-modules (although Hpack auto-includes this 部分)并且在安装我的程序后,我可以 运行 它与:

myprog_datadir=~/tmp ~/.local/bin/myprog

然后我需要做的就是让安装程序将数据文件移动到这个目录,因为 myprog 动态访问该路径而不是一些硬编码值。但我不想每次 运行 程序时都必须在我的环境中指定 myprog_datadir=~/tmp,我希望它硬编码到二进制文件中!似乎在构建和安装时设置 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!