为什么在 Windows 上找不到 stack(由 ghcup 安装)找到 msys(由 ghcup 安装)

问题描述 投票:0回答:1

在我的 Windows 10 系统上,我使用 GHCup 设置 Haskell。我安装了 ghc、cabal 和 stack。现在我正在尝试根据

network
安装一个包。网络搭建需要msys,但是明显检测不到:

C:\Users\Michael\source\repos\dummy>stack install network
network> configure
network> [1 of 2] Compiling Main             ( C:\Users\Michael\AppData\Local\Temp\stack-c2e699ee2698c622\network-3.1.1.1\Setup.hs, C:\Users\Michael\AppData\Local\Temp\stack-c2e699ee2698c622\network-3.1.1.1\.stack-work\dist\274b403a\setup\Main.o )
network> [2 of 2] Compiling StackSetupShim   ( C:\Users\Michael\AppData\Roaming\stack\setup-exe-src\setup-shim-Z6RU0evB.hs, C:\Users\Michael\AppData\Local\Temp\stack-c2e699ee2698c622\network-3.1.1.1\.stack-work\dist\274b403a\setup\StackSetupShim.o )
network> Linking C:\Users\Michael\AppData\Local\Temp\stack-c2e699ee2698c622\network-3.1.1.1\.stack-work\dist\274b403a\setup\setup.exe ...
network> Configuring network-3.1.1.1...
network> setup.EXE: The package has a './configure' script. If you are on Windows, This
network> requires a Unix compatibility toolchain such as MinGW+MSYS or Cygwin. If you
network> are not on Windows, ensure that an 'sh' command is discoverable in your path.
network>

虽然文档似乎很少(“你可能想查看额外的路径”),但我配置了

stack
看似正确的路径中有 MSys2 提供的 Shell:

C:\Users\Michael\source\repos\dummy>type c:\Users\Michael\AppData\Roaming\stack\config.yaml
templates:
  params: null
system-ghc: true
install-ghc: false
skip-msys: true
extra-path:
- 'C:\ghcup\msys64\usr\bin'
- 'C:\ghcup\msys64\mingw64\bin'
extra-include-dirs:
- 'C:\ghcup\msys64\mingw64\include'
extra-lib-dirs:
- 'C:\ghcup\msys64\mingw64\lib'

MingW路径正确。

stack
的更直接测试表明路径未应用:

C:\Users\Michael\source\repos\dummy>stack exec sh
Executable named sh not found on path: [".","C:\\Users\\Michael\\source\\repos\\dummy\\.stack-work\\install\\38482417\\bin","C:\\Users\\Michael\\AppData\\Roaming\\stack\\snapshots\\6c93f868\\bin","C:\\Users\\Michael\\AppData\\Roaming\\stack\\compiler-tools\\x86_64-windows\\ghc-8.10.7\\bin","C:\\ghcup\\bin",...,"C:\\WINDOWS\\system32","C:\\WINDOWS","C:\\WINDOWS\\System32\\Wbem","C:\\WINDOWS\\System32\\WindowsPowerShell\\v1.0\\",...,"C:\\Program Files\\Git\\cmd",...,"C:\\ghcup\\bin"]

我编辑了与问题无关的路径输出部分。显然,这里没有提到 MSys 目录。同样显然,没有找到 sh.exe,尽管它在我期望的位置:

C:\Users\Michael\source\repos\xilinx>dir c:\ghcup\msys64\usr\bin\sh.exe
 Datenträger in Laufwerk C: ist Windows
 Volumeseriennummer: xxxx-xxxx

 Verzeichnis von c:\ghcup\msys64\usr\bin

19.05.2021  07:47         2.201.842 sh.exe
               1 Datei(en),      2.201.842 Bytes
               0 Verzeichnis(se), ??.???.???.??? Bytes frei
haskell-stack
1个回答
0
投票

这是 Stack 的一个已知问题,自撰写此答案以来已得到修复。在windows中,环境变量名是不区分大小写的,但是stack使用的基础库“rio”在查找环境变量时并没有忽略大小写。在某些情况下,程序路径环境变量称为

Path
,而不是
PATH
。这是观察到问题的系统的情况:

C:\Users\Michael\source\repos\dummy>set | findstr /i path
HOMEPATH=\Users\Michael
Path=C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\WindowsPowerShell\v1.0\;...;C:\ghcup\bin
PATHEXT=.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC
PSModulePath=C:\Program Files\WindowsPowerShell\Modules;C:\WINDOWS\system32\WindowsPowerShell\v1.0\Modules

在这种情况下,stack 无法扩展 PATH 变量,因此 config.yaml 中正确的

extra-path
条目将被忽略。

要解决此问题,请使用 Windows 环境变量对话框调整系统范围路径变量的拼写。每个用户路径变量的拼写并不重要,因为首先应用系统路径,并且将用户路径条目合并到该变量中通过应用系统路径保持拼写设置。

© www.soinside.com 2019 - 2024. All rights reserved.