使用 Stack 作为全局包管理器的推荐方法

Recommended approach to use Stack as global package manager

我想在全局安装一些 Haskell 库,例如 hindent 我的编辑器的 Haskell 集成使用的库。推荐的方法是什么?

我认为 stack install hindent 是正确的方法。然而,后来我想更新我的包,发现没办法做到这一点。根据the GitHub issue report I found,

stack is concerned with managing a local build sandbox for a project. It isn't intended to be a global package manager.

似乎有一些变通办法,例如维护一个虚拟项目,它对我想安装的包具有人为依赖性。这听起来像是一个可怕的 hack,而且我一直无法找到关于实际应该采取什么方法的任何官方文档。

无法使用我的系统包管理器 (Homebrew) 安装 Haskell 包,因为它们未打包。

我会打开一个针对 Stack 的问题报告,但是贡献指南要求我改为在 标签下提问。

好吧,任何项目中的 stack install 都将安装到 ~/.local/bin,因此您安装的任何可执行文件都可以全局访问。

全局项目在运行没有项目的时候使用,位于~/.stack/global-project/stack.yaml.

如果您希望所有可全局访问的工具都具有相同的依赖关系(也许是为了确保 ghc 版本匹配或其他),那么您可以创建一个旨在构建所有这些工具的项目。它是否是 "global project" 取决于您 - 它没有什么特别之处,如果您 运行 堆栈并且不在项目中,它只是一个默认值。

为了记录 "what haskell executables do I want installed globally",您可以考虑创建一个 shell 文件,例如

#!/bin/sh
stack install hindent

然后 运行每当您更改已安装工具的版本时都会执行此操作。

此外,对于像intero这样需要匹配ghc版本的工具,你可以做stack install --copy-compiler-tool intero,当堆栈与那个ghc版本一起使用时,它会在PATH上可用。