快速,可配置,可扩展,灵活和美丽的衬里。滴定golint。 Revive提供了制定自定义规则的框架,并让您定义一个严格的预设,以增强开发和代码审查过程。
var-namingrevive作为图书馆go install github.com/mgechev/revive@latest或从“版本”页面中获取可执行文件的可执行文件。
您可以使用:
go install github.com/mgechev/revive@master由于revive的默认行为与golint兼容,而无需提供任何其他标志,因此您注意到的唯一区别是更快地执行。
revive支持一个-config标志,其值应与TOML文件相对应,该文件描述了用于revive的裁剪的哪些规则。如果没有提供, revive将尝试使用全局配置文件(假定位于$HOME/revive.toml )。否则,如果找不到配置TOML文件,则revive使用内置的一组默认覆盖规则。
必须安装卷才能与容器共享当前存储库。请参考绑定安装码头文档
docker run -v " $( pwd ) " :/var/ < repository > ghcr.io/mgechev/revive:v1.3.7 -config /var/ < repository > /revive.toml -formatter stylish ./var/kidle/...-v用于卷ghcr.io/mgechev/revive:v1.3.7是图像名称,其版本对应于revive命令如果您想与Bazel一起使用Revive,请查看Atlassian坚持的规则。
在VSCODE-GO中支持VSCODE。
通过文件观察者支持Goland。
通过Linter-Revive支持原子。
通过密集分析/啤酒支持VIM。
let g: ale_linters = {
' go ' : [ ' revive ' ],
}通过null-ls.nvim支持Neovim。
require ( " null-ls " ). setup ({
sources = {
require ( " null-ls " ). builtins . diagnostics . revive
},
})CODEAC.IO-自动代码审查服务与GitHub,Bitbucket和Gitlab(甚至是自我托管)集成在一起,并帮助您抵抗技术债务。自动检查您的拉值重新要求。 (免费用于开源项目)
要在golangci-lint中启用revive ,您需要将revive添加到已启用的Linters列表中:
# golangci-lint configuration file
linters :
enable :
- revive然后,可以通过将条目添加到配置的linters-settings部分来配置revive ,例如:
# golangci-lint configuration file
linters-settings :
revive :
ignore-generated-header : true
severity : warning
rules :
- name : atomic
- name : line-length-limit
severity : error
arguments : [80]
- name : unhandled-error
arguments : ["fmt.Printf", "myFunction"]上面的配置实现了三个revive规则:原子,线长度限制和未经处理的错误,并将一些参数传递给最后两个参数。本文档的配置部分提供了有关如何配置revive的详细信息。请注意,虽然revive配置是在TOML中, golangci-lint的配置位于YAML中。
请注意,如果没有提供特定的配置, revive将像go-lint一样行事,即启用了所有go-lint规则(可用规则表详细信息详细信息是什么是go-lint规则)。提供配置后,仅启用配置中的规则。
revive接受以下命令行参数:
-config [PATH] - 以toml格式的配置文件的路径,默认为$HOME/revive.toml (如果存在)。
-exclude [PATTERN] - 文件/目录/软件包的模式被排除在外。您可以指定要排除的文件作为包装名称(即github.com/mgechev/revive ),将它们列为单个文件(即file.go ),目录(即./foo/... )或三个组合的任何组合。如果未指定排除模式,则默认情况下将排除vendor/...
-formatter [NAME] - 用于输出的格式。当前可用的格式是:
default - 将以与golint相同的方式输出故障。json以JSON格式输出故障。ndjson将故障输出为Newline划界JSON(NDJSON)格式的流。friendly - 发现时输出故障。显示了所有失败的摘要。stylish - 格式化桌子中的故障。请记住,它不会流式传输输出,因此与其他输出相比,它可能被认为较慢。checkstyle输出与Java CheckStyle兼容的XML格式的故障。 -max_open_files同时开放文件的最大数量。默认为无限。
-set_exit_status将退出状态设置为1,如果发现任何问题,则在配置中覆盖errorCode和warningCode 。
- -version获取Revive版本。
revive -config revive.toml -exclude file1.go -exclude file2.go -formatter friendly github.com/mgechev/revive package/...revive.toml的配置revive将忽略file1.go和file2.gofriendly格式格式github.com/mgechev/revive和package中的文件使用注释,您可以禁用整个文件或一系列行的衬里:
//revive:disable
func Public () {}
//revive:enable上面的片段将禁用复兴之间的revive revive:disable和revive:enable评论。如果跳过revive:enable ,则将禁用文件的其余部分。
通过revive:disable-next-line和revive:disable-line您可以在特定代码线上禁用revive 。
您可以在规则级别上执行相同的操作。如果您只想禁用特定规则,则可以使用:
//revive:disable:unexported-return
func Public () private {
return private
}
//revive:enable:unexported-return这样, revive就不会警告您您正在从导出功能中返回未出现类型的对象。
您可以通过在指令中添加尾随文本来记录为什么禁用Linter的原因,例如
//revive:disable Until the code is stable //revive:disable:cyclomatic High complexity score but easy to understand您还可以通过添加revive
[ directive . specify-disable-reason ]在配置中。您可以设置违反此指令的严重性(默认警告)
[ directive . specify-disable-reason ]
severity = " error "revive可以使用TOML文件配置。这是一个示例配置,并说明了各个属性:
# When set to false, ignores files with "GENERATED" header, similar to golint
ignoreGeneratedHeader = true
# Sets the default severity to "warning"
severity = " warning "
# Sets the default failure confidence. This means that linting errors
# with less than 0.8 confidence will be ignored.
confidence = 0.8
# Sets the error code for failures with the "error" severity
errorCode = 0
# Sets the error code for failures with severity "warning"
warningCode = 0
# Configuration of the `cyclomatic` rule. Here we specify that
# the rule should fail if it detects code with higher complexity than 10.
[ rule . cyclomatic ]
arguments = [ 10 ]
# Sets the severity of the `package-comments` rule to "error".
[ rule . package-comments ]
severity = " error "默认情况下, revive将仅启用配置文件中命名的覆盖规则。例如,以前的配置文件使得revive以启用循环和包装刺激规则。
为了启用所有可用规则,您需要添加:
enableAllRules = true无论配置文件中命名哪些规则,这都将启用所有可用的规则。
要禁用规则,您只需将其标记为在配置中的禁用。例如:
[ rule . line-length-limit ]
Disabled = true启用所有规则时,您仍然需要/可以为规则提供特定的配置。以下文件是启用所有规则的示例配置,除了明确禁用的规则外,并且某些规则配置了特定参数:
severity = " warning "
confidence = 0.8
errorCode = 0
warningCode = 0
# Enable all available rules
enableAllRules = true
# Disabled rules
[ rule . blank-imports ]
Disabled = true
[ rule . file-header ]
Disabled = true
[ rule . max-public-structs ]
Disabled = true
[ rule . line-length-limit ]
Disabled = true
[ rule . function-length ]
Disabled = true
[ rule . banned-characters ]
Disabled = true
# Rule tuning
[ rule . argument-limit ]
Arguments = [ 5 ]
[ rule . cyclomatic ]
Arguments = [ 10 ]
[ rule . cognitive-complexity ]
Arguments = [ 7 ]
[ rule . function-result-limit ]
Arguments = [ 3 ]
[ rule . error-strings ]
Arguments = [ " mypackage.Error " ]revive的默认配置可以在defaults.toml上找到。这将启用golint中可用的所有规则,并使用其默认配置(即它们在golint中的硬编码方式)。
revive -config defaults.toml github.com/mgechev/revive这将使用配置文件defaults.toml , default格式,并将通过github.com/mgechev/revive软件包运行。
revive -config config.toml -formatter friendly github.com/mgechev/revive这将使用config.toml , friendly格式化器,并将通过github.com/mgechev/revive软件包运行lint。
以下片段包含您可以在项目中使用的建议的revive配置:
ignoreGeneratedHeader = false
severity = " warning "
confidence = 0.8
errorCode = 0
warningCode = 0
[ rule . blank-imports ]
[ rule . context-as-argument ]
[ rule . context-keys-type ]
[ rule . dot-imports ]
[ rule . error-return ]
[ rule . error-strings ]
[ rule . error-naming ]
[ rule . exported ]
[ rule . increment-decrement ]
[ rule . var-naming ]
[ rule . var-declaration ]
[ rule . package-comments ]
[ rule . range ]
[ rule . receiver-naming ]
[ rule . time-naming ]
[ rule . unexported-return ]
[ rule . indent-error-flow ]
[ rule . errorf ]
[ rule . empty-block ]
[ rule . superfluous-else ]
[ rule . unused-parameter ]
[ rule . unreachable-code ]
[ rule . redefines-builtin-id ]您还可以为每个规则设置自定义排除。
这是全局-exclude程序ARG的替代方法。
ignoreGeneratedHeader = false
severity = " warning "
confidence = 0.8
errorCode = 0
warningCode = 0
[ rule . blank-imports ]
Exclude =[ " **/*.pb.go " ]
[ rule . context-as-argument ]
Exclude =[ " src/somepkg/*.go " , " TEST " ]您可以使用以下排除模式
src/pkg/mypkg/some.gosrc/**/*.pb.go~.(pb|auto|generated).go$TEST (与**/*_test.go相同)*和~模式排除所有文件(与禁用规则相同的效果)b。 "" (空)模式不包括什么注意:不要弄乱可在TOML文件的最高级别使用的
exclude,这意味着“排除软件包模式”,而不是“排除文件模式”
所有可用规则的列表。 golint移植的规则在golint列中保持不变并指示。
| 姓名 | config | 描述 | golint | 打字 |
|---|---|---|---|---|
context-keys-type | N/A。 | 在context.WithValue中删除基本类型的用法。 | 是的 | 是的 |
time-equal | N/A。 | 建议使用time.Time.Equal而不是==和!=用于平等检查时间。 | 不 | 是的 |
time-naming | N/A。 | 围绕时间变量命名的约定。 | 是的 | 是的 |
unchecked-type-assertions | N/A。 | 在不检查结果的情况下取消类型断言。 | 不 | 是的 |
var-declaration | N/A。 | 减少围绕变量声明的冗余。 | 是的 | 是的 |
unexported-return | N/A。 | 警告公众回报是从未出现的类型的。 | 是的 | 是的 |
errorf | N/A。 | 应该用errors.New(fmt.Sprintf()) fmt.Errorf() | 是的 | 是的 |
blank-imports | N/A。 | 取消空白导入 | 是的 | 不 |
context-as-argument | N/A。 | context.Context应该是函数的第一个参数。 | 是的 | 不 |
dot-imports | N/A。 | 禁止.进口。 | 是的 | 不 |
error-return | N/A。 | 错误返回参数应该是最后的。 | 是的 | 不 |
error-strings | []细绳 | 围绕错误字符串的约定。 | 是的 | 不 |
error-naming | N/A。 | 误差变量的命名。 | 是的 | 不 |
exported | []细绳 | 对出口符号的命名和评论惯例。 | 是的 | 不 |
if-return | N/A。 | 如果返回错误时,则冗余。 | 不 | 不 |
increment-decrement | N/A。 | 使用i++和i--代替i += 1而i -= 1 。 | 是的 | 不 |
var-naming | 允许列表和初始主义的区块列表 | 命名规则。 | 是的 | 不 |
package-comments | N/A。 | 包裹评论惯例。 | 是的 | 不 |
range | N/A。 | 在集合上迭代时,可以防止冗余变量。 | 是的 | 不 |
receiver-naming | 地图(可选) | 围绕接收者的命名。 | 是的 | 不 |
indent-error-flow | []细绳 | 防止冗余语句。 | 是的 | 不 |
argument-limit | int(默认为8) | 指定函数可以接收的最大参数数量 | 不 | 不 |
cyclomatic | int(默认为10) | 设置限制最大循环复杂性。 | 不 | 不 |
max-public-structs | int(默认为5) | 文件中的最大公共结构数量。 | 不 | 不 |
file-header | 字符串(默认为无) | 每个文件应具有的标题。 | 不 | 不 |
empty-block | N/A。 | 警告空代码块 | 不 | 是的 |
superfluous-else | []细绳 | 防止冗余语句(扩展indent-error-flow ) | 不 | 不 |
confusing-naming | N/A。 | 警告使用只有大写不同的名称的方法 | 不 | 不 |
get-return | N/A。 | 警告没有产生任何结果的Getters | 不 | 不 |
modifies-parameter | N/A。 | 警告分配到功能参数 | 不 | 不 |
confusing-results | N/A。 | 建议命名可能令人困惑的功能结果 | 不 | 不 |
deep-exit | N/A。 | 在main()或init()以外的其他功能中寻找程序退出 | 不 | 不 |
unused-parameter | N/A。 | 建议重命名或删除未使用的功能参数 | 不 | 不 |
unreachable-code | N/A。 | 警告无法到达的代码 | 不 | 不 |
add-constant | 地图 | 建议使用常数用于魔术数字和字符串文字 | 不 | 不 |
flag-parameter | N/A。 | 警告创建控件耦合的布尔参数 | 不 | 不 |
unnecessary-stmt | N/A。 | 建议删除或简化不必要的陈述 | 不 | 不 |
struct-tag | []细绳 | 检查常见的结构标签,例如json , xml , yaml | 不 | 不 |
modifies-value-receiver | N/A。 | 警告分配给有价值的方法接收器 | 不 | 是的 |
constant-logical-expr | N/A。 | 警告不断逻辑表达 | 不 | 不 |
bool-literal-in-expr | N/A。 | 建议从逻辑表达中删除布尔文字 | 不 | 不 |
redefines-builtin-id | N/A。 | 警告内置标识符的重新定义 | 不 | 不 |
function-result-limit | int(默认为3) | 指定函数可以返回的最大结果数 | 不 | 不 |
imports-blocklist | []细绳 | 禁止导入指定的软件包 | 不 | 不 |
range-val-in-closure | N/A。 | 警告是否在闭合中使用范围值作为goroutine | 不 | 不 |
range-val-address | N/A。 | 警告范围值的地址是否危险地使用 | 不 | 是的 |
waitgroup-by-value | N/A。 | 警告函数将同步组作为副价值参数 | 不 | 不 |
atomic | N/A。 | 检查sync/atomic包的常见错误用法 | 不 | 不 |
empty-lines | N/A。 | 警告何时在一个街区中出现新线或落后 | 不 | 不 |
line-length-limit | int(默认为80) | 指定行中的最大字符数 | 不 | 不 |
call-to-gc | N/A。 | 警告明确致电垃圾收集器 | 不 | 不 |
duplicated-imports | N/A。 | 寻找两次或多次导入的软件包 | 不 | 不 |
import-shadowing | N/A。 | 斑点标识符遮蔽了导入的 | 不 | 不 |
bare-return | N/A。 | 警告裸露的回报 | 不 | 不 |
unused-receiver | N/A。 | 建议重命名或删除未使用的方法接收器 | 不 | 不 |
unhandled-error | []细绳 | 警告函数呼叫返回的未手动错误 | 不 | 是的 |
cognitive-complexity | int(默认为7) | 设置限制以达到最大认知复杂性。 | 不 | 不 |
string-of-int | N/A。 | 警告从int到string的可疑铸件 | 不 | 是的 |
string-format | 地图 | 警告特定的字符串文字,这些文字失败了一个或多个用户配置的正则表达式 | 不 | 不 |
early-return | []细绳 | 斑点如果是然后倾斜谓词以减少嵌套的陈述 | 不 | 不 |
unconditional-recursion | N/A。 | 警告功能电话,这些呼叫将导致(直接)无限递归 | 不 | 不 |
identical-branches | N/A。 | 景点如果是与相同的分支then的else语句 | 不 | 不 |
defer | 地图 | 警告一些延期gotchas | 不 | 不 |
unexported-naming | N/A。 | 警告错误命名的未出口符号 | 不 | 不 |
function-length | int,int(默认为50个语句,75行)) | 警告超出语句或行最大线的功能 | 不 | 不 |
nested-structs | N/A。 | 警告结构内的结构 | 不 | 不 |
useless-break | N/A。 | 警告无用的break陈述,以防万一 | 不 | 不 |
banned-characters | []字符串(默认为[]字符串{}) | 检查标识符中禁止的字符 | 不 | 不 |
optimize-operands-order | N/A。 | 检查效率低下的条件表达式 | 不 | 不 |
use-any | N/A。 | 建议将interface{}替换为any | 不 | 不 |
datarace | N/A。 | 斑点潜在数据 | 不 | 不 |
comment-spacings | []细绳 | 警告畸形的评论 | 不 | 不 |
redundant-import-alias | N/A。 | 警告导入别名与导入的软件包名称匹配 | 不 | 不 |
import-alias-naming | 字符串或地图[String] String(默认值允许REGEX模式 ^[AZ] [A-Z0-9] {0,} $) | 围绕进口别名的命名。 | 不 | 不 |
enforce-map-style | 字符串(默认为“任何”) | 强制使用make(map[type]type)或map[type]type{}以进行映射初始化。不影响make(map[type]type, size)结构。 | 不 | 不 |
enforce-slice-style | 字符串(默认为“任何”) | 强制使用make([]type, 0)或[]type{}的一致用法用于切片初始化。不影响make(map[type]type, non_zero_len, or_non_zero_cap)构造。 | 不 | 不 |
enforce-repeated-arg-type-style | 字符串(默认为“任何”) | 为重复参数和/或返回值类型强制执行一致的样式。 | 不 | 不 |
max-control-nesting | int(默认为5) | 设置限制控制结构的最大嵌套。 | 不 | 不 |
comments-density | int(默认为0) | 执行最低评论 /代码关系 | 不 | 不 |
file-length-limit | 地图(可选) | 每个文件执行最大数量的行 | 不 | 不 |
filename-format | 正则表达(可选) | 执行文件名的格式 | 不 | 不 |
redundant-build-tag | N/A。 | 警告冗余// +build评论行 | 不 | 不 |
use-errors-new | N/A。 | 可以通过errors.New替换的fmt.Errorf调用点。 | 不 | 不 |
在这里,您可以找到如何配置一些现有规则:
var-naming该规则接受两片字符串,一个允许列表和初始主义的区块列表。默认情况下,该规则的行为完全像golint中的替代方案,但您可以选择放松(请参阅Golint/lint/essess/89)
[ rule . var-naming ]
arguments = [[ " ID " ], [ " VM " ]]这样,Revive不会警告称为customId标识符,但会警告customVm应称为customVM 。
本节列出了所有可用的格式化器,并为每个格式提供了一个屏幕截图。


默认的格式器与golint产生相同的输出。

普通的格式器产生与默认格式的输出相同的输出,并将URL附加到规则描述上。

UNIX格式器产生与默认格式化器相同的输出,但围绕[]中的规则。

json格式以JSON格式产生输出。
ndjson Formatter以Newline Delimited JSON格式产生输出。
checkstyle格式以类似校验的格式产生输出。
sarif格式化器在SARIF中产生输出,以供静态分析结果互换格式,这是一种基于JSON的标准格式,用于由OASIS定义和促进的静态分析工具的输出。
标准的当前支持版本为Sarif-V2.1.0。
该工具可以使用自定义规则或格式化器扩展。本节包含有关如何实施此类信息的其他信息。
要使用自定义规则扩展Linter,您可以将其推到此存储库或将revive用作库(请参见下文)
要添加一个自定义格式器,您必须将其推入此存储库或叉。这是由于有限的-buildmode=plugin支持仅适用于Linux(带有已知问题)。
每个规则需要实现lint.Rule接口:
type Rule interface {
Name () string
Apply ( * File , Arguments ) [] Failure
} Arguments类型是类型[]interface{}的类型。规则的参数从配置文件传递。
假设我们已经制定了一个称为BanStructNameRule的规则,该规则不允许我们命名具有给定标识符的结构。我们可以使用TOML配置文件来设置违禁标识符:
[ rule . ban-struct-name ]
arguments = [ " Foo " ]在上面的摘要中,我们:
ban-struct-name规则。我们规则的Name()方法应返回与ban-struct-name匹配的字符串。Foo配置规则。参数列表将通过我们目前要申请的目标文件Apply(*File, Arguments) 。可以在此处找到样本规则实现。
revive作为图书馆如果规则是特定于您的用例的(即添加到revive的规则集不是一个好的候选人),则可以使用revive作为绒毛引擎将其添加到Linter中。
以下代码显示了如何在应用程序中使用revive 。在示例中,只添加一个规则( myRule ),当然,您可以添加尽可能多的数量。您的规则可以通过编程方式进行配置,也可以使用标准的revive配置文件进行配置。 revive的完整规则集也可以通过您的应用程序来实现。
package main
import (
"github.com/mgechev/revive/cli"
"github.com/mgechev/revive/lint"
"github.com/mgechev/revive/revivelib"
)
func main () {
cli . RunRevive ( revivelib . NewExtraRule ( & myRule {}, lint. RuleConfig {}))
}
type myRule struct {}
func ( f myRule ) Name () string {
return "myRule"
}
func ( f myRule ) Apply ( * lint. File , lint. Arguments ) []lint. Failure { ... }您仍然可以走得更远,不用其CLI作为图书馆的一部分或CLI使用revive :
package mylib
import (
"github.com/mgechev/revive/cli"
"github.com/mgechev/revive/revivelib"
"github.com/mgechev/revive/lint"
)
// Error checking removed for clarity
func LintMyFile ( file string ) {
conf , _ := config . GetConfig ( "../defaults.toml" )
revive , _ := revivelib . New (
conf , // Configuration file
true , // Set exit status
2048 , // Max open files
// Then add as many extra rules as you need
revivelib . NewExtraRule ( & myRule {}, lint. RuleConfig {}),
)
failuresChan , err := revive . Lint (
revivelib . Include ( file ),
revivelib . Exclude ( "./fixtures" ),
// You can use as many revivelib.Include or revivelib.Exclude as required
)
if err != nil {
panic ( "Shouldn't have failed: " + err . Error ())
}
// Now let's return the formatted errors
failures , exitCode , _ := revive . Format ( "stylish" , failuresChan )
// failures is the string with all formatted lint error messages
// exit code is 0 if no errors, 1 if errors (unless config options change it)
// ... do something with them
}
type myRule struct {}
func ( f myRule ) Name () string {
return "myRule"
}
func ( f myRule ) Apply ( * lint. File , lint. Arguments ) []lint. Failure { ... }每个格式化器都需要实现以下接口:
type Formatter interface {
Format ( <- chan Failure , Config ) ( string , error )
Name () string
} Format方法接受Failure实例的通道和启用规则的配置。 Name()方法应返回一个与已经存在的规则的名称不同的字符串。在调用revive CLI工具时指定格式化器时使用此字符串。
对于示例格式,请查看此文件。
与golint相比, revive性能更好,因为它将每个单独规则的文件凸出到一个单独的Goroutine中。这是MacBook Pro 2013年初在Kubernetes上进行的基本性能基准:
time golint kubernetes/... > /dev/null
real 0m54.837s
user 0m57.844s
sys 0m9.146s # no type checking
time revive -config untyped.toml kubernetes/... > /dev/null
real 0m8.471s
user 0m40.721s
sys 0m3.262s请记住,如果您使用需要类型检查的规则,则性能可能比golint快2倍:
# type checking enabled
time revive kubernetes/... > /dev/null
real 0m26.211s
user 2m6.708s
sys 0m17.192s当前,默认情况下启用了类型检查。如果您想在没有类型检查的情况下运行衬里,请从配置文件中删除所有键入规则。
默认情况下, revive确定是否基于其连接到TTY是否将其输出着色。这适用于大多数用例,但是如果您在命令管道中使用revive ,则可能会表现出预期的,在该命令中,将Stdout运送到另一个命令。
要强制着色,请将REVIVE_FORCE_COLOR=1添加到您正在运行的环境中。例如:
REVIVE_FORCE_COLOR=1 revive -formatter friendly ./... | tee revive.log| Mgechev | Chavacava | Denisvmedia | Mfederowicz | xuri | Alexandear |
| ldez | 多余的 | 克利夫恩 | morphy2k | Bernhardreisenberger | dshemin |
| Butuzov | Comdiv | 海尼曼 | gsamokovarov | 姆德拉 | tymonx |
| 西那台 | RAWEN17 | Dominiquelefevre | git-hulk | SHMSR | ytnsym |
| Zimmski | MapReal19 | CCE | Skaji | Ccoveille | Tamird |
| 马克洛格 | Mihaitodor | dvejmz | Abeltay | DAMIF94 | Groxx |
| Stephenbuttolph | Stephenbrown2 | lsytj0413 | Qascade | RIDVANSUMSET | Rliebz |
| rdeusser | rmarku | rnikoopour | Rafamadriz | paco0x | PA-M |
| cinar | 纳特金 | Nunnatsa | Michalhisim | Zeripath | Y-YAGI |
| TechKnowlogick | Okhowang | Meanguy | Likeh | 内核 | jmckenzieark |
| Haya14busa | 弗莱金 | 耶达 | 威拉布斯 | heyvito | Vincentbaron |
| SCOP | vkrol | Kirillsluchaev | Jarema | 塔尔塔尔 | tmzane |
| Felipedavid | Euank | 综合狂想 | Juneezee | Echoix | 敦促 |
| Petethepig | dirk007 | Yangdiangzb | Derekperkins | 贝贝勒姆 | 阿蒂斯 |
| hatamiarash7 | 阿拉古尔 | amincheloh | 库尔蒂 | ablycfly | Abhinav |
| R-RICCI | mmcloughlin | Mathieu-Aubin | 马丁西尔 | 阿沃里玛 | Mouklounen |
| 非常谨慎 | Johnrichardrinehart | 墙壁 | Jefersonf | 詹姆斯女仆 | jalaziz |
| 格隆多 | 领带 | Quasilyte | Davidhsingyuchen | Gfariasalves-ionos | Gburanov |
| ginglis13 | 弗莱瑟 |
麻省理工学院