Другое

Ошибка rust-analyzer: Не удалось загрузить пространства Neovim

Устраните ошибку rust‑analyzer «Не удалось загрузить пространства» в Neovim: пошаговое устранение проблем с конфигурацией, совместимостью версий и настройкойLSP.

Rust Language Server (rust-analyzer) Не Работает в Neovim

У меня возникли проблемы с тем, чтобы Rust language server (rust‑analyzer) работал в Neovim. Lua language server работает корректно, но при работе с Rust‑файлами возникают ошибки.

Описание проблемы

При открытии Rust‑файла, например hello.rs, я получаю следующую ошибку:

LSP [rust_analyzer] Failed to load workspaces

Сервер языка не выводит никакой информации и не функционирует.

Информация о системе

  • Версия Neovim: NVIM v0.12.0-dev-1664+ge0308dc147
  • Тип сборки: RelWithDebInfo
  • LuaJIT 2.1.1763318511
  • Версия rust‑analyzer: 0.3.2683-standalone (2efc800780 2025‑11‑11)

Детали конфигурации

Моя конфигурация Neovim в файле lsp.lua включает:

Конфигурация Lua Language Server

lua
vim.lsp.config['lua_ls'] = {
    cmd = { 'lua-language-server' },
    filetypes = { 'lua' },
    root_markers = { { '.luarc.json', '.luarc.jsonc' }, '.git' },
    settings = {
        Lua = {
            runtime = {
                version = 'LuaJIT',
            },
        }
    }
}

Конфигурация Rust Language Server

lua
vim.lsp.config['rust_analyzer'] = {
    cmd = { '/Users/johnsmith/Downloads/rust-analyzer-aarch64-apple-darwin' },
    filetypes = { 'rust' },
    root_markers = { 'Cargo.toml', '.git' },
    settings = {
        ["rust_analyzer"] = {
            assist = {
                importGranularity = "module",
                importPrefix = "by_self",
            },
            cargo = {
                loadOutDirsFromCheck = true,
            },
            procMacro = {
                enable = true,
            },
            diagnostics = {
                disabled = { "unresolved-proc-macro" },
                enable = true,
            },
        }
    }
}

Настройка LSP

lua
vim.lsp.enable('lua_ls')
vim.lsp.enable('rust_analyzer')

vim.api.nvim_create_autocmd('LspAttach', {
    group = vim.api.nvim_create_augroup('my.lsp', {}),
    callback = function(args)
        local client = assert(vim.lsp.get_client_by_id(args.data.client_id))
        if client:supports_method('textDocument/implementation')
        then
            -- Создаём привязку клавиш для vim.lsp.buf.implementation …
        end
        if client:supports_method('textDocument/references') then
            vim.keymap.set('n', 'grr', function()
                require('fzf-lua').lsp_references()
            end, { noremap = true, silent = true, buffer = args.buf })
        end

        if client:supports_method('textDocument/completion') then
            vim.opt.completeopt = { 'menu', 'menuone', 'noinsert', 'fuzzy', 'popup' }
            vim.lsp.completion.enable(true, client.id, args.buf, { autotrigger = true })
        end
        
        if not client:supports_method('textDocument/willSaveWaitUntil')
            and client:supports_method('textDocument/formatting') then
            vim.api.nvim_create_autocmd('BufWritePre', {
                group = vim.api.nvim_create_augroup('my.lsp', { clear = false }),
                buffer = args.buf,
                callback = function()
                    vim.lsp.buf.format({ bufnr = args.buf, id = client.id, timeout_ms = 1000 })
                end,
            })
        end
    end,
})

vim.diagnostic.config({
    virtual_lines = ({
        current_line = true,
    }),
})

Вывод Health Check

При запуске :checkhealth vim.lsp я получаю:

loadOutDirsFromCheck

Вопрос

Что может вызывать ошибку «Failed to load workspaces» с rust‑analyzer в Neovim, и как можно решить эту проблему, чтобы получить полноценную функциональность Rust language server?

Ошибка «Failed to load workspaces» в rust‑analyzer в Neovim обычно возникает из‑за проблем с обнаружением рабочих пространств, несовместимости версий или некорректной конфигурации. Эта ошибка мешает rust‑analyzer корректно инициализироваться и предоставлять функции LSP для ваших Rust‑проектов.

