我的Haskell程序或库如何找到它的版本号?

70

我希望我的 cabal 包含一个 --version 开关。

我希望它能够报告与 .cabal 文件中相同的版本号。

如果我必须分别在 Haskell 源代码以及 .cabal 文件中更新版本号,最终它们将会不同步。

那么,在使用 cabal 编译时,我的程序如何才能从 .cabal 文件获取其版本号呢?

1个回答

97

这在 Cabal 中得到了很好的支持。如下所示(来自 xmonad):

导入 Paths_$myprogram - 这是 Cabal 根据 .cabal 文件创建的包含大量元数据的文件,还包括处理版本号的模块:

import Paths_xmonad (version)
import Data.Version (showVersion)
Paths_$myprogram 提供的 'version' 字段中添加一个打印语句:
case args of
     ["--version"] -> putStrLn ("xmonad " ++ showVersion version)

通常情况下,Cabal生成的Paths文件包含以下值,位于dist/build/autogen/目录中。

version,
getBinDir, getLibDir, getDataDir, getLibexecDir,
getDataFileName

9
在此回答5年后,值得一提的是这个方法在新的Stack构建工具下同样适用。唯一的区别是Paths文件位于类似于.stack-work/dist/x86_64-osx/Cabal-1.22.4.0/build/autogen/这样的位置(x86_64-osx部分会根据你的架构而变化)。 - Luis Casillas
3
请记得将 Paths_$myprogram 放入您的 .cabal 文件中的 "other-modules" 中,以避免出现 "ld returned 1 exit status" 的错误。 - Sophie
1
阅读@LuisCasillas上面的评论,似乎要使这个工作正常运行,需要在导入路径中有一个静态链接模块。但这意味着这个路径需要根据程序被构建的位置而改变,对吗?如果是这样,在程序跨越多个架构或远程构建的情况下,这几乎是不可行的。 - Ashesh
4
请注意,在Paths_$myprogram中,您包名称中的任何“-”都必须替换为“_”。 - orome

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