使用 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 也有相似的感觉。

结束语

这篇文章表达了个人观点,不代表所属组织的立场。

广告
将在 10 秒后关闭
bannerAds