Haskell程序中如何获取导入模块所属包的版本?
如何在Haskell程序运行时获取导入模块的包版本?
核心解决方案
在Haskell中要在运行时获取依赖包的版本,最直接的方式是使用package-version库,它能直接查询指定包的版本信息。
步骤与代码示例
- 添加依赖:在你的
.cabal文件的build-depends中加入package-version:
build-depends: base >=4.14 && <5, hashable, package-version >=0.2
- 在代码中查询版本:导入
Data.PackageVersion模块,调用packageVersion函数获取指定包的Version类型值,再用Data.Version的showVersion转为字符串输出:
import Data.PackageVersion (packageVersion) import Data.Version (showVersion) import Data.Hashable (Hashable) main :: IO () main = do let hashableVersion = packageVersion "hashable" putStrLn $ "当前使用的hashable版本: " ++ showVersion hashableVersion -- 结合你的场景,可以把版本和哈希值一起存储
针对哈希关联场景的额外建议
因为hashable版本更新会改变哈希结果,除了锁定版本,还可以:
- 存储哈希值时,同时记录对应的
hashable版本 - 程序启动时检查存储的版本与当前使用的版本是否一致,不一致则提示用户,或者做哈希值的兼容转换(如果可行)
补充说明
如果需要获取当前程序自身的版本,可以使用Cabal自动生成的Paths_<你的包名>模块,其中的version字段就是程序的版本,但这个模块仅能查询自身包版本,无法获取依赖包的版本。
内容的提问来源于stack exchange,提问作者Enlico
相关产品推荐
相关产品推荐

