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/gopls@latest
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 build 和 go 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 build 和 go install 的快捷键分别是: SPC m x b 和 SPC m x i
使用中遇到的坑
在尝试使用的过程中, 遇到 2 个坑, 耗费了大半天的时间…
golang module 在 spacemcs 中的配置的更多相关文章
- setup 命令中防火墙配置选项无法打开
故障提示 1.1 如何让setup 命令中防火墙配置生效 1.1.1 CentOS系统找不到setup命令工具的解决方法 yum -y install setuptool #安装setup命令工具 y ...
- SiteMesh在项目中的配置
SiteMesh在项目中的配置 首先在web.xml里面增加siteMesh的配置: <filter> <filter-name>sitemesh</filter-nam ...
- golang学习笔记8 beego参数配置 打包linux命令
golang学习笔记8 beego参数配置 打包linux命令 参数配置 - beego: 简约 & 强大并存的 Go 应用框架https://beego.me/docs/mvc/contro ...
- git在eclipse中的配置 转载
git在eclipse中的配置 转载 一_安装EGIT插件 http://download.eclipse.org/egit/updates/ 或者使用Eclipse Marketplace,搜索EG ...
- How to Configure Eclipse for Python --- 在eclipse中如何配置pydev
From: http://www.rose-hulman.edu/class/csse/resources/Eclipse/eclipse-python-configuration.htm Pytho ...
- tp5中nginx配置
首先tp5的访问目录指向到webroot/public文件夹中. thinkphp的url访问:http://serverName/index.php(或者其它应用入口文件)/模块/控制器/操作/[参 ...
- vue-cli中webpack配置解析
版本号 vue-cli 2.8.1 (终端通过vue -V 可查看) vue 2.2.2 webpack 2.2.1 目录结构 ├── README.md ├── build │ ├── build. ...
- golang多个项目时如何配置GOPATH,使用gb包依赖管理工具,不同项目配置不同的GOPATH的
golang多个项目时如何配置GOPATH,使用gb包依赖管理工具,不同项目配置不同的GOPATH的 1:执行脚本setGoPath.sh#!/bin/bashif [[ $GOPATH =~ .*$ ...
- maven的安装、路径配置、修改库文件路径和eclipse中的配置、创建maven工程。
注:本文来源于:杨四郎2018 <maven的安装.路径配置.修改库文件路径和eclipse中的配置.创建maven工程> 一.maven的安装 首先,先到官网去下载maven.这里是官 ...
随机推荐
- Tensorflow分布式部署和开发
关于tensorflow的分布式训练和部署, 官方有个英文的文档介绍,但是写的比较简单, 给的例子也比较简单,刚接触分布式深度学习的可能不太容易理解.在网上看到一些资料,总感觉说的不够通俗易懂,不如自 ...
- asp.net 使用NPOI读取excel文件
asp.net 使用NPOI读取excel文件内容 NPOI下载地址:NPOI public class ExcelHelper { /// <summary> /// 读取Excel文件 ...
- python基础(30):黏包、socket的其他方法
1. 黏包 1.1 黏包现象 让我们基于tcp先制作一个远程执行命令的程序(命令ls -l ; lllllll ; pwd) 同时执行多条命令之后,得到的结果很可能只有一部分,在执行其他命令的时候又接 ...
- 在python中实现随机选择
想从一个序列中随机抽取若干元素,或者想生成几个随机数. random 模块有大量的函数用来产生随机数和随机选择元素.比如,要想从一个序列中随机的抽取一个元素,可以使用random.choice() : ...
- 资深程序员:学Python我推荐你用这几款编辑器
Python使用什么编辑比较好,Python编辑器推荐 各位 Pythoner 好啊!在这个烦躁的时代,相聚就是缘分,很高兴各位 Pythoner 能相聚于此,希望接下来的路,我们一起走下去,使用 P ...
- PHP面试题2019年京东工程师面试题及答案解析
一.单选题(共28题,每题5分) 1.Apache与Nginx大访问下性能描述正确的是? A.Apache所采用的epoll网络I/O模型非常高效 B.Nginx使用了最新的kqueue和select ...
- js对象比较
使用闭包实现 js 对象按指定属性进行大小比较 需要比较的对象 let obj1 = { name:'张三', age:19 }; let obj2 = { name:'李四', age:22 }; ...
- 7-SQL-join连接
(1) 内连接 关键字:inner join on select * from a_table inner join b_table on a_table.a_id = b_table.b_id; / ...
- shell脚本模板----自动生成开头注释信息
每当我们新建一个shell脚本都要去写一些繁琐的注释信息,这会浪费掉我们很多的时间,有没有感觉很痛苦呢? 哈哈 下面给大家分享一个shell脚本的模板文件,把它拷贝到用户的家目录下并命名成 .vim ...
- 渗透测试学习 十九、 XSS跨站脚本漏洞详解 续2
二阶注入环境搭建 74cms 3.4 直接将源码放在PHPstudy的www路径下,在地址栏中输入127.0.0.1回车 然后进入网站首页,在填写简历里面存在二阶注入 先注册一个账号 创建简历 前面的 ...