gopls doesn't show any errors in gopath mode
Information
VIM version NVIM v0.4.4 Build type: Release
Operating System: MacOS
What went wrong
gopls doesn't work when I make projects in my gopath. When I make them with a go module, everything is nice and dandy.
Reproducing the bug
cd /tmp
mkdir foo
cd foo
go mod init github.com/foo/bar
vim main.go
# add the following contents
package main
import "fmt"
func main() {
fmt.Prinln("vim-go")
}
After a second, ALE nicely shows an error on the proper place:

Do the same exercise but in gopath mode:
cd $GOPATH/src/github.com
mkdir -p foo/bar && cd foo/bar
vim main.go
# add the same content as before
This time, ALE doesn't print anything...

However, if I explicitly run :GoDiagnostics as I have vim-go installed, I get the expected error in the quickfix window -> so it's not a gopls issue:

ALEInfo & vimrc
:ALEInfo
Current Filetype: go
Available Linters: ['bingo', 'gobuild', 'gofmt', 'golangci-lint', 'golint', 'gometalinter', 'gopls', 'gosimple', 'gotype', 'govet', 'golangserver', 'revive', 'staticcheck']
Linter Aliases:
'gobuild' -> ['go build']
'govet' -> ['go vet']
Enabled Linters: ['gofmt', 'golint', 'gopls']
Ignored Linters: []
Suggested Fixers:
'gofmt' - Fix Go files with go fmt.
'goimports' - Fix Go files imports with goimports.
'remove_trailing_lines' - Remove all blank lines at the end of a file.
'trim_whitespace' - Remove all trailing whitespace characters at the end of every line.
Linter Variables:
let g:ale_go_go_executable = 'go'
let g:ale_go_golangci_lint_executable = 'golangci-lint'
let g:ale_go_golangci_lint_options = '--enable-all'
let g:ale_go_golangci_lint_package = 0
let g:ale_go_golint_executable = 'golint'
let g:ale_go_golint_options = ''
let g:ale_go_gopls_executable = 'gopls'
let g:ale_go_gopls_options = '--mode stdio'
let g:ale_go_langserver_executable = 'go-langserver'
let g:ale_go_langserver_options = ''
Global Variables:
let g:ale_cache_executable_check_failures = v:null
let g:ale_change_sign_column_color = 0
let g:ale_command_wrapper = ''
let g:ale_completion_delay = 100
let g:ale_completion_enabled = 1
let g:ale_completion_max_suggestions = 50
let g:ale_disable_lsp = 0
let g:ale_echo_cursor = 1
let g:ale_echo_msg_error_str = 'Error'
let g:ale_echo_msg_format = '%code: %%s'
let g:ale_echo_msg_info_str = 'Info'
let g:ale_echo_msg_warning_str = 'Warning'
let g:ale_enabled = 1
let g:ale_fix_on_save = 0
let g:ale_fixers = {'javascript': ['eslint']}
let g:ale_history_enabled = 1
let g:ale_history_log_output = 1
let g:ale_keep_list_window_open = 0
let g:ale_lint_delay = 200
let g:ale_lint_on_enter = 1
let g:ale_lint_on_filetype_changed = 1
let g:ale_lint_on_insert_leave = 1
let g:ale_lint_on_save = 1
let g:ale_lint_on_text_changed = 'normal'
let g:ale_linter_aliases = {}
let g:ale_linters = {'go': ['gofmt', 'golint', 'gopls'], 'typescript': ['tslint'], 'vue': ['eslint'], 'sh': [], 'bash': [], 'javascript': ['flow-language-server', 'eslint'], 'python': []}
let g:ale_linters_explicit = 1
let g:ale_linters_ignore = {}
let g:ale_list_vertical = 0
let g:ale_list_window_size = 10
let g:ale_loclist_msg_format = '%code: %%s'
let g:ale_lsp_root = {}
let g:ale_max_buffer_history_size = 20
let g:ale_max_signs = -1
let g:ale_maximum_file_size = v:null
let g:ale_open_list = 0
let g:ale_pattern_options = v:null
let g:ale_pattern_options_enabled = v:null
let g:ale_set_balloons = 0
let g:ale_set_highlights = 1
let g:ale_set_loclist = 1
let g:ale_set_quickfix = 0
let g:ale_set_signs = 1
let g:ale_sign_column_always = 0
let g:ale_sign_error = '!'
let g:ale_sign_info = '1'
let g:ale_sign_offset = 1000000
let g:ale_sign_style_error = '!'
let g:ale_sign_style_warning = '1'
let g:ale_sign_warning = '1'
let g:ale_sign_highlight_linenrs = 0
let g:ale_statusline_format = v:null
let g:ale_type_map = {}
let g:ale_use_global_executables = 1
let g:ale_virtualtext_cursor = 0
let g:ale_warn_about_trailing_blank_lines = 1
let g:ale_warn_about_trailing_whitespace = 1
Command History:
(executable check - success) gofmt
(finished - exit code 0) ['/bin/zsh', '-c', '''gofmt'' -e ''/var/folders/tj/7m0xyx914_3c4wwcjf9g_b3h0000gn/T/nvimVHaSwP/2/main.go''']
<<<NO OUTPUT RETURNED>>>
(executable check - success) golint
(finished - exit code 0) ['/bin/zsh', '-c', '''golint'' ''/var/folders/tj/7m0xyx914_3c4wwcjf9g_b3h0000gn/T/nvimVHaSwP/3/main.go''']
<<<NO OUTPUT RETURNED>>>
Related .vimrc configuration for ALE:
let g:ale_linters = {
\ 'sh': [],
\ 'bash': [],
\ 'python': [],
\ 'javascript': ['flow-language-server', 'eslint'],
\ 'typescript': ['tslint'],
\ 'go': ['golint', 'gopls'],
\ 'vue': ['eslint']
\}
let g:ale_fixers = {'javascript': ['eslint']}
let g:ale_sign_warning='!'
let g:ale_sign_error='!'
" only run explicit linters specified above
let g:ale_linters_explicit = 1
let g:ale_fix_on_save = 1
This is because ALE is unable to find the root of the project when you create it inside GOPATH. When using go module the project contains a go.mod file that ALE uses to determine the root path.
See discussion here https://github.com/dense-analysis/ale/issues/2456 and here https://github.com/dense-analysis/ale/issues/2795
Possible solutions are:
- Set g:ale_lsp_root. Check the ale help and the discussions above for details.
- Add a .git directory to the root of the project.
- Add a go.mod file to the root of the project.
This is because ALE is unable to find the root of the project when you create it inside GOPATH. When using go module the project contains a go.mod file that ALE uses to determine the root path.
See discussion here #2456 and here #2795
Possible solutions are:
- Set g:ale_lsp_root. Check the ale help and the discussions above for details.
- Add a .git directory to the root of the project.
- Add a go.mod file to the root of the project.
Thank you @hsanson. I just spent an hour trying to get gopls to work and all I had to do was add a go.mod file!