Подписка внутри клиента — это локальный кэш удалённых данных. Каждое обновление заново забирает содержимое с сервера и заново собирает из него файл конфигурации. То, что вы вписали в этот файл руками, в сборке не участвует, а значит и на выходе не появляется. Обжигаются на этом один раз; остаётся вопрос, как это обойти.
Правки должны лежать поверх подписки, а не внутри неё
Clash Verge Rev разделяет «что сказала подписка» и «что поменяли вы» на два слоя. Копия подписки остаётся только для чтения, ваши изменения хранятся отдельно как расширенная конфигурация, и каждый раз при сборке итогового конфига клиент берёт вывод подписки и кладёт ваш слой сверху. Подписка может меняться как угодно — ваш слой после этого на месте. У других клиентов есть то же самое под другими названиями: override, mixin, предобработка. Устройство одинаковое.
Партнёрский материалОткуда взять ссылку на подписку?Партнёрский сервис даёт 1 ГБ высокоскоростного трафика Гонконга при регистрации — импорт в один клик.Получить быстрые серверыДва вида расширения: кусок YAML и кусок JS
- Merge — фрагмент YAML, который сливается с собранной конфигурацией. Годится для фиксированного содержимого: несколько правил, блок dns, изменённый порт.
- Script — JavaScript. Входная функция получает целый объект config, вы его меняете и возвращаете. Годится для всего, где нужны условия; для статики это из пушки по воробьям.
- Порядок жёсткий: вывод подписки → Merge → Script → итоговая конфигурация. Script видит результат после Merge, так что при обоих подключённых последнее слово за Script.
Главная ловушка Merge: списки заменяются, а не дополняются
Одноимённые ключи перезаписываются — это совпадает с интуицией. Со списками не совпадает. Пишете в своём фрагменте ключ rules, и поведение по умолчанию таково, что ваши несколько строк встают вместо нескольких сотен строк подписки: всё, кроме написанного вами, просто исчезает. Выглядит это как «полсети внезапно пошло напрямую» или «полсети внезапно пошло через узел». Чтобы добавить в список, нужны отдельные ключи: prepend-rules вставляет в начало, append-rules — в конец, и такие же формы prepend и append есть для proxy-groups и proxies. Правила чувствительны к порядку, поэтому свои почти всегда просятся в prepend.
prepend-rules:
- DOMAIN-SUFFIX,internal.example.com,DIRECT
- PROCESS-NAME,Telegram.exe,PROXY
append-rules:
- DST-PORT,25,REJECT
dns:
enable: true
nameserver:
- 223.5.5.5
Что умеет Script и не умеет Merge
Точка входа — функция, которая принимает разобранный объект конфигурации и возвращает новый. Это даёт возможность действовать по условию, а не прописывать результат заранее: выкинуть фиктивные записи, у которых в названии дата окончания и остаток трафика, поставить единый префикс каждому имени узла, или собрать в одну группу всё, что подходит под шаблон. Merge ничего из этого не выражает, потому что заранее неизвестно, что окажется в подписке.
function main(config) {
config.proxies = config.proxies.filter(function (p) {
return p.name.indexOf('Expire') === -1;
});
config.rules.unshift('DOMAIN-SUFFIX,example.com,DIRECT');
return config;
}
Не гадайте — смотрите, что получилось
Когда в расширенной конфигурации ошибка, симптомы не помогают. Либо конфигурация вообще не грузится, либо грузится нормально, а целый раздел тихо пропал: половина списка узлов или список правил, в котором остались только две ваши строки. Клиенты обычно дают способ посмотреть итоговую конфигурацию — в контекстном меню профиля или в его подробностях, иногда это называется просмотром, иногда экспортом. Заглядывайте туда сразу после каждой правки: убедитесь, что добавленное на месте и что исходное никуда не делось. Это гораздо быстрее, чем распутывать всё с конца, по симптомам.
proxies. Узлы — это работа подписки, и, забрав её себе, вы обнуляете весь смысл автообновления: в день, когда провайдер сменит адрес сервера, догонять придётся руками. Как писать сами правила и на какой строке они должны стоять — отдельная тема; здесь речь только о том, чтобы их не стирало.