我正在嘗試創建一個 Yesod 專案,但第一步無法完成。
以下是我初始化和構建的步驟:
$ 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 還不夠成熟,還沒有準備好投入生產?)
uj5u.com熱心網友回復:
好吧,讓我們再試一次……
簡短回答: 在 之前stack build,將您的編碼設定為en_US.UTF-8或任何其他啟用 UTF-8 的編碼,在系統范圍內通過編輯/etc/locale.conf:
# /etc/locale.conf
LANG=en_US.UTF-8
或通過將其設定在外殼中:
$ export LANG=en_US.UTF-8
$ cd someproj
$ stack build
長解釋: 看起來你遇到了一個沒有人......不會接受......責任的錯誤。
Grammar7.y包中的檔案language-javascript包含單個 UTF-8 字符,因此需要由 Happy 決議器使用 UTF-8 編碼讀取。然而,默認情況下,Happy 使用本地環境中的系統編碼讀取其輸入檔案,Happy 人認為這是正確的行為。
Cabal 和 Stack 都應該在本地機器上可靠地構建從 Internet 下載的源包,因此它們應該通過使用源檔案的編碼讀取源檔案來構建包,而不是從本地機器的語言環境編碼。
對于 Haskell 源檔案,沒有問題,因為 GHC 會忽略任何系統編碼并將所有源檔案讀取為 UTF-8 編碼。這對于編譯器/解釋器/語言標準/等來說是明智的。在我們聯網的時代要做的事情——要么為所有源檔案(例如,GHC、Python)指定一個固定的編碼,要么提供一種機制來指定檔案本身的編碼(例如,HTML、LaTeX 等)。
因為Grammar7.y是一個 Happy 檔案,而 Happy 人選擇了不明智的方法,所以 Stack 或 Cabal 都需要確保——在構建程序中——非 Haskell 源檔案以正確的編碼讀取。他們可以通過命令 Stack 和 Cabal 將始終構建系統編碼覆寫為 UTF-8 的包來做到這一點,或者通過在xxx.cabal檔案中提供一些機制來指定包的編碼并在每個包的基礎上進行設定。不幸的是,兩個開發人員都不想承擔這個責任。
因此,我們陷入了一個荒謬的境地,即 Stack 只能在系統語言環境配置為 UTF-8 編碼時可靠地構建包,但 Stack 開發人員認為 Stack 不應該在構建期間覆寫系統語言環境以確保它被配置為 UTF -8 編碼。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/423019.html
標籤:
