elixir-tools / next-ls

The language server for Elixir that just works. Ready for early adopters!
https://www.elixir-tools.dev/next-ls
MIT License
676 stars 40 forks source link

Compiling / running in a dev env results in exqlite errors #515

Open rdlu opened 2 months ago

rdlu commented 2 months ago

I'm again having some issues, with both neovim and vscode. The release version just stays forever initializing, even after doing the cleaning that I always do, but that is a separate issue.

To investigate the first issue, then I tried to clone the repo to run in dev mode with just start, or just the burrito on my own (and copy to cp burrito_out/next_ls_linux_amd64 ~/.cache/elixir-tools/nextls/bin/nextls-custom, then ln -s the custom to nextls. Then I had a different but highly reproducible issue with my system:

{:error,
 {:load_failed,
  ~c"Failed to load NIF library: 'Error loading shared library libsqlite3.so.0: No such file or directory (needed by /home/rdlu/.local/share/.burrito/next_ls_erts-14.2.5_0.22.8/lib/exqlite-0.13.15/priv/sqlite3_nif.so)'"}}

13:00:27.773 [error] ** (MatchError) no match of right hand side value: {:error, {:shutdown, {:failed_to_start_child, NextLS.DB, {:undef, [{Exqlite.Sqlite3NIF, :open, [~c"/home/rdlu/Projects/octo/.elixir-tools/nextls.db", 6], []}, {Exqlite.Connection, :do_connect, 2, [file: ~c"lib/exqlite/connection.ex", line: 517]}, {NextLS.DB, :init, 1, [file: ~c"lib/next_ls/db.ex", line: 40]}, {:gen_server, :init_it, 2, [file: ~c"gen_server.erl", line: 980]}, {:gen_server, :init_it, 6, [file: ~c"gen_server.erl", line: 935]}, {:proc_lib, :init_p_do_apply, 3, [file: ~c"proc_lib.erl", line: 241]}]}}}}
    (next_ls 0.22.8) lib/next_ls.ex:933: anonymous fn/5 in NextLS.handle_notification/2
    (elixir 1.17.0-rc.1) lib/enum.ex:2531: Enum."-reduce/3-lists^foldl/2-0-"/3
    (next_ls 0.22.8) lib/next_ls.ex:928: NextLS.handle_notification/2
    (gen_lsp 0.10.0) lib/gen_lsp.ex:478: anonymous fn/2 in GenLSP.loop/3
    (telemetry 1.2.1) /home/rdlu/Projects/next-ls/deps/telemetry/src/telemetry.erl:321: :telemetry.span/3
    (gen_lsp 0.10.0) lib/gen_lsp.ex:474: anonymous fn/7 in GenLSP.loop/3
    (gen_lsp 0.10.0) lib/gen_lsp.ex:553: GenLSP.attempt/4
    (stdlib 5.2.3) proc_lib.erl:241: :proc_lib.init_p_do_apply/3

I tried to update the exqlite inside mix.exs to 0.23.0 then mix deps.get

The message just changed to the new version:

{:error,
 {:load_failed,
  ~c"Failed to load NIF library: 'Error loading shared library libsqlite3.so.0: No such file or directory (needed by /home/rdlu/.local/share/.burrito/next_ls_erts-14.2.5_0.22.8/lib/exqlite-0.23.0/priv/sqlite3_nif.so)'"}}

So I can't investigate the other issue I'm having without loading the db.

My system:

Fedora Workstation 40
fish shell
sqlite and dev libs, version 3.45.1
all the libsqlite*.so* files are present on the /usr/include or /usr/lib64 folders

some erl, elixir flags

# Elixir / Erl
# tell exqlite that we wish to use some other sqlite installation. this will prevent sqlite3.c and friends from compiling
set -gx EXQLITE_USE_SYSTEM 1

# Tell exqlite where to find the `sqlite3.h` file
set -gx EXQLITE_SYSTEM_CFLAGS -I/usr/include

# tell exqlite which sqlite implementation to use
set -gx EXQLITE_SYSTEM_LDFLAGS '-L/usr/lib64 -lsqlite3'

# Erlang compile flags for fedora & wx-config
set -gx ERL_AFLAGS '-kernel shell_history enabled'
set -gx KERL_CONFIGURE_OPTIONS "--enable-wx --with-wx --enable-webview --with-wx-config=/usr/bin/wx-config-3.2"
set -gx KERL_BUILD_DOCS yes

I also tried removing the exqlite vars, or setting "use system" to 0. It indeed compiles by itself, but the result is the same.

my env cleaning script:

#!/usr/bin/env fish
echo "Cleaning Elixir development environment..."
rm -rfv ~/.local/share/.burrito/
rm -rfv ~/.cache/elixir-tools/

# Recompile some dependencies
mix do local.rebar --force, local.hex --force

my project cleaning justfile script:

clean-dev:
  rm -rf ./.elixir_ls ./_build ./deps ./.elixir-tools
  find . -name "*.beam" -exec rm -f {} \;

I updated the .tools-versions as well, then used mise to install the exact versions below, since the current elixir hashed version simply doesn't compile for me, but the one below is succesful:

erlang 26.2.2
elixir  v1.17-otp-26
zig 0.11.0

I have mise, but I also tried removing all mise erl/elixir installed versions, not loading mise at all, using the current system versions, the deps cache were installed to ~/.cache/mix instead the usual mise/rtx/asdf locations to run my projects with neovim/vscode + nextls.

Not sure if this is an burrito issue or what not, because just start with port 9000 causes almost the same issues. (the logs go to the next-ls folder instead my project folder, but the same error happens).

I don't have any issues with some side projects with phoenix that uses sqlite. That's why I have the exqlite flags, to accelerate the compiling of my side projects.

Any clues? Thanks!

rdlu commented 2 months ago

For the sake of completeness, my current neovim/lazyvim elixir config, but vscode is having the same:

return {
  {
    "elixir-tools/elixir-tools.nvim",
    version = "*",
    event = { "BufReadPre", "BufNewFile" },
    config = function()
      local elixir = require("elixir")

      elixir.setup({
        nextls = {
          enable = true,
          init_options = {
            extensions = {
              credo = {
                enable = false,
              },
            },
            experimental = {
              completions = {
                enable = true, -- control if completions are enabled. defaults to false
              },
            },
          },
        },
        credo = {
          enable = false,
        },
        elixirls = {
          enable = false,
          settings = require("elixir.elixirls").settings({
            dialyzerEnabled = false,
            enableTestLenses = false,
            suggestSpecs = false,
          }),
        },
      })
    end,
    dependencies = {
      "nvim-lua/plenary.nvim",
    },
  },
  {
    "nvim-treesitter/nvim-treesitter",
    opts = function(_, opts)
      vim.list_extend(opts.ensure_installed, {
        "elixir",
        "heex",
        "eex",
      })
    end,
  },
  {
    "nvim-neotest/neotest",
    optional = true,
    dependencies = {
      "jfpedroza/neotest-elixir",
    },
    opts = {
      adapters = {
        ["neotest-elixir"] = {},
      },
    },
  },
  {
    "nvimtools/none-ls.nvim",
    optional = true,
    opts = function(_, opts)
      if vim.fn.executable("credo") == 0 then
        return
      end
      local nls = require("null-ls")
      opts.sources = vim.list_extend(opts.sources or {}, {
        nls.builtins.diagnostics.credo,
      })
    end,
  },
  {
    "mfussenegger/nvim-lint",
    optional = true,
    opts = function(_, opts)
      if vim.fn.executable("credo") == 0 then
        return
      end
      opts.linters_by_ft = {
        elixir = { "credo" },
      }
    end,
  },
  {
    "mhanberg/output-panel.nvim",
    event = "VeryLazy",
    config = function()
      require("output_panel").setup()
      require("which-key").register({
        c = {
          name = "Code",
          o = { "<cmd>OutputPanel<cr>", "Open Output Panel" },
        },
      }, { prefix = "<leader>" })
    end,
  },
}