【问题标题】:How to use a local file as crate logo when generating rustdoc?生成 rustdoc 时如何使用本地文件作为 crate 徽标?
【发布时间】:2021-08-13 22:01:23
【问题描述】:

可以使用以下命令同时设置 rustdoc 的 favicon 和 logo:

  • #![doc(html_favicon_url = "<url_to>/favicon.ico")]
  • #![doc(html_logo_url = "<url_to>/logo.png")]

如文档所述here。

但我不想公开上传我的徽标,因此想自动将这些文件包含在 /target/doc 中并从那里引用它们。

目前我已将相应的数据 url(base64 编码)放入这些字段中,它工作正常,但它极大地膨胀了设置这些属性的源文件。

我知道我可以在使用脚本生成文档后将图像复制到 target/doc,然后使用相对 url 引用它们,但我想避免这种情况,这样我仍然可以使用 @987654329 生成文档@。

编辑

评论中关于在.cargo/config.toml 中使用rustdocflags 设置rustdoc 的--output 标志的建议也不起作用,因为它导致error: Option 'output' given more than once。除此之外,它不适合我,因为(至少据我所知)我只能在那里给出绝对路径,而我需要使用图像的相对路径的解决方案,因为我将这些图像存储在cargo 根目录的子目录,方便使用 git 等转移到另一个系统。

【问题讨论】:

  • "但我想避免这种情况,这样我仍然可以使用cargo doc"生成文档——也许您可以再详细说明一下?将两个动作包装在一起的脚本或cargo 命令是否不够?
  • 如果我将这两个动作都放在一个脚本中,我将不得不运行我认为不理想的脚本(例如 ./myscript.sh),因为对于这个特定的项目,我必须记住这一点我无法像往常一样使用cargo doc 生成文档。
  • 您可以创建一个脚本,将其参数转发给rustdoc,然后将所需的静态资产复制到生成的输出文件夹中;然后通过项目根目录中.cargo/config.toml 中的build.rustdoc 设置配置Cargo 以使用该脚本。
  • @eggyal build.rustdoc 听起来很有趣。我尝试提供我的 bash 脚本,但似乎只允许执行可执行文件(至少在 Windows 上),因为我现在收到错误 %1 is not a valid Win32 application. (os error 193)。我可能会创建一个小的可执行文件来执行此操作,但我不确定这是否值得麻烦,因为这样我也可以只保留 base64 编码的图像(特别是考虑到我也需要将可执行文件添加到 git)。 ..
  • 明确地说,这个想法是将生成的 rustdoc 输出到已经包含图像的位置,以便图像的相对路径能够成功。无论如何,我现在认为将图像复制到目标目录的build script 实际上可能是您最好的选择。

标签: rust rust-cargo rustdoc cargo-doc


【解决方案1】:

感谢 eggyal 的最新评论,我终于想出了如何做到这一点:

在我的build.rs 中,我将文件复制到target/doc/:

fn main() {
    // Copy the images to the output when generating documentation
    println!("cargo:rerun-if-changed=assets/doc");
    std::fs::copy("assets/doc/logo.ico", "target/doc/logo.ico").expect("Failed to copy crate favicon when building documentation.");
    std::fs::copy("assets/doc/logo.png", "target/doc/logo.png").expect("Failed to copy crate logo when building documentation.");
}

然后我只需要确保在引用它们时使用绝对路径,如下所示:

#![doc(html_favicon_url = "/logo.ico")]
#![doc(html_logo_url = "/logo.png")]

通常最好读取CARGO_TARGET_DIR 环境变量而不是硬编码target/doc,但这是构建脚本中的not yet available。

【讨论】:

  • 您可能想要使用 env(OUT_DIR) 而不是硬编码“target/doc”。
  • 另外,我认为您的 rerun-if-changed 不正确。 target/doc 仅由构建更改,在构建脚本运行之后。您应该将其指向您的资产目录,以便重新运行构建脚本并将图像重新复制到输出目录(如果 它们 已更改)。
  • 好吧,但是如果我没记错的话,它们不会在货物清理后被复制吗?
  • 货物清洁后一切都会重新运行。
  • 啊,我明白了。谢谢
猜你喜欢
  • 2019-01-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-09
  • 1970-01-01
相关资源
最近更新 更多