Pandoc附带了几个default templates,它们与pandoc
包一起发布。但是,如果我编写一个使用pandoc
作为库的应用程序,那么这些默认模板不会包含在二进制文件中。我仍然可以在我的机器上使用它们:
module Main where
import Text.Pandoc (getDefaultTemplate)
main = getDefaultTemplate Nothing "latex" >>= print
这将打印default.latex
模板。但是,它不可移植,因为它实际上是指我系统中的某个文件:
$ cd path/to/example/project
$ stack build
$ scp path/to/binary remote:remote/path
$ ssh remote:remote/path/binary
example: Could not find data file /home/Zeta/.stack/snapshots/.../pandoc-1.16.0.2/data/templates/default.latex
由于pandoc's debian package不包含这些文件,因此它可以以某种方式嵌入它们。事实上,有一面旗帜-f embed_data_files
。我尝试在本地stack.yaml
中启用它:
extra-deps: [pandoc-1.16]
flags:
pandoc:
embed_data_files: true
但是这没有改变任何东西,编译的二进制文件仍然抱怨缺少数据文件。
那么,有没有办法自动包含pandoc的模板文件?
答案 0 :(得分:3)
事实证明pandoc
在构建期间通过hsb2hs
注入了数据文件。不知何故,stack build
期间该步骤失败,我错过了错误消息。
hsb2hs
及其主要依赖项processing-tools
都不是堆栈LTS的一部分,它们只在夜间堆栈版本中。 stack.yaml
的以下添加修复了问题:
# part of stack.yaml:
extra-deps:
- preprocessor-tools-1.0.1
- hsb2hs-0.3.1
- pandoc-1.16
flags:
pandoc:
embed_data_files: true
对于那些使用Cabal的人来说,这有点等于
cabal sandbox init
cabal update
cabal install hsb2hs-0.3.1 && cabal install pandoc-1.16 -f embed_data_files
cabal install --dependencies-only
cabal build
以下是我验证模板实际包含的方式:
$ stack build
$ grep "usepackage\{hyperref\}" .stack-work/install/*/bin/example -a
\usepackage[$for(geometry)$$geometry$$sep$,$endfor$]{geometry}
$endif$
\usepackage{hyperref}
$if(colorlinks)$
\PassOptionsToPackage{usenames,dvipsnames}{color} % color is loaded by hyperref
该代码段是default.latex
的一部分,因此它实际上包含在二进制文件中。