使用 asdf 在 Linux (WSL) 上搭建不同的语言环境
在服务器上运行应用程序或构建二进制文件时,可能需要特定版本的编程语言平台。如果事先设计为可以在Docker中运行,那么只需要使用Docker即可,但并不是所有情况都适用。
在这种情况下,经常被使用的是***环境的版本管理工具。
环境管理工具
只需要提供一种选择:
最初似乎是由rbenv开始的,但现在已经被移植到了各种不同的语言中。
它的功能大致相同,
-
- 特定のバーションを取得 (ビルド)
-
- グローバルに利用するバージョンの管理
-
- フォルダ毎にバージョンを固定
ローカルに何かしらの dotfile を置き、そこに設定する
環境変数で切り替える
shims の管理
然而,由于每种语言都需要单独获取**env并进行shell配置,这样做很麻烦。所以,在这种情况下,被广泛使用的是管理**env的anyenv。
不过,尽管有一些以env为基础的系统也存在停机维护的问题,也有一些不满意的地方。
因此,我选择了使用asdf这个工具。
嗄得夫
asdf 是一个用于管理不同程序语言和工具的执行环境和SDK版本的工具。
https://github.com/asdf-vm/asdf
可以在以下网址将可管理的插件一览显示出来:
https://github.com/asdf-vm/asdf-plugins#plugin-list
通过查看列表就可以理解,它不仅仅是为了管理编程语言。
kubectl、bazel等CLI工具,以及Elasticsearch、MongoDB等中间件也可以奇怪地处理。
但是,这次只针对编程语言平台。
目前没有提供越南语的自然语言处理模型
我试着提取出自己所了解的语言。
2018年12月至今,我们正在积极进行维护,并且似乎还将支持新的语言。
在最新技术方面,例如GraalVM等。
安装
步骤很简单
$ git clone https://github.com/asdf-vm/asdf.git ~/.asdf
# ついでに、プラグインでよく使われるパッケージをインストールしておく
$ sudo apt-get install -y automake autoconf libreadline-dev libncurses-dev libssl-dev libyaml-dev libxslt-dev libffi-dev libtool unixodbc-dev
只需要将其添加到您的 Shell 中即可。我使用的是fisher。
$ echo 'source ~/.asdf/asdf.fish' >> ~/.config/fish/config.fish
$ mkdir -p ~/.config/fish/completions; and cp ~/.asdf/completions/asdf.fish ~/.config/fish/completions
$ source ~/.asdf/asdf.fish
就这样结束吧。
$ asdf --version
# v0.6.2
试一试
Node.js -> 节点.js
首先,用Node.js进行挑战,让它更容易理解。
$ asdf plugin-add nodejs
# 既に入っているなら、アップデート
$ asdf plugin-update nodejs
# バージョンリストを取得
$ asdf list-all nodejs
# 0.10.0
# 0.10.1
# ....
# インストール
$ asdf install nodejs 10.10.0
$ asdf install nodejs 11.3.0
# 不要ならアンインストール
$ asdf uninstall nodejs 9.11.0
尝试全球选择
$ asdf global nodejs 11.3.0
$ node -v
# v11.3.0
# 現在のグローバルなバージョン
$ asdf current nodejs
# 11.3.0 (set by /home/username/.tool-versions)
# インストールされたリストを一覧
$ asdf list nodejs
# 10.10.0
# 11.3.0
这一次我们尝试根据每个项目进行选择。
$ cd ./some_project_folder
$ asdf local nodejs 10.10.0
$ node -v
# v10.10.0
# ローカル設定は .tool-versions に保存
$ cat .tool-versions
# nodejs 10.10.0
# ディレクトリを抜ければ、もとに戻る
$ cd ..
$ node -v
# v11.3.0
顺便提一下,关于shims的情况如何,
$ which node
# /home/username/.asdf/shims/node
$ cat /home/username/.asdf/shims/node
# #!/usr/bin/env bash
# # asdf-plugin: nodejs
# # asdf-plugin-version: 11.3.0
# # asdf-plugin-version: 10.10.0
# exec /home/username/.asdf/bin/private/asdf-exec nodejs bin/node "$@"
# 元のフォルダの位置
$ asdf where nodejs
# /home/username/.asdf/installs/nodejs/11.3.0
# 貼り直し
$ asdf reshim nodejs
只要能做到这一点就足够了。
去
接下来,我要尝试用Go编写代码。
$ asdf plugin-add golang
# バージョンリストを取得
$ asdf list-all golang
# 1.2.2
# 1.3
# ....
# インストール
$ asdf install golang 1.11.2
$ asdf global nodejs 1.11.2
$ go version
# go version go1.11.2 linux/amd64
$ go env
# GOARCH="amd64"
# GOBIN=""
# GOCACHE="/home/username/.cache/go-build"
# GOEXE=""
# GOFLAGS=""
# GOHOSTARCH="amd64"
# GOHOSTOS="linux"
# GOOS="linux"
# GOPATH="/home/username/.asdf/installs/golang/1.11.2/packages"
# GOPROXY=""
# GORACE=""
# GOROOT="/home/username/.asdf/installs/golang/1.11.2/go"
# GOTMPDIR=""
# GOTOOLDIR="/home/username/.asdf/installs/golang/1.11.2/go/pkg/tool/linux_amd64"
# GCCGO="gccgo"
# CC="gcc"
# CXX="g++"
# CGO_ENABLED="1"
# GOMOD=""
# CGO_CFLAGS="-g -O2"
# CGO_CPPFLAGS=""
# CGO_CXXFLAGS="-g -O2"
# CGO_FFLAGS="-g -O2"
# CGO_LDFLAGS="-g -O2"
# PKG_CONFIG="pkg-config"
# GOGCCFLAGS="-fPIC -m64 -pthread -fmessage-length=0 -fdebug-prefix-map=/tmp/go-build209186154=/tmp/go-build -gno-record-gcc-switches"#
如果 GOROOT 或 GOPATH 不存在,当执行 asdf-exec 时,在 shims 目录中将设置 $ASDF_INSTALL_PATH/go 和 $ASDF_INSTALL_PATH/packages。
实际尝试后,$ASDF_INSTALL_PATH变为/home/username/.asdf/installs/golang/1.11.2/。
如果普通地设置为set -x GOPATH $HOME/go,那么这个设置将会被优先使用。
Python (一种)编程语言
Python似乎只是在内部使用pyenv,并与asdf的接口相适应。
Java(JDK)
Java的list-all命令只能显示固定版本,可选择的OpenJDK版本仅有openjdk-10.0.2、openjdk-11和openjdk-11.0.1。
嗯,如果考虑到支持期限,并且选择不支持10以下的版本,或者也没办法吧。
顺便提一下,在OracleJDK中仍然存在着版本8。
Rust和Haskell应该如何处理这个问题。
举个例子,Rust 有 rustup,Haskell 则有 stack。
以下是其中一种汉语表达方式:
这些东西。
-
- 公式 or デファクトスタンダードなプラットフォームバージョン管理ツール
-
- ツールは安定し、使いやすく、メンテナンスもアクティブに続いている
-
- ネット上の技術情報がそのツール利用を前提とするものが多い
- バージョン管理以外にも、重要な役割が存在する
在这种情况下,是否需要通过外部工具(例如asdf)来实现管理?
所以,Rust 和 Haskell 都乖乖地使用 rustup和stack。
第三方制作的插件
如果你喜欢的语言没有提供支持,你也可以自己编写插件进行添加。
$ asdf plugin-add <name> <git-url>
只要有“最低限、list-all和install”,就可以快速地制作出来。
印象
使用时,有一种与手感良好的感觉。
编译版本信息也很完善,支持的语言也很多。
说起来,与使用 Scoop 也有相似的感觉。
结束语
这篇文章表达了个人观点,不代表所属组织的立场。