Emacs环境隔离之——maple-env

在使用Emacs时,会有很多依赖,比如Python依赖于flake8isortpython-language-server等,Golang依赖于golang.org/x/tools/cmd/goplsgithub.com/haya14busa/gopkgs/cmd/gopkgs等

想要安装这些依赖,必须手动进行安装,use-package用户可使用ensure-system-package,但非常不幸的是,这些依赖很大程度上会污染我的电脑环境,毕竟像python-language-serverflake8这类的package,我除了在Emacs里会用到,平时根本用不到(除非同时使用Emacs和其它编辑器或IDE)

所以,我写了一个

用来实现Emacs依赖环境隔离,使用方式

git clone https://github.com/honmaple/emacs-maple-env ~/.emacs/site-lisp/maple-env
(use-package maple-env
  :ensure nil
  :hook (after-init . maple-env-mode)
  :config
  (setq maple-env:python-packages
        '("yapf" "flake8" "isort" "python-language-server")
        maple-env:golang-packages
        '("github.com/rogpeppe/godef"
          "github.com/golang/lint/golint"
          "github.com/haya14busa/gopkgs/cmd/gopkgs"
          "golang.org/x/tools/cmd/gopls")
        maple-env:npm-packages
        '("js-beautify"))
  ;; 手动调用(maple-env:init)以安装依赖环境
)

更多自定义详见customize-group maple-env

3 个赞

看了你写的 如何保持一个干净的系统,推荐一个通用的 version manager asdf

use-package的作者用nix来管理所有依赖的

@BlindingDark @yuanchuyouzuoshan 这两个的目的不一样吧,我的目的只是正常环境与Emacs环境隔离,并不是各种环境的版本管理,就像Python一样,我最多区分一下python2和python3,使用virtualenv就可以做到,感觉asdf和nix有些复杂了,至少我可以把控.bashrc里的各种变量

我偶然看到asdf,第一个想起的是超算上都有的模块管理系统 :joy:

我常用的是Lmod: GitHub - TACC/Lmod: Lmod: An Environment Module System based on Lua, Reads TCL Modules, Supports a Software Hierarchy ,基于Lua的。但Lmod并不是超算上最盛行的,用得最多的是Modules: GitHub - cea-hpc/modules: Environment Modules: provides dynamic modification of a user's environment ,基于Tcl的。两者的主要功能类似,相应的命令也差不多,大多数情况下,对使用者来说,从Lmod更换到Modules,或者从Modules更换到Lmod,几乎没有什么迁移成本。但如果想自己编写配置文件的话,两者的区别较大(但需要编写配置文件的主要都是超算的工作人员,而不是使用者)。

一般的超算上都是有好几个不同版本的gcc,Intel C/C++ compiler,python的,必须要使用模块管理系统。除此之外,好多软件也是有不同版本的,而且不同的版本不能同时存在。在使用Lmod的超算上,我想查看有几个python可用的话,直接“module spider python”。假设输出中有两个结果,“python/3.6.8”和“python/3.7.0”。我在未加载任何模块的情况下“module load python/3.6.8”,就可以使用python 3.6.8。我想查看目前使用了哪些模块的话,“module list”就行。想查看哪些模块可以被加载的话,“module avail”就行。我想切换到“python/3.7.0”这个模块的话,就是“module unload python/3.6.8”、“module load python/3.7.0”。

模块最大的好处是依赖关系可以自动处理。如果想知道的话,可以参考 https://sea.ucar.edu/sites/default/files/talk.pdf 。我自己也写过配置文件,就是对着这个网页 https://lmod.readthedocs.io/en/latest/050_lua_modulefiles.html 。我当时使用了prepend_path、pathJoin、pushenv这几个功能就写出了一个能用的配置文件。依赖关系的处理,就是参考这个网页 https://lmod.readthedocs.io/en/latest/098_dependent_modules.html

我之前写过的一个配置文件就是这样的(我删去了依赖关系相关的内容):

local package_root = “/home/shaik/gmx2018.8” execute{cmd="source " … pathJoin(package_root, “bin/GMXRC”), modeA={“load”}} –prepend_path(“PATH”, pathJoin(package_root, “bin”))

对应的bash命令就是 source /home/shaik/gmx2018.8/bin/GMXRC export PATH=/home/shaik/gmx2018.8/bin:$PATH

往往同一个软件有了新版本后,只需要修改一下旧版本的配置文件的第一行的路径,再根据编译时的设置,调整一下依赖关系即可,然后将新版本的配置文件跟旧版本的配置文件放在同一个目录下即可。当然,这个目录的父目录必须在MODULEPATH这个环境变量里面。

1 个赞