【问题标题】:Hardcode datadir path upon installing executable安装可执行文件时硬编码 datadir 路径
【发布时间】:2021-02-15 21:19:09
【问题描述】:

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

最初的尝试:我被引导到 Cabal(库)中的 7.6. Accessing data files from package code 部分,并了解到我可以从 Paths_myprog 导入 getDataDir :: IO FilePath,只要我将 Paths_myprog 添加到 other-modules(虽然 @默认情况下为 987654322@),并且在安装我的程序后,我可以运行它:

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

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

那么:有没有办法可以在安装时硬编码这个路径?

(最好是与 Stack 相关的答案,但也非常感谢 cabal-install 的答案。)

【问题讨论】:

  • 该文件被列为data-files: relative/path/to/file.txt,但当我安装可执行文件并更改目录时,该相对路径不再存在。默认的datadir 类似于/Users/simonshine/Projects/myprog/.stack-work/install/x86_64-osx/d6f6bad3f39945fab394a08b1bc4be948440a07b57dc3d9c354985b39ee09310/8.8.4/share/x86_64-osx-ghc-8.8.4/myprog-0.1.0,但我希望它是例如/usr/local/share.
  • 您是否考虑过将数据本身硬编码到可执行文件中,而不仅仅是一个路径?

标签: haskell cabal haskell-stack cabal-install


【解决方案1】:

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!

【讨论】:

  • 但是我该如何改变呢?如果安装程序是configure,我可能会写./configure --prefix=/usr/local,然后datarootdir 将是${prefix}/share。我的情况是,我想象一些打包者(我自己,真的)会调用 stack install 并指定我的打包工具将去往并捆绑的路径(例如 PPA、AUR)。
  • 我可能喜欢--prefix=~/.local 的等价物,这样不仅可执行文件以~/.local/bin 结尾,而且数据文件以~/.local/share 结尾,myprog_datadir=~/.local/share 是默认值而不是很长的名字,里面有一个哈希。
  • @SimonShine ~/.cabal/config 应该有标记为install-dirs userinstall-dirs global 的节。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-24
  • 2014-01-11
  • 2013-08-08
  • 2014-08-05
相关资源
最近更新 更多