Содержание


Распространённые причины ошибки

Ошибка «Failed to load workspaces» может возникать по нескольким причинам:

  1. Устаревший бинарник rust‑analyzer: версия 0.3.2683 может иметь проблемы совместимости с новыми версиями Rust или механизмами обнаружения рабочих пространств.
  2. Отсутствие или некорректный Cargo.toml: Rust‑проекты требуют корректный файл Cargo.toml в корне проекта, чтобы rust‑analyzer распознал их как рабочие пространства.
  3. Проблемы структуры рабочего пространства: сложные конфигурации workspace или вложенные структуры могут сбивать с толку процесс обнаружения.
  4. Несовместимость инструментов Rust: согласно обсуждениям на Stack Overflow, rust‑analyzer использует флаг --filter-platform, который требует Rust 1.41.0 или новее.
  5. Проблемы с правами доступа или путём: на некоторых системах автономный бинарник может не иметь прав на выполнение или путь может быть недоступен.

Пошаговое руководство по устранению неполадок

1. Обновите rust‑analyzer

Самое частое решение — обновить rust‑analyzer до последней версии. Версия 0.3.2683 уже устарела и, скорее всего, заменена:

bash
# Скачайте последнюю версию с GitHub
curl -L https://github.com/rust-lang/rust-analyzer/releases/latest/download/rust-analyzer-x86_64-apple-darwin.gz | gunzip -c > ~/Downloads/rust-analyzer
chmod +x ~/Downloads/rust-analyzer

2. Проверьте структуру проекта

Убедитесь, что ваш Rust‑проект имеет корректную структуру:

bash
# Перейдите в каталог проекта
cd /path/to/your/rust/project

# Проверьте наличие Cargo.toml
ls -la Cargo.toml

# Если его нет, создайте новый проект
cargo new my_project
cd my_project

3. Проверьте версию Rust

Убедитесь, что ваш инструмент Rust соответствует минимальным требованиям:

bash
rustc --version
rustup --version

# При необходимости обновите
rustup update

4. Тестируйте с минимальной конфигурацией

Создайте минимальный тестовый конфиг, чтобы изолировать проблему:

lua
-- Простая тестовая конфигурация
vim.lsp.config['rust_analyzer'] = {
    cmd = { '/Users/johnsmith/Downloads/rust-analyzer' },
    filetypes = { 'rust' },
    root_markers = { 'Cargo.toml' },
}
vim.lsp.enable('rust_analyzer')

Исправления конфигурации

1. Обновите путь к бинарнику

Убедитесь, что путь к rust‑analyzer корректен и бинарник исполняемый:

lua
vim.lsp.config['rust_analyzer'] = {
    cmd = { '/Users/johnsmith/Downloads/rust-analyzer' }, -- Обновлённый путь
    filetypes = { 'rust' },
    root_markers = { 'Cargo.toml', '.git' },
    settings = {
        ["rust-analyzer"] = {
            cargo = {
                loadOutDirsFromCheck = true,
                buildScripts = {
                    enable = true,
                },
            },
            procMacro = {
                enable = true,
            },
        }
    }
}

2. Используйте rustup‑установленный rust‑analyzer

Рассмотрите возможность использования rustup‑установленного rust‑analyzer вместо автономного бинарника:

bash
rustup component add rust-analyzer

Затем настройте Neovim на использование версии, управляемой rustup:

lua
vim.lsp.config['rust_analyzer'] = {
    cmd = { 'rust-analyzer' }, -- Используйте версию rustup
    filetypes = { 'rust' },
    root_markers = { 'Cargo.toml', '.git' },
}

3. Добавьте недостающие настройки

В вашей конфигурации могут отсутствовать некоторые важные параметры:

