Cabal在需要分析库时不安装依赖项?

yai*_*chu 44 profiling haskell cabal

我想用分析编译我的程序,所以我运行:

$ cabal configure --enable-executable-profiling
...
$ cabal build
...
    Could not find module 'Graphics.UI.GLUT':
      Perhaps you havent installed the profiling libraries for package 'GLUT-2.2.2.0'?
...
$ # indeed I have not installed the prof libs for GLUT, so..
$ cabal install -p GLUT --reinstall
...
    Could not find module 'Graphics.Rendering.OpenGL':
      Perhaps you havent installed the profiling libraries for package 'OpenGL-2.4.0.1'?
...
Run Code Online (Sandbox Code Playgroud)

因此,问题是,与cabal通常的欢迎行为不同,cabal无法解析依赖关系并在需要分析库时安装它们.

我可以通过手动解析依赖项来解决它(通过跟踪编译一段时间后出现的错误):

$ cabal install -p OpenGLRaw --reinstall
$ cabal install -p StateVar --reinstall
$ cabal install -p Tensor --reinstall
$ cabal install -p ObjectName --reinstall
$ cabal install -p GLURaw --reinstall
$ cabal install -p OpenGL --reinstall
$ cabal install -p GLUT --reinstall
Run Code Online (Sandbox Code Playgroud)

然后重复我的下一个依赖..

有一个更好的方法吗?也就是说,让cabal像普通图书馆一样自己做工作?

Tom*_*rst 45

library-profiling: True在我的~/.cabal/config文件中启用了.从那时起,任何新安装都将自动启用分析.

不幸的是,这仍然意味着我必须为已安装的旧软件包手动重新安装.虽然,经过一段时间的手动操作,我现在已经重新安装了大多数软件包并启用了分析...

  • 我想这对许多人来说都是一个熟悉的例程.如果只有一个命令来自动执行这个非常费力的任务,例如`cabal重新安装 - 全部 - 带库 - 配置文件启用'. (7认同)
  • 经过数周令人沮丧的重新安装后,我建议您在对~~/.cabal/config`进行上述更新后完全卸载所有内容.有几种方法可以做到这一点.一个是`rm -rf~/.ghc` (3认同)

Dan*_*her 30

来自Tom Lokhorst的评论:

我希望有人会得到一个更好的答案,一个不需要我下次手动重新安装完整的Haskell平台的答案.

对于未来的访客:

安装所有已安装库的性能分析版本的任务变得不那么繁琐,cabal (cabal-install)现在跟踪world.cabal目录中的文件中使用它安装的内容(在Linux上$HOME/.cabal,在Windows上,就像C:\Users\%YOU%\AppData\Roaming\cabal\在OSX 上那样) .

因此,在config文件中启用分析(在同一目录中)并清除GHC的软件包数据库(您可以找到全局和用户db的位置ghc-pkg list nonexisting;从全局数据库中删除cabal安装的软件包,ghc-pkg unregister packagename如果有的话,请重命名或删除整个用户数据库 - 这是必要的,因为该world文件只跟踪显式安装的包,而不是它们的依赖项),安装具有性能分析支持的所有内容应该如下工作:

$ cabal install --reinstall world --dry-run
Run Code Online (Sandbox Code Playgroud)

首先运行以--dry-run在实际重新安装任何内容之前检查问题.如果它会重新安装启动软件包,process或者directory,这是一个不好的标志,如果您不知道如何处理它,请在#haskellIRC频道,其中一个邮件列表或此处寻求指导.如果由于某些软件包的hackage上的新版本彼此不兼容而无法找到一致的安装计划,通常可以通过编辑world文件并限制某些软件包的允许版本来解决.

然后,如果你乐观地认为什么都不会破坏,

$ cabal install --reinstall world
Run Code Online (Sandbox Code Playgroud)

GHC忙于编制时,喝一壶好茶.

  • 嘿,谢谢.我正在阅读`--`作为命令行标志而不是评论.哎呀! (6认同)
  • 我刚试过,`cabal install --reinstall world`重新安装并启用了性能分析.在配置文件中注释掉了`library-profiling:True`行吗? (2认同)

Ben*_*rne 15

Daniel Fischer的答案看起来不错,但出于某种原因,我的〜/ .cabal/world库只包含直接安装的库的条目,而不包含它们的依赖项.

相反,我使用了转储所有已安装库的列表

$ ghc-pkg list > list
Run Code Online (Sandbox Code Playgroud)

这列出了系统范围和本地安装的库.因此,我编辑了list文件以删除第一部分(包含系统安装的库),只留下后面的行/home/<user>/.ghc/....最后,我跑了

$ cabal install --reinstall $(cat list) 
Run Code Online (Sandbox Code Playgroud)

这对我有用.你应该先做--dry-run.然后去煮一壶茶.或者烤蛋糕.