golang module 在 spacemcs 中的配置

概述

golang 官方的包管理从 1.11 版本就开始支持了, 之前尝试了几次, 效果都不理想, 就一直用 dep 来管理 package.

最近 1.13 版本发布了, 使用 go module 的官方管理方式越来越多, dep 也早就不在继续开发了. 鉴于此, 是时候把 golang 的包管理方式迁移到 go module 上来了.

我一直是用 spacemacs 来开发各种应用, 所以本文也是介绍如何在 spacemacs 中配置 golang module 的开发环境.

配置方法

go module 其实本身是不需要什么配置, 这里的配置其实为了更方便的编码而做的 spacemacs 配置. 能够让它支持自动补全, 代码调转等等开发时常用的操作.

需要的软件

使用 go module, golang 的工程不用在放在 GOPATH 下, 所有传统的 gocode 不能再用来做代码补全这些了. 我们这里采用 gopls 来代替 gocode.

出来 golang 1.13, 额外需要的软件就是 gopls

安装好 golang 1.13, 安装 gopls 非常简单:

$ GO111MODULE=on go get golang.org/x/tools/[email protected]

spacemacs 的配置

go layer

spacemacs 的 develop 分支默认继承了 lsp 的功能. LSP 是什么 所以配置起来很简单, 在 dotspacemacs-configuration-layers 下配置:

dotspacemacs-configuration-layers
'(
  ... ...
  lsp
  ;; ----------------------------------------------------------------
  ;; Example of useful layers you may want to use right away.
  ;; Uncomment some layer names and press `SPC f e R' (Vim style) or
  ;; `M-m f e R' (Emacs style) to install them.
  ;; ----------------------------------------------------------------

  (go :variables
      go-backend 'lsp
      go-tab-width 8
      godoc-at-point-function 'godoc-gogetdoc)
 ... ...
 )

lsp-mode

lsp-mode 是 emacs 对 lsp 的封装, 参考其中 golang 的部分, 在 dotspacemacs/user-config 中配置:

;; lsp
(use-package lsp-mode
  :hook (go-mode . lsp-deferred)
  :commands (lsp lsp-deferred))

(setq lsp-auto-guess-root nil)
(setq lsp-ui-doc-enable nil)
(setq lsp-ui-sideline-enable nil)
(setq lsp-prefer-flymake :none)

project root 设置

使用 go module 之后, golang 项目的目录不一定在 GOPATH 下, 所以定义了个配置 project root 的函数. 当然, 如果不设置, 默认值是 emacs 的 projectile-project-root

;; project path settings
(setq current-project-path (projectile-project-root))

(defun set-project-path (relative-path)
  (interactive
   (list (read-string "relative path: " "." nil nil nil)))
  (setq current-project-path (file-truename relative-path)))

(defun get-project-path ()
  (interactive)
  (message current-project-path))

build/install 快捷键

增加 2 个快捷键, 用来执行 go buildgo install

;; go build/install
(setq default-go-package "")

(defun go-build (&optional pkg)
  (interactive
   (list (read-string (format "Package Name[%s]: " default-go-package) nil nil "")))

  (if (not (string= pkg ""))
      (setq default-go-package pkg))

  (if (string= current-project-path "")
      (message "You MUST set current-project-path FIRST!")
    (projectile-with-default-dir current-project-path
      (projectile-run-compilation (concat "go build " default-go-package))))
  )

(defun go-install (&optional pkg)
  (interactive
   (list (read-string (format "Package Name[%s]: " default-go-package) nil nil "")))

  (if (not (string= pkg ""))
      (setq default-go-package pkg))

  (if (string= current-project-path "")
      (message "You MUST set current-project-path FIRST!")
    (projectile-with-default-dir current-project-path
      (projectile-run-compilation (concat "go install " default-go-package))))
)

;; set shortcuts
(spacemacs/set-leader-keys-for-major-mode 'go-mode
  "xi" 'go-install)

(spacemacs/set-leader-keys-for-major-mode 'go-mode
  "xb" 'go-build)

go buildgo install 的快捷键分别是: SPC m x bSPC m x i

使用中遇到的坑

在尝试使用的过程中, 遇到 2 个坑, 耗费了大半天的时间… :(

错误内容: LSP : main.go not in project or it is blacklisted

在 spacemacs 的 ****Message**** buffer 中, 提示 LSP : main.go not in project or it is blacklisted 几近波折, 才发现不知道什么时候, 当前的项目被加入到 blacklist 中了…

解决方法:

  1. M-X lsp-workspace-blacklist-remove
  2. 找到项目所在的文件夹, 然后选择它, 将它从 blacklist 中移除即可

错误内容: no AST for file:///..../foo.go

如果项目本身就是 golang 工程的话, 一般不会出现这个问题, 我有个项目, golang 工程是其中的一部分, 工程结构大致如下:

.
├── backend
│?? └── this-is-golang-project-root
├── deploy
│?? ├── builder
│?? └── docker-compose.yml
├── frontend
│?? └── ui
└── README.md

golang 工程不在项目的根目录, 使用时在 spacemacs 的 ****Message**** buffer 中, 提示: no AST for file:///..../foo.go

解决方式:

  1. 设置 (setq lsp-auto-guess-root nil)
  2. M-x set-project-path
  3. 设置 golang project path, 设置这个的目的是为了使用 SPC m x bSPC m x i 来随时执行 go buildgo install

原文地址:https://www.cnblogs.com/wang_yb/p/11505508.html

时间: 2024-11-09 00:48:48

golang module 在 spacemcs 中的配置的相关文章

SiteMesh在项目中的配置

SiteMesh在项目中的配置 首先在web.xml里面增加siteMesh的配置: <filter> <filter-name>sitemesh</filter-name> <filter-class> com.opensymphony.module.sitemesh.filter.PageFilter </filter-class> </filter> <filter-mapping> <filter-name&

vue-cli中webpack配置解析

版本号 vue-cli 2.8.1 (终端通过vue -V 可查看) vue 2.2.2 webpack 2.2.1 目录结构 ├── README.md ├── build │ ├── build.js │ ├── check-versions.js │ ├── dev-client.js │ ├── dev-server.js │ ├── utils.js │ ├── vue-loader.conf.js │ ├── webpack.base.conf.js │ ├── webpack.de

Golang Module快速入门

前言: 在Golang1.11之前的版本中,官方没有提供依赖和包管理工具.开发者通常会使用vendor或者glide的方式来管理依赖(也有直接使用GOPATH多环境方式),而在Golang1.11之后官方终于出了名为go modules的版本管理机制. 注意: 在Golang1.11版本中需要使用export GO111MODULE=on来显式开启go module 在Golang1.12之后默认开启了module Golang Module快速入门 初始化项目 基本命令 go mod down

JNDI在Tomcat中的配置

使用JNDI获取连接对象 java:comp/env/jdbc/news 这段为固定写法java:comp/env/ 在Tomcat中的配置 配置在:context.xml文件内 F:\apache-tomcat-7.0.68-windows-x64\apache-tomcat-7.0.68\conf\context.xml ---------mySQL<Resource name="jdbc/news"auth="Container" type="

DICOM医学图像处理:DCMTK在VS2012中的配置

背景: 最近由于项目需要,将原本的开发IDE环境由VS2008升级到了VS2012.本以为编译完成后的DCMTK开源库可以直接从VS2008移植到VS2012.但是通过项目属性添加完包含目录和依赖库后,编译会出现大量的链接错误(大多是跟dcmdata.lib.oflog.lib有关). 解决方法: 重新按照原本的博客前辈柳北风儿(大神目前已经博客转移到网易:http://blog.163.com/[email protected]/),利用CMake工具,选择VS2012本地编译器对DCMTK3

web.xml的配置中&lt;context-param&gt;配置作用

<context-param>的作用: web.xml的配置中<context-param>配置作用1. 启动一个WEB项目的时候,容器(如:Tomcat)会去读它的配置文件web.xml.读两个节点: <listener></listener> 和 <context-param></context-param> 2.紧接着,容器创建一个ServletContext(上下文),这个WEB项目所有部分都将共享这个上下文. 3.容器将&l

在CentOS6.4中安装配置LAMP环境的详细步骤

原文:在CentOS6.4中安装配置LAMP环境的详细步骤 本文详细介绍了CentOS6.4系统中安装LAMP服务并对其进行配置的过程,即安装Apache+PHP+Mysql,参照了网上大神的设置,其他Linux发行系统可以参考~ 在本文中部分命令操作需要root权限,输入‘su -’命令后输入密码即可切换root身份. 一.修改设置对安装做准备 1. 防火墙设置 设置/etc/sysconfig/iptables文件允许80端口和3306端口.因为80端口是http协议所使用的端口,如果防火墙

Tomcat插件与Jetty插件在MyEclipse中的配置

-Djetty.port=8101 jetty:run tomcat6:run <plugin> <groupId>org.apache.tomcat.maven</groupId> <artifactId>tomcat6-maven-plugin</artifactId> <version>2.2</version> <configuration> <port>8888</port>

XCode中Architecturs配置及常见问题

http://lanvige.github.io/2014/03/19/architecturs-in-xcode/ XCode 5.1升级后因arm64和CocoaPods的原因,痛了一天,终于解决了问题,同时也记录下这次的学习成果. ARMv6/7/7s & ARM64 在了解Architecture之前,先来认识这几个名字.armv6, armv7, armv7s, arm64是ARM CPU的不同指令集,就像CPU内潜入的软件版本.其在iPhone处理器型号为A4, A8… arm 芯片