我可以在我的应用程序中自动嵌入 pandoc 的默认模板吗?
Can I automatically embed pandoc's default templates in my application?
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的模板文件吗?
事实证明,pandoc
在构建期间通过 hsb2hs
注入了它的数据文件。不知何故,在 stack build
期间该步骤失败了,我错过了错误消息。
hsb2hs
及其主要依赖项 processing-tools
都不是 stack 的 LTS 的一部分,它们仅在 nightly stackage 版本中。 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
的一部分,因此它确实包含在二进制文件中。
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的模板文件吗?
事实证明,pandoc
在构建期间通过 hsb2hs
注入了它的数据文件。不知何故,在 stack build
期间该步骤失败了,我错过了错误消息。
hsb2hs
及其主要依赖项 processing-tools
都不是 stack 的 LTS 的一部分,它们仅在 nightly stackage 版本中。 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
的一部分,因此它确实包含在二进制文件中。