Если сохранение сгенерированного файла в VS Code на Mac постоянно изменяет его содержимое, сначала определите, какой форматировщик выполняется. Параметр editor.formatOnSave в VS Code применяет форматирование при сохранении файла, однако в VS Code нет встроенного шаблона путей, позволяющего исключить выбранные файлы из этой настройки. Для таких форматировщиков, как Prettier, используйте собственный файл игнорирования; в противном случае отключите форматирование при сохранении на том уровне области видимости, который подходит для защищаемых файлов.
Определите, что именно изменяет файл
VS Code может выполнять форматирование при сохранении с помощью параметра editor.formatOnSave, а языковые расширения могут предоставлять свои форматировщики. Действие с кодом при сохранении (Code Action), например организация импортов, настраивается отдельно и также может изменять содержимое файла. В документации по базовому редактированию в VS Code описано форматирование при сохранении, а в руководстве по действиям с кодом при сохранении рассматриваются действия, выполняемые во время сохранения.
Чтобы сузить круг возможных причин, откройте сгенерированный файл, проверьте используемый режим языка в строке состояния и выполните поиск по параметрам (Settings) по запросам formatOnSave и codeActionsOnSave. Фильтр @modified в настройках поможет увидеть измененные значения. Если файл продолжает изменяться даже при отключенном форматировании, проверьте установленные расширения и скрипты проекта: причиной может быть генератор кода или другое действие при сохранении. Отключение форматирования не остановит работу независимого инструмента, перезаписывающего файл.
Исключите сгенерированные пути при использовании Prettier
Если в качестве форматировщика используется Prettier, добавьте путь к сгенерированным файлам в файл .prettierignore в корне проекта. Например, чтобы пропустить сгенерированные файлы в директории src/generated, добавьте следующую запись:
src/generated/
В документации Prettier файл .prettierignore описывается как штатный механизм исключения файлов, который могут использовать интеграции с редакторами. В его шаблонах используется синтаксис Git-ignore. Это наиболее точечный вариант, если вы хотите сохранить форматирование при сохранении для остальных файлов, обрабатываемых Prettier. Убедитесь, что для этого файла действительно выбран форматировщик Prettier: другой форматировщик может использовать иные правила или параметры игнорирования. Prettier: Игнорирование кода
Отключите форматирование на подходящем уровне настроек VS Code
На Mac нажмите ⇧⌘P и выполните команду Preferences: Open User Settings (JSON) для внесения глобальных изменений или Preferences: Open Workspace Settings (JSON), чтобы затронуть только текущий проект. Файл настроек рабочей области хранится в папке .vscode проекта. Оба уровня настроек VS Code и соответствующие команды для Mac описаны в разделе Пользовательские настройки и настройки рабочей области.
Чтобы отключить форматирование при сохранении только в этой рабочей области, добавьте следующий параметр в существующий JSON-объект. Сохраните остальные уже присутствующие параметры и при необходимости поставьте запятую:
{
"editor.formatOnSave": false
}
Для исключения на уровне конкретного языка задайте область действия параметра для этого языка. Замените typescript на фактический идентификатор языка файла в VS Code, который можно посмотреть в строке состояния:
{
"[typescript]": {
"editor.formatOnSave": false
}
}
Это отключит форматирование при сохранении для всех файлов на данном языке в выбранной области видимости, а не только для сгенерированных путей. Настройки также могут переопределяться более специфичными уровнями, поэтому, если файл по-прежнему изменяется, выполните поиск по @modified и проверьте как пользовательские настройки, так и настройки рабочей области, а также языковые блоки. В справочнике по настройкам VS Code описаны параметры для конкретных языков и приоритет их применения.
Проверьте действия при сохранении отдельно
Если форматирование уже отключено, но сохранение все равно перестраивает импорты или применяет исправления, проверьте параметр editor.codeActionsOnSave. Он управляет такими действиями, как упорядочивание импортов (organize imports) и применение всех исправлений (fix-all). Удалите или измените только то действие, которое вызывает перезапись; полное отключение этого параметра может также отключить полезные операции при сохранении. В документации VS Code по действиям с кодом при сохранении описаны поддерживаемые параметры управления.
Не используйте files.exclude в качестве защиты от форматирования: в документации VS Code указано, что это параметр видимости файлов в Проводнике (Explorer), а не инструмент контроля редактирования файла форматировщиком. Если у форматировщика нет функции игнорирования на основе путей, а проблема затрагивает лишь несколько сгенерированных файлов, практичным решением в VS Code будет отключение форматирования при сохранении для соответствующего языка или рабочей области с последующим форматированием обычных файлов вручную с помощью команды Format Document (⇧⌥F) при необходимости. VS Code описывает эту команду в разделе Базовое редактирование.
Для сгенерированных файлов, которые должны побайтово сохранять неизменность, рекомендуется использовать собственный документированный механизм игнорирования форматировщика, если он доступен. В противном случае используйте наиболее узкую доступную область настроек VS Code, затем сохраните типичный сгенерированный файл и проверьте diff, чтобы подтвердить, какое именно поведение вызывает изменения.
Источники
Базовое редактирование — Visual Studio Code
Действия с кодом при сохранении — Visual Studio Code
Пользовательские настройки и настройки рабочей области — Visual Studio Code
Игнорирование кода — Prettier