添加文件
添加文件是一种动作任务,能够按照用户的参数向根文件夹中保存一些必要的文件。目前,此动作任务为用户提供了多种添加文件的方法。
内联纯文本
使用 plain
属性来传入纯文本字符串。Seele 会将字符串的内容写入指定的文件中。
下面的例子通过内联纯文本添加两个源文件 main.h
和 main.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.h
和 main.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.h
和 main.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"
在默认情况下,添加文件任务会尝试使用 HTTP 响应头中的协商缓存头来将下载的文件缓存到内存中,这样能够加速后续评测任务对相同文件的下载。详见添加文件的配置项。
本地文件
使用 local
属性来传入一个指向本地文件的绝对路径字符串。Seele 会将指定文件进行拷贝。
当在 Docker 或 Kubernetes 的容器中运行 Seele 时,请确保将相关文件挂载到了容器文件系统中
下面的例子将本地文件 /tmp/foo.txt
添加到提交根文件夹中。
steps:
prepare:
action: "seele/add-files@1"
files:
- path: "foo.txt"
local: "/tmp/foo.txt"