跳转到内容

配置转换

Clash Nyanpasu 2.0 根据配置 Profile 及其转换生成运行时配置。旧称“代理链”指的就是这套 Profile 转换流程。每个转换都会读取当前结果,并将输出传给下一步;它不会改写配置 Profile 的源文件。

配置 Profile 分为文件 Profile 和组合 Profile,可被选中使用。转换 Profile 是可复用的操作,不能单独启用。

Clash Nyanpasu 提供三种转换类型 3 种转换类型:

  • YAML Overlay(部分旧 Profile 中显示为 Merge)按声明式合并规则修改配置。
  • JavaScript 使用脚本处理当前配置对象。
  • Lua 使用脚本处理当前配置表。
  1. 在配置页面创建转换,选择合并脚本 (YAML)、JavaScript 脚本或Lua 脚本。转换可以使用本地文件或其他受支持的 Profile 来源。
  2. 打开文件或组合 Profile,在配置转换区域将转换从未启用移入已启用。
  3. 拖动已启用的转换调整顺序,然后应用更改。
  4. 若要为当前启用的配置添加共用转换,请在配置页面使用全局转换并调整其顺序。

新建转换后不会自动启用。专属转换按从上到下的顺序执行,然后执行全局转换;全局转换也按从上到下的顺序执行。

对于组合 Profile,应用会先处理可选基础 Profile 和每个贡献项,并执行各文件自身的专属转换。随后按列表顺序追加贡献项中的代理,再执行组合 Profile 自身的专属转换,最后运行全局转换。

flowchart TD
    A[选中的文件或组合配置] --> B[按列表顺序执行专属转换]
    B --> C[按列表顺序执行全局转换]
    C --> D[应用程序和核心的后续处理]
    D --> E[生成运行时配置]

YAML 源文件的顶层必须是映射。普通映射键会递归合并:嵌套映射中未指定的值会保留,标量和序列会替换对应值;原本不存在的键会新增。这与 OpenClash 的配置合并编辑有相似用途;下文说明的是 Nyanpasu 2.0 的具体行为。Overlay 指令可以操作点分路径,并按 YAML 文档中的顺序执行。

键 作用
append__path / append-path 将序列追加到已存在序列的末尾。
prepend__path / prepend-path 将序列添加到已存在序列的开头。
override__path 替换已存在的点分路径。
filter__path 使用 Lua 表达式筛选或转换已存在序列中的项目。

追加和前置操作要求指令值为序列,并且目标字段已经存在且为序列。如果指令值不是序列、路径缺失或目标字段不是序列,该操作会记录警告并跳过。override__path 遇到缺失路径时也会记录警告并跳过,不会新建路径。这些路径跳过警告本身不会导致候选配置构建失败。

在原有 rules 序列后追加一条规则,并保留已有内容。rules 必须已经是序列。

append__rules:
- DOMAIN-SUFFIX,example.org,DIRECT

filter__path 要求目标字段已经是序列。字符串值是逐项执行的 Lua 谓词,当前项通过 item 访问:返回 true 会保留该项,返回 false 会移除该项。Filter 映射使用 when 谓词和一个操作。Filter 列表会依次执行,每个操作都会处理上一步的结果。

保留 Trojan 以外的代理。表达式必须返回布尔值。

filter__proxies: |
item.type ~= 'trojan'

更多情况请参阅当前 Overlay 执行器示例。

JavaScript 执行器使用 Boa,并调用默认导出的函数,传入当前配置对象。其约定为 main(config: ClashConfig): ClashConfig:ClashConfig 用来说明输入和返回配置的类型;实际脚本请写可执行的 JavaScript,不要添加 TypeScript 类型标注。与 CFW Mixins 或预处理类似,转换会修改配置并返回结果;此类比不代表脚本兼容。默认导出必须返回可转换为配置映射的结果;执行器会等待返回的 Promise。如果 Promise 在执行器的短等待时间(约两秒)内仍未完成,转换会失败。console.log、console.info、console.warn 和 console.error 会记录在步骤日志中。

保留原有的两条规则示例,并在追加前确认 rules 是数组。

export default function main(config) {
const rules = ["DOMAIN-SUFFIX,google.com,PROXY", "DOMAIN,example.org,PROXY"];
if (Array.isArray(config.rules)) {
config.rules.push(...rules);
} else {
config.rules = rules;
}
return config;
}

执行器只提供部分纯 Web API,不提供通用的 fetch()。它可以解析本地模块和 HTTP(S) ES 模块导入;下载的模块最多缓存 30 天。请只导入可信的远程模块。详见 JavaScript 执行器源码。

Lua 执行器使用 Lua 5.4 语法和 mlua 的 ALL_SAFE 标准库预设。当前配置通过全局变量 config 提供;脚本必须返回一个包含映射的表。控制台输出会记录在步骤日志中。

local rules = {
'DOMAIN-SUFFIX,google.com,PROXY',
'DOMAIN,example.org,PROXY',
}
if type(config.rules) ~= "table" then
config.rules = {}
end
for _, rule in ipairs(rules) do
table.insert(config.rules, rule)
end
return config

详见 Lua 执行器源码。添加规则集或代理组图标的完整示例请参阅配置转换示例和图标示例;其中部分字段取决于所选内核。

  1. 在配置页面打开配置检查。
  2. 切换查看已生成配置或上次应用的快照。
  3. 选择列表或流程图视图,再选择某一步查看其 YAML 输出、与父步骤的差异、变更字段和步骤日志。

若要放弃尚未保存的源文件修改,请在 Profile 编辑器点击重置,或点击取消并确认放弃修改。若要停用转换,请在专属或全局转换编辑器中将其从已启用移回未启用并应用更改。若要撤销已保存的内容,请恢复所需转换源文件并保存。