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

dav*_*420 61 haskell version package cabal

我希望我的cabalised程序有一个--version开关.

我希望它报告与.cabal文件中存在的版本相同的版本.

如果我必须在我的Haskell源代码和.cabal文件中单独更新版本号,我最终会使它们不同步.

那么,我的程序如何在cabal下编译,从.cabal文件中获取其版本号?

Don*_*art 85

Cabal很好地支持这一点.如下(来自xmonad):

导入Paths_$myprogram- Cabal使用.cabal文件中的大量元数据创建的文件,以及用于处理版本号的模块:

import Paths_xmonad (version)
import Data.Version (showVersion)
Run Code Online (Sandbox Code Playgroud)

添加打印语句以打印由Paths_$myprogram以下提供的"版本"字段:

case args of
     ["--version"] -> putStrLn ("xmonad " ++ showVersion version)
Run Code Online (Sandbox Code Playgroud)

通常,Cabal生成的Paths文件包含以下值 dist/build/autogen/

version,
getBinDir, getLibDir, getDataDir, getLibexecDir,
getDataFileName
Run Code Online (Sandbox Code Playgroud)

  • 在这个答案之后5年,值得一提的是,这在新的Stack构建工具下也能正常工作.唯一的区别是Paths文件位于`.stack-work/dist/x86_64-osx/Cabal-1.22.4.0/build/autogen /`这个位置(`x86_64-osx`部分根据你的架构而变化) . (7认同)
  • 记得将`Paths_ $ myprogram`放入.cabal中的"other-modules",以避免"ld返回1退出状态" (3认同)
  • 请注意,包名称中的任何 `-` 都必须替换为 `Paths_$myprogram` 中的 `_`。 (2认同)