在 Julia 中从模板创建脚本

Creating Scripts from a Template in Julia

我有一个文本文件 - 这是一个模板,我想将其更改并另存为另一个文件(在本例中为 markdown 文件,但这并不重要):

my_test.txt:

---
title: My report
---

$my_var

如您所见,有一个占位符 $my_var - 我想将文件作为字符串读入,然后将其放入变量 my_var 的值。我该怎么做?

我已经尝试过一些解决方法:

using Chain

my_var = "some string"

@chain begin
    read("my_test.txt", String) # read the text file as a string
    "\"\"\"" * _ * "\"\"\"" # wrap the string with triple quotes
    Meta.parse # parse...
    eval # ...and eval
    write_to_file("reports/jmd_files/org_$(org_id).jmd") # write it to a markdown file
end

虽然它不起作用。我尝试了很多变体,但我要么收到一条错误消息 my_var does not exist,要么插入的值是 nothing(这不是它应该是的值。

所以,这看起来确实与执行环境有关,但我无法弄清楚问题所在。


它不应该很重要,但只是为了确定 - 最终希望它 运行 在循环中或在(待广播的)函数中。因此,对单个示例进行硬编码并不是真正的解决方案。

实际上不是您问题的答案,但是..您确定要这样做吗?您所描述的内容看起来像是在创建一个动态文档,但是已经有很多包可以做到这一点。 例如,Documenter.jl and Weave.jl 都采用嵌入了 Julia 脚本的 markdown 文档,并设计为 运行 文档并将其编译为 HTML 或显示脚本或其输出(您选择)的 PDF 页面。

我更喜欢更进一步,我从一个(有效的)Julia 脚本开始,其中 markdown 结构嵌入了一个额外的注释层(例如 # ## This would be an H2 header),然后使用 Literate.jl 进行转换它带有嵌入式 Julia 和 Documenter.jl 的降价,以创建一个可导航的网站。 这些软件包有很多选项,可以轻松地与 CI 集成,例如 GitHub 操作。

您似乎正在寻找像 Mustache.jl 这样的文本模板引擎。例如:


using Mustache 

function createscript()
  vars = Dict("my_var" => "some string")
  # Doesn't have to be a Dict - see the docs for other 
  # options eg. a module name can be passed 
  # to grab variables from it

  open("data/rendered.jmd", "w") do out
    render(out, read("data/reporttemplate.mustache", String), vars)
  end
end

reporttemplate.mustache 包含:

---
title: My report
---

{{my_var}}

使用 text-templating 引擎比 eval 更安全且更不容易出错。