概述

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 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 个坑, 耗费了大半天的时间…

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

  1. setup 命令中防火墙配置选项无法打开

    故障提示 1.1 如何让setup 命令中防火墙配置生效 1.1.1 CentOS系统找不到setup命令工具的解决方法 yum -y install setuptool #安装setup命令工具 y ...

  2. SiteMesh在项目中的配置

    SiteMesh在项目中的配置 首先在web.xml里面增加siteMesh的配置: <filter> <filter-name>sitemesh</filter-nam ...

  3. golang学习笔记8 beego参数配置 打包linux命令

    golang学习笔记8 beego参数配置 打包linux命令 参数配置 - beego: 简约 & 强大并存的 Go 应用框架https://beego.me/docs/mvc/contro ...

  4. git在eclipse中的配置 转载

    git在eclipse中的配置 转载 一_安装EGIT插件 http://download.eclipse.org/egit/updates/ 或者使用Eclipse Marketplace,搜索EG ...

  5. How to Configure Eclipse for Python --- 在eclipse中如何配置pydev

    From: http://www.rose-hulman.edu/class/csse/resources/Eclipse/eclipse-python-configuration.htm Pytho ...

  6. tp5中nginx配置

    首先tp5的访问目录指向到webroot/public文件夹中. thinkphp的url访问:http://serverName/index.php(或者其它应用入口文件)/模块/控制器/操作/[参 ...

  7. vue-cli中webpack配置解析

    版本号 vue-cli 2.8.1 (终端通过vue -V 可查看) vue 2.2.2 webpack 2.2.1 目录结构 ├── README.md ├── build │ ├── build. ...

  8. golang多个项目时如何配置GOPATH,使用gb包依赖管理工具,不同项目配置不同的GOPATH的

    golang多个项目时如何配置GOPATH,使用gb包依赖管理工具,不同项目配置不同的GOPATH的 1:执行脚本setGoPath.sh#!/bin/bashif [[ $GOPATH =~ .*$ ...

  9. maven的安装、路径配置、修改库文件路径和eclipse中的配置、创建maven工程。

    注:本文来源于:杨四郎2018  <maven的安装.路径配置.修改库文件路径和eclipse中的配置.创建maven工程> 一.maven的安装 首先,先到官网去下载maven.这里是官 ...

随机推荐

  1. mysql8报错解析

    1. 场景描述 想把测试数据导一份到本地使用,乱入装了mysql8,使用springboot项目启动的时候报: java.sql.SQLException: The server time zone ...

  2. Oracle define用法简介教程

    目录 1.define常量用法 2.&和&&符号用法 继上一篇博客Oracle绑定变量学习笔记,再写一篇define变量的简单教程 @ 1.define常量用法 注意:defi ...

  3. 【mysql】You must reset your password using ALTER USER statement before executing this statement. 报错处理

    1.问题:登陆mysql以后,不管运行任何命令,总是提示这个 mysql> select user,authentication from mysql.user; ERROR 1820 (HY0 ...

  4. php捕获Fatal error错误与异常处理

    php中的错误和异常是两个不同的概念. 错误:是因为脚本的问题,比如少写了分号,调用未定义的函数,除0,等一些编译语法错误. 异常:是因为业务逻辑和流程,不符合预期情况,比如验证请求参数,不通过就用 ...

  5. IDA中查看某函数引用问题

    按X键,即可列出哪个部分引用该函数.

  6. python爬虫三大解析库之XPath解析库通俗易懂详讲

    目录 使用XPath解析库 @(这里写自定义目录标题) 使用XPath解析库 1.简介   XPath(全称XML Path Languang),即XML路径语言,是一种在XML文档中查找信息的语言. ...

  7. find命令通过排序只保留最新的文件目录

    find /usr/local/canal/logs/example -type d -name "*-*" | sort -nr | awk '{if (NR>=2){pr ...

  8. 用BAPI_ACC_DOCUMENT_POST过账生成凭证

    根据前台需要输入参数,在bapi里面传值,不同业务所需参数不同. dome1: "bapi结构赋值     LOOP AT lt_item INTO lw_item.       wa_do ...

  9. python中字符串

    字符串:可用单引号 双引号 三引号 来表示 可用来定义国籍,姓名,家庭住址等选项:#.join 把可迭代的对象转化成字符串 (字符串,列表,元组,字典等),列表 元组 合并为字符串,字典合并的是key ...

  10. ubuntu 安装elasticsearch

    elasticsearch简介  环境准备 elasticsearch:7.0.0 kibana          :7.0.0 安装 1.新创建普通用户 elasticsearch不能用root账号 ...