4

在安装 Shakespeare-js-1.0.2 时,将我的简单 Yesod 应用程序部署到 Heroku cabal 失败

Building shakespeare-js-1.0.2...
Building persistent-1.0.2.2...
Building yaml-0.8.2.1...
Building tls-extra-0.6.1...
Failed to install shakespeare-js-1.0.2
Last 10 lines of the build log ( /app//.cabal/logs/shakespeare-js-1.0.2.log ):
Building shakespeare-js-1.0.2...
Preprocessing library shakespeare-js-1.0.2...
[1 of 3] Compiling Text.Julius ( Text/Julius.hs, dist/build/Text/Julius.o )
[2 of 3] Compiling Text.Coffee ( Text/Coffee.hs, dist/build/Text/Coffee.o )
Text/Coffee.hs:56:7:
`preEscapeBegin' is not a (visible) field of constructor `PreConvert'
Text/Coffee.hs:57:7:
`preEscapeEnd' is not a (visible) field of constructor `PreConvert'

该项目是一个简单的网站,它使用 WAI 和 Warp 来打印一个 hello world。在我的 cabal 文件中,我只指定了最新版本的 yesod (1.1.9) 以查看它是否在 Heroku 上可用(它还没有使用 Yesod 或 Shakespeare-js):

executable Website
  extensions:NoImplicitPrelude
             TemplateHaskell
             QuasiQuotes
             OverloadedStrings
             CPP
             MultiParamTypeClasses
             TypeFamilies
             GADTs
             GeneralizedNewtypeDeriving
             FlexibleContexts
             EmptyDataDecls
             NoMonomorphismRestriction



  main-is:             source/Main.hs
  -- other-modules:       
  build-depends:       base          == 4.5.*
                     , http-types   
                     , template-haskell 
                     , wai           
                     , wai-extra     
                     , warp          
                     , yesod         == 1.1.9

这个项目在我的虚拟机上本地构建和运行,具有类似的堆栈,包括shakespeare-js-1.0.2。

我尝试了以下方法:

  • 在 .cabal 文件中强制使用 1.0.2 以外的更新或旧版本的 Shakespeare-js。出现相同的编译错误。
  • 作为一个在黑暗中的镜头,我尝试从 .cabal 文件中删除一些可能影响编译的扩展,例如 TemplateHaskell。

编辑:

  • 当我使用shakespeare-js < 1.0.2 时,在heroku 选择1.0.1 后出现编译错误,它也无法编译。
  • 我无法让shakespeare-js-1.1.2(最新版本)在任何地方编译,甚至在本地编译。

我通过强制shakespeare < 1.0.3 解决了错误这并不能解决无法编译最新版本的shakespeare 的问题(是的)。

4

1 回答 1

2

问题是类型在和PreConvert之间发生了变化。shakespeare-1.0.2shakespeare-1.0.3

在旧版本中,preEscapeBeginpreEscapeEnd是构造函数的字段PreConvert,但在版本 1.0.3 中已被删除。

所以解决方案是

  • 使用旧版本的shakespeare, 指定shakespeare < 1.0.3
  • 使用足够新的版本shakespeare-js,指定shakespeare-js >= 1.1.2.

(如果您使用较新的版本,可能需要进一步调整shakespeare,我没有尝试过。)

于 2013-02-23T19:12:13.350 回答