无法编译 yesod,hGetContents 参数无效
cannot compile yesod, hGetContents invalid argument
我正在尝试创建 Yesod 项目,但无法完成 1st 步骤。
以下是我初始化和构建的步骤:
$ stack new someproj yesodweb/postgres
$ cd someproj
$ stack build
我没有做任何额外的编码,只是使用样板,在构建时出现以下编译错误。
language-javascript > configure
language-javascript > Configuring language-javascript-0.7.1.0...
language-javascript > build
language-javascript > Preprocessing library for language-javascript-0.7.1.0..
language-javascript > happy: src/Language/JavaScript/Parser/Grammar7.y:
hGetContents: invalid argument (invalid byte sequence)
.
.
.
-- While building package language-javascript-0.7.1.0
(scroll up to its section to see the error) using:
/root/.stack/setup-exe-cache/x86_64-linux-tinfo6/Cabal-simple_mPHDZzAJ_3.0.1.0_ghc-8.8.4
--builddir=.stack-work/dist/x86_64-linux-tinfo6/Cabal-3.0.1.0 build
--ghc-options " -fdiagnostics-color=always"
Process exited with code: ExitFailure 1
我在 fedora 上,我正在使用堆栈 2.7.3
我已经为此工作了 2 天,但仍然无法编译。
任何人对问题是什么有一些见解?
(或者 Haskell 和 Yesod 还不成熟,还没有准备好投入生产?)
好吧,我们再试一次...
简短回答: 在 stack build
之前,将编码设置为 en_US.UTF-8
或任何其他支持 UTF-8 的编码,system-wide 通过编辑 /etc/locale.conf
:
# /etc/locale.conf
LANG=en_US.UTF-8
或在 shell 中设置:
$ export LANG=en_US.UTF-8
$ cd someproj
$ stack build
详细说明: 看来您 运行 遇到了 no one ... will accept ... responsibility.
的错误
包language-javascript
中的文件Grammar7.y
包含单个UTF-8字符,因此需要Happy解析器使用UTF-8编码读取。但是,默认情况下,Happy 使用区域设置的系统编码读取其输入文件,Happy 的人认为这是正确的行为。
Cabal 和 Stack 都应该在本地机器上可靠地构建从 Internet 下载的源包,因此它们应该通过使用编码的编码读取源文件来构建包源文件,而不是来自本地计算机语言环境的编码。
对于 Haskell 源文件,没有问题,因为 GHC 忽略任何系统编码并将所有源文件读取为 UTF-8 编码。这是 compiler/interpreter/language-standard/etc 的明智之举。在我们 Internet-connected 时代要做的事情——要么为所有源文件指定固定编码(例如 GHC,Python),要么提供一种机制来指定文件本身的编码(例如 HTML、LaTeX 等)。
由于 Grammar7.y
是一个 Happy 文件,并且 Happy 的人选择了 non-sensible 方法,因此 Stack 或 Cabal 将确保 -- 在构建过程中 -- non-Haskell 使用正确的编码读取源文件。他们可以通过命令 Stack 和 Cabal 始终构建系统编码覆盖为 UTF-8 的包,或者通过在 xxx.cabal
文件中提供一些机制来指定包的编码并将其设置在 per-package 基础。不幸的是,两组开发人员都不想承担这个责任。
所以,我们陷入了一个荒谬的境地,Stack 只能在系统区域设置为 UTF-8 编码时可靠地构建包,但 Stack 开发人员认为 Stack 不应该在构建过程中覆盖系统区域设置以确保它配置为 UTF-8 编码。
我正在尝试创建 Yesod 项目,但无法完成 1st 步骤。
以下是我初始化和构建的步骤:
$ stack new someproj yesodweb/postgres
$ cd someproj
$ stack build
我没有做任何额外的编码,只是使用样板,在构建时出现以下编译错误。
language-javascript > configure
language-javascript > Configuring language-javascript-0.7.1.0...
language-javascript > build
language-javascript > Preprocessing library for language-javascript-0.7.1.0..
language-javascript > happy: src/Language/JavaScript/Parser/Grammar7.y:
hGetContents: invalid argument (invalid byte sequence)
.
.
.
-- While building package language-javascript-0.7.1.0
(scroll up to its section to see the error) using:
/root/.stack/setup-exe-cache/x86_64-linux-tinfo6/Cabal-simple_mPHDZzAJ_3.0.1.0_ghc-8.8.4
--builddir=.stack-work/dist/x86_64-linux-tinfo6/Cabal-3.0.1.0 build
--ghc-options " -fdiagnostics-color=always"
Process exited with code: ExitFailure 1
我在 fedora 上,我正在使用堆栈 2.7.3
我已经为此工作了 2 天,但仍然无法编译。 任何人对问题是什么有一些见解? (或者 Haskell 和 Yesod 还不成熟,还没有准备好投入生产?)
好吧,我们再试一次...
简短回答: 在 stack build
之前,将编码设置为 en_US.UTF-8
或任何其他支持 UTF-8 的编码,system-wide 通过编辑 /etc/locale.conf
:
# /etc/locale.conf
LANG=en_US.UTF-8
或在 shell 中设置:
$ export LANG=en_US.UTF-8
$ cd someproj
$ stack build
详细说明: 看来您 运行 遇到了 no one ... will accept ... responsibility.
的错误包language-javascript
中的文件Grammar7.y
包含单个UTF-8字符,因此需要Happy解析器使用UTF-8编码读取。但是,默认情况下,Happy 使用区域设置的系统编码读取其输入文件,Happy 的人认为这是正确的行为。
Cabal 和 Stack 都应该在本地机器上可靠地构建从 Internet 下载的源包,因此它们应该通过使用编码的编码读取源文件来构建包源文件,而不是来自本地计算机语言环境的编码。
对于 Haskell 源文件,没有问题,因为 GHC 忽略任何系统编码并将所有源文件读取为 UTF-8 编码。这是 compiler/interpreter/language-standard/etc 的明智之举。在我们 Internet-connected 时代要做的事情——要么为所有源文件指定固定编码(例如 GHC,Python),要么提供一种机制来指定文件本身的编码(例如 HTML、LaTeX 等)。
由于 Grammar7.y
是一个 Happy 文件,并且 Happy 的人选择了 non-sensible 方法,因此 Stack 或 Cabal 将确保 -- 在构建过程中 -- non-Haskell 使用正确的编码读取源文件。他们可以通过命令 Stack 和 Cabal 始终构建系统编码覆盖为 UTF-8 的包,或者通过在 xxx.cabal
文件中提供一些机制来指定包的编码并将其设置在 per-package 基础。不幸的是,两组开发人员都不想承担这个责任。
所以,我们陷入了一个荒谬的境地,Stack 只能在系统区域设置为 UTF-8 编码时可靠地构建包,但 Stack 开发人员认为 Stack 不应该在构建过程中覆盖系统区域设置以确保它配置为 UTF-8 编码。