Cabal:可执行数据文件

6

我想在cabal的data-files部分中包含一个可执行文件,以便在我的Haskell程序中作为子进程执行。

文件已经存在,getDataFileName可以使用它,但是它缺乏可执行位,因此尝试使用System.Process.createProcess运行它会失败并显示permission denied

是否有办法使cabal保留文件的执行权限?还有其他解决方法吗?


2
你可能需要使用自定义的 Setup.hs 文件和一个 post-install 钩子来解决这个问题。虽然在这种情况下,我可能会修改你的代码,在调用 createProcess 之前设置可执行位,因为自定义的 Setup.hs 文件可能很麻烦。 - Michael Snoyman
@MichaelSnoyman:但我认为,如果我的代码安装在系统目录中并由用户执行,则不一定具有设置可执行位的权限。 - yairchu
你说得对。在这种情况下,你可能需要使用Setup.hs选项,或者采用一些笨拙的技巧,比如将文件复制到临时位置,然后设置可执行位。 - Michael Snoyman
@MichaelSnoyman:我现在尝试使用自定义的 Setup.hs 选项,但似乎由于 Cabal 没有调用钩子,目前无法实现 - https://github.com/haskell/cabal/issues/1805 - yairchu
1
使用copy钩子而不是install钩子怎么样? - Michael Snoyman
1个回答

3

如一些对cabal补丁的讨论所总结的那样,目前(未记录)的情况是应该同时使用复制和安装挂钩,因为其中之一将被执行。

编辑:经过一些挖掘,在cabal中存在一个关于libexec支持的旧票据,如果实施了这个票据,它将是一个非常好的解决方案。


关于第二个解决方案-@MichaelSnoyman也提出了上述建议,但我们得出的结论是它不一定有效,因为应用程序可能由没有更改全局安装数据文件权限的用户运行。 - yairchu
我编辑了你的答案,删除了有问题的第二个解决方案,接受第一个作为答案。 - yairchu
我有点迷失了。我在谷歌上搜索了一个可行的例子,但没有运气。这期间有什么变化吗?谢谢! - Schoon

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