lua
settings = {
    ["rust-analyzer"] = {
        cargo = {
            autoreload = true,
            buildScripts = {
                enable = true,
                useRustWrapper = true,
            },
            features = "all",
        },
        checkOnSave = {
            allTargets = true,
            command = "clippy",
            extraArgs = { "--", "-D", "warnings" },
        },
        completion = {
            autoimport = {
                enable = true,
            },
        },
        diagnostics = {
            disabled = { "unresolved-proc-macro" },
        },
        files = {
            excludeDirs = { ".git", "target", "node_modules" },
        },
        lens = {
            enable = true,
        },
        lens = {
            references = true,
            run = true,
            implementations = true,
        },
    }
}

Проверка настройки рабочего пространства

1. Проверьте наличие валидного Cargo.toml

Создайте минимальный Cargo.toml в корне проекта:

toml
[package]
name = "my_project"
version = "0.1.0"
edition = "2021"

[dependencies]

2. Проверьте структуру workspace

Если вы используете workspace, убедитесь, что он корректно настроен:

toml
[workspace]
members = [
    "member1",
    "member2",
]

3. Тестируйте с новым проектом

Создайте простой тестовый проект, чтобы убедиться, что настройка работает:

bash
mkdir ~/test_rust_project
cd ~/test_rust_project
cargo init
# Откройте в Neovim и проверьте работу rust‑analyzer

Проверка совместимости версий

1. Проверьте совместимость версии rust‑analyzer

Убедитесь, что ваша версия rust‑analyzer совместима с инструментом Rust. Согласно обсуждениям на Reddit, новые версии rust‑analyzer часто исправляют проблемы с загрузкой workspace.

2. Обновите инструмент Rust

Обновите до последней стабильной версии Rust:

bash
rustup default stable
rustup update
rustup component add rust-src rust-analyzer

3. Проверьте известные проблемы

Изучите issues rust‑analyzer на GitHub для поиска известных проблем и решений, связанных с загрузкой workspace.


Продвинутые методы диагностики

1. Включите отладочный лог

Включите подробный лог, чтобы получить более детальную информацию об ошибке:

lua
vim.lsp.set_log_level("debug")
-- Откройте Rust‑файл и проверьте лог с помощью :LspLog

2. Проверьте переменные окружения

Убедитесь, что переменные окружения, связанные с Rust, корректно заданы:

bash
echo $PATH | grep rust
echo $CARGO_HOME
echo $RUSTUP_HOME

3. Проверьте права доступа к бинарнику

Убедитесь, что ваш rust‑analyzer имеет права на выполнение:

bash
ls -la /Users/johnsmith/Downloads/rust-analyzer
# Должно показывать права на выполнение (-rwxr-xr-x)

4. Тестируйте с разными версиями Neovim

Если вы используете девелоперскую версию Neovim, попробуйте протестировать с стабильным релизом:

bash
# Установите стабильный Neovim по вашему предпочтению
# Проверьте работу rust‑analyzer

Вывод

Ошибка «Failed to load workspaces» в rust‑analyzer в Neovim обычно устраняется:

  1. Обновлением rust‑analyzer до последней версии, так как старые версии (например, 0.3.2683) часто имеют проблемы с обнаружением workspace.
  2. Обеспечением корректной структуры проекта с валидным Cargo.toml.
  3. Проверкой совместимости инструментов Rust и обновлением при необходимости.
  4. Использованием rustup‑управляемого rust‑analyzer вместо автономных бинарников для лучшей интеграции.
  5. Проверкой прав доступа и путей к исполняемому файлу rust‑analyzer.

Для быстрого решения начните с обновления бинарника rust‑analyzer и тестирования с минимальным Cargo‑проектом. Если проблема сохраняется, включите отладочный лог, чтобы выявить конкретную причину, и обратитесь к документации rust‑analyzer или сообществу за целенаправленной помощью.

Источники

  1. Rust‑analyzer failed to load workspace - Stack Overflow
  2. Rust‑analyzer failed to load workspace - Rust Forum
  3. rust‑analyzer failed to load workspace - GitHub Issue
  4. VSCode rust‑analyzer “Failed to load workspaces” - Rust Forum
  5. Rust analyzer failed to load workspace in VS Code - Reddit
  6. Rust‑analyzer failed to discover workspace - Rust Forum
  7. LSP[rust_analyzer] rust‑analyzer failed to load workspace: Failed to parse edition 2021 - GitHub Issue
Авторы
Проверено модерацией
Модерация