项目脚本
概述
许多更复杂的项目需要定期进行额外的处理(例如数据导入和准备),甚至在每次渲染之前/之后也需要进行处理。项目脚本是一种将这些处理纳入工作流程的方式。
定期脚本
您可以使用 quarto run
命令来运行 TypeScript、R、Python 或 Lua 脚本。例如:
终端
quarto run import.py
quarto run
可用的脚本解释器包括:
语言 | 解释器 |
---|---|
TypeScript | Deno(嵌入在 Quarto 中) |
Python | PATH 中的 Python(或在 Windows 上的 启动器) |
R | PATH 中的 Rscript |
Lua | Lua 5.3(嵌入在 Pandoc 中) |
使用 TypeScript 或 Lua 可以创建无需额外安装要求的脚本。另一方面,如果您的项目已经在使用 Python 或 R,那么使用这些语言的脚本可能更为方便。
如果您使用的是 TypeScript,请务必查阅下面的 Deno 脚本 部分,以获取有关 Deno 标准库和导入外部脚本的更多详细信息。
预渲染和后渲染
您可以使用 pre-render
和 post-render
项目选项来安排一个或多个脚本在每次渲染之前和/或之后执行。例如:
project:
type: website
pre-render: prepare.py
post-render:
- compress.ts
- fix-links.py
请注意,pre-render
和 post-render
也支持任意 shell 命令。因此,例如,您可以使用 make
来进行数据准备:
project:
type: website
pre-render: make prepare
预渲染和后渲染脚本在主项目目录中运行。
以下环境变量会传递给预渲染和后渲染脚本(请注意,所有路径都是相对于主项目目录的相对路径):
变量 | 描述 |
---|---|
QUARTO_PROJECT_RENDER_ALL |
如果这是对项目中所有文件的渲染(而不是增量渲染或预览渲染),则设置为 “1”。如果 Quarto 没有渲染所有文件,则未设置。 |
QUARTO_PROJECT_OUTPUT_DIR |
输出目录 |
QUARTO_PROJECT_INPUT_FILES |
所有正在渲染的输入文件的换行符分隔列表(仅传递给 pre-render ) |
QUARTO_PROJECT_OUTPUT_FILES |
所有已渲染的输出文件的换行符分隔列表(仅传递给 post-render )。 |
在任何预渲染脚本执行后,项目元数据和渲染列表将被重新计算,允许它们修改此项目数据。 例如,预渲染脚本可能会生成额外的 qmd
文件或 ipynb
文件,这些文件应该被渲染。
请注意,预渲染脚本不能修改项目目录、输出目录或项目类型。 如果预渲染脚本修改了这些值中的任何一个,将返回错误并且渲染将失败。
如果您有一个昂贵的 pre-render
步骤,您可能只想在渲染整个项目时运行它。以下是如何在各种支持的脚本语言中执行此操作:
if (!Deno.env.get("QUARTO_PROJECT_RENDER_ALL")) {
.exit();
Deno }
import os
if not os.getenv("QUARTO_PROJECT_RENDER_ALL"):
exit()
if (!nzchar(Sys.getenv("QUARTO_PROJECT_RENDER_ALL"))) {
quit()
}
if not os.getenv("QUARTO_PROJECT_RENDER_ALL") then
os.exit();
end
Deno 脚本
如果您想使用 TypeScript 创建项目脚本,quarto run
使您能够使用 Quarto 捆绑的 Deno TypeScript 解释器。此解释器还包括完整的 Deno 标准库。例如,要使用 Deno YAML 解析器,您可以这样做:
import { parse } from "https://deno.land/std/yaml/mod.ts";
const config = parse(Deno.readTextFileSync("_quarto.yml"));
上述对 Deno encoding
库的引用使用了 URL:需要注意的是,尽管如此,该库并不会从远程服务器下载(实际上,Quarto Deno 解释器完全禁用了从远程服务器导入的功能)。相反,Deno 标准库是与 Quarto 一起打包的,使得标准库的 URL 在离线缓存中可用。
你可能会遇到一些示例代码,它们在 Deno 库导入中直接嵌入了版本号。例如:
import { format } from "https://deno.land/std@0.119.0/datetime/mod.ts";
这些带有版本号的导入在 Quarto 中将无法工作(因为其本地标准库缓存中填充的是无版本号的 URL)。因此,上述导入的正确形式应为:
import { format } from "https://deno.land/std/datetime/mod.ts";
你还可能会看到一些 Deno 代码示例,它们直接从 URL 导入第三方库。如上所述,这种功能在 Quarto Deno 脚本中是不可用的。相反,你应该下载任何你希望使用的第三方库,将其与你的项目源代码一起包含,并使用相对文件路径进行导入。