项目脚本

概述

许多更复杂的项目需要定期进行额外的处理(例如数据导入和准备),甚至在每次渲染之前/之后也需要进行处理。项目脚本是一种将这些处理纳入工作流程的方式。

定期脚本

您可以使用 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-renderpost-render 项目选项来安排一个或多个脚本在每次渲染之前和/或之后执行。例如:

project:
  type: website
  pre-render: prepare.py
  post-render: 
    - compress.ts
    - fix-links.py

请注意,pre-renderpost-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")) {
  Deno.exit();
}
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 脚本中是不可用的。相反,你应该下载任何你希望使用的第三方库,将其与你的项目源代码一起包含,并使用相对文件路径进行导入。