Spacemacs 开发 Golang 如何设置 GOPATH

自己开发主要开发语言是 Golang,因此项目比较多,怎么样给在 Spacemacs 中给每个项目设置不同的 GOPATH

用法:

(setq hacking-packages
      '(
        (goenv :location (recipe
                          :fetcher github
                          :repo "MephistoMMM/goenv"))))

(defun hacking/init-goenv ()
  "Add Goenv."
  (use-package goenv
    :init
    (with-eval-after-load 'go-mode
      (spacemacs/set-leader-keys-for-major-mode 'go-mode "Va" 'goenv-activate)
      (spacemacs/set-leader-keys-for-major-mode 'go-mode "Vd" 'goenv-deactivate))
    ))

没写文档。

模拟 pyvenv ,具体实现方式就是 改 process-environment 这个变量。

十分感谢,我试下。 出现了错误。

设置的如下:

错误如下:

Wrong type argument: strings nil

可能你的 GOPATH 在emacs中原值是空值的缘故吧

我的源 GOPATH 是在 .zshenv 设置的,没有在 .zshrc 设置,可能这样 emacs 的 getenv GOPATH 获的值是空值。

或许你可以尝试一下 https://github.com/purcell/exec-path-from-shell. 如果你已经安装了 exec-path-from-shell, 因为你配置GOPATH.zshenv 的,你可能需要修改 exec-path-from-shell:

;; make Emacs use the $PATH set up by the user's shell
(use-package exec-path-from-shell
  :ensure t
  :init (progn
	  (when(not(eq system-type 'windows-nt))
	    (setq exec-path-from-shell-variables '("RUST_SRC_PATH" "PYTHONPATH","GOPATH"))
	    ;; when it is nil, exec-path-from-shell will read environment variable
	    ;; from .zshenv instead of .zshrc, but makes sure that you put all
	    ;; environment variable you need in .zshenv rather than .zshrc
	    (setq exec-path-from-shell-check-startup-files nil) ;
	    (setq exec-path-from-shell-arguments '("-l" )) ;remove -i read form .zshenv
	    (exec-path-from-shell-initialize)
	    )
	  )
  )

这个是我的配置。

好的,我试试,谢谢

我用的不是Spacemacs,所以你需要做一点适配~

这个包应该是能让 Emacs 读取到 .zshenv,不过还是没有解决我的问题,我想给不同项目设置不同的 GOPATH

我的解决方案是配合 @MephistoMMM 的方案的~

:ok_hand:,不过我改了下他的源码也可以设置了。如果 GOPATH 为空,设置一个默认的就可以了。

defun goenv-activate (directory)
  "Activate the go temporary workspace environment in DRECTORY."
  (interactive "DActivate goenv: ")
  (setq directory (expand-file-name directory)
        goenv-temporary-env-name (file-name-nondirectory directory))
  (goenv-deactivate)

  (if (getenv "GOPATH")
    (setenv "GOPATH" "~/go"))

  (setq goenv-old-process-environment process-environment)
  (let ((path-items (split-string (getenv "GOPATH"))))
    (setq process-environment (append
                               (list
                                (format "GOPATH=%s"
                                        (mapconcat 'identity
                                                   (append (list (car path-items))
                                                           (list directory)
                                                           (cdr path-items))
                                                   ":")))
                               process-environment))
    )
  (setq goenv-temporary-env t)
  )

我升级了一下emacs,也遇到了类似问题

改法和你类似,不过:

  (if (getenv "GOPATH")
    (setenv "GOPATH" "~/go"))

这里有问题,应该改成:

  (if (getenv "GOPATH")
    nil
    (setenv "GOPATH" "~/go"))
1 个赞