Ускорение работы Arduino IDE 2.3.10
В последнее время увлекся программированием микроконтроллеров. Ну как программированием – я формулирую задачи, а Chat GPT их реализует. Может и неидеально, но меня устраивает. Пока программы были малеькими (датчик CO2 или термостат бойлера) проблем не было, пока они не стали большими (управление инвертором - статистика, графики, веб-интерфейс и все такое). И тут я заметил, что компиляция проекта может занимать и 10 минут даже. Да, процессор у меня слабенький по нынешним временам (i7 3770), но не настролько-же! В общем выяснилось, что в Arduino IDE есть такой себе Language Server – фоновая программа, которая обеспечивает умные функции редактирования кода (подсветку, автодополнение, подсказки и поиск ошибок «на лету»). И каждый раз после загрузки проекта он какое-то время его анализирует со 100% загрузкой процессора. И если в это время запустить компиляцию - он не останавливается, и начинает бороться с компилятором за ресурсы. Я натравил на него Chat GPT и результатом стал патч, который отключает Language Server (и включает, если нужно).
В общем - вот сам патч (сохраните его под именем Disable-Arduino-LS.ps1):
param([switch]$Restore)
$ErrorActionPreference = 'Stop'
$target = Join-Path $env:LOCALAPPDATA 'Programs\Arduino IDE\resources\app\lib\frontend\bundle.js'
$backup = "$target.before-disable-language-server.bak"
if (Get-Process -Name 'Arduino IDE' -ErrorAction SilentlyContinue) { throw 'Закройте Arduino IDE перед применением или восстановлением патча.' }
if ($Restore) {
if (!(Test-Path -LiteralPath $backup)) { throw "Резервная копия не найдена: $backup" }
Copy-Item -LiteralPath $backup -Destination $target -Force
Write-Host 'Оригинальный bundle.js восстановлен.'
exit
}
if (!(Test-Path -LiteralPath $target)) { throw "Файл не найден: $target" }
$expected = '25c44c3ae3ff0b827fa550fba7427e84c94ef686df2836f46ced9e98a9665f3d'
$actual = (Get-FileHash -LiteralPath $target -Algorithm SHA256).Hash.ToLowerInvariant()
if ($actual -ne $expected) { throw "Версия bundle.js отличается от присланной. Ничего не изменено. SHA256: $actual" }
$enc = [System.Text.Encoding]::UTF8
$contents = [System.IO.File]::ReadAllText($target, $enc)
$old = 'n&&this.startLanguageServer(n,i,t)'
$new = 'n&&void 0/* LS auto-start disabled */'
if ($contents.Split([string[]]@($old),[System.StringSplitOptions]::None).Count -ne 2) { throw 'Не найден единственный ожидаемый фрагмент. Ничего не изменено.' }
if (Test-Path -LiteralPath $backup) { throw "Резервная копия уже существует: $backup. Ничего не изменено." }
Copy-Item -LiteralPath $target -Destination $backup
$contents = $contents.Replace($old,$new)
[System.IO.File]::WriteAllText($target, $contents, (New-Object System.Text.UTF8Encoding($false)))
Write-Host 'Автоматический запуск Arduino Language Server отключён. Резервная копия сохранена.'
Инструкция по применению:
1. Полностью закройте Arduino IDE.
2. Запустите PowerShell в папке с патчем:
powershell -ExecutionPolicy Bypass -File .\Disable-Arduino-LS.ps1
3. Откройте IDE и проект. Проверьте, что не запускаются arduino-language-server.exe, clangd.exe и фоновые cc1plus.exe.
4. Нажмите Verify и убедитесь, что ручная сборка работает.
Откат:
powershell -ExecutionPolicy Bypass -File .\Disable-Arduino-LS.ps1 -Restore
Патч проверяет SHA256 оригинального bundle.js, меняет только один вызов автоматического запуска Language Server. Не модифицирует Arduino CLI и обработчик Verify/Upload. Работоспособность IDE на вашем компьютере ещё не проверена. При обновлении Arduino IDE патч может потребовать пересоздания.
Результат – компиляция проекта теперь происходит за 1 минуту без 100% загрузки процессора.
