评测任务
添加文件

添加文件

添加文件是一种动作任务,能够按照用户的参数向根文件夹中保存一些必要的文件。目前,此动作任务为用户提供了多种添加文件的方法。

内联纯文本

使用 plain 属性来传入纯文本字符串。Seele 会将字符串的内容写入指定的文件中。

下面的例子通过内联纯文本添加两个源文件 main.hmain.c

steps:
  prepare:
    action: "seele/add-files@1"
    files:
      - path: "main.h"
        plain: |
          extern int power;
 
      - path: "main.c"
        plain: |
          #include <stdio.h>
          #include "main.h"
 
          int power = 114514;
 
          int main(void) {
            printf("Power: %d\n", power);
            return 0;
          }
⚠️

不建议使用内联纯文本传递用户提交的源代码等文件,因为 YAML 并不支持承载一些特殊字符。此外,Seele 也会拒绝处理非 UTF-8 编码的纯文本。在这些情况下,使用内联 Base64 文本或 HTTP URL 是更好的选择。

内联 Base64 文本

使用 base64 属性来传入 Base64 文本字符串。Seele 会对 Base64 文本进行解码,将得到的数据写入指定的文件中。

Seele 仅接受不含 Padding 的 Base64 文本。如果传入含 Padding 的 Base64 文本会导致报错。

下面的例子通过内联 Base64 文本添加两个源文件 main.hmain.c。Seele 会对 Base64 文本进行解码,将二进制数据直接存入文件中。

steps:
  prepare:
    action: "seele/add-files@1"
    files:
      - path: "main.h"
        base64: "ZXh0ZXJuIGludCBwb3dlcjs"
      - path: "main.c"
        base64: "I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlICJtYWluLmgiCgppbnQgcG93ZXIgPSAxMTQ1MTQ7CgppbnQgbWFpbih2b2lkKSB7CiAgcHJpbnRmKCJQb3dlcjogJWRcbiIsIHBvd2VyKTsKICByZXR1cm4gMDsKfQ"

HTTP URL

使用 url 属性来传入 HTTP URL 字符串。Seele 会使用内置的 HTTP 客户端向两个 URL 发送 GET 请求,将得到的响应写入指定的文件中。

下面的例子通过 HTTP URL 添加两个源文件 main.hmain.c

steps:
  prepare:
    action: "seele/add-files@1"
    files:
      - path: "main.h"
        url: "http://darkyzhou.net/main.h"
      - path: "main.c"
        url: "http://darkyzhou.net/main.c"
暂不支持身份验证、下载 HTTPS URL。

在默认情况下,添加文件任务会尝试使用 HTTP 响应头中的协商缓存头来将下载的文件缓存到内存中,这样能够加速后续评测任务对相同文件的下载。详见添加文件的配置项

本地文件

使用 local 属性来传入一个指向本地文件的绝对路径字符串。Seele 会将指定文件进行拷贝。

当在 Docker 或 Kubernetes 的容器中运行 Seele 时,请确保将相关文件挂载到了容器文件系统中

下面的例子将本地文件 /tmp/foo.txt 添加到提交根文件夹中。

steps:
  prepare:
    action: "seele/add-files@1"
    files:
      - path: "foo.txt"
        local: "/tmp/foo.txt"