Xvm is a wrapper for popular sdk (Go/Node/...) written in Go. It automatically picks a good version of sdk given your current working directory, downloads it from the official server (if required) and then transparently passes through all command-line arguments to the real sdk binary. You can call it just like you would call go/node/java/...
With xvm you can manage versions of the sdk in your code and keep scenarios like development and CI pipeline using the same version at all times, which helps with reproducible build.
In addition to this, you can also easily switch between different versions without the tedious installation process, which is very useful when you need to manage multiple projects working under different versions at the same time.
You can download Xvm binary on our Releases page and add it to your PATH manually.
See the following to ensure that the command xvm is available.
For Macos/Linux:
# 1. Download the file to /path/to/xvm
$ wget -O /path/to/xvm {url}
# 2. Add an executable permission
$ chmod +x /path/to/xvm
# 3. Create a executable soft link
$ ln -s /path/to/xvm /usr/local/bin/xvm
# 4. Try to get help for xvm
$ xvm --helpFor Windows:
# 1. Create a executable soft link
$ mklink C:\WINDOWS\system32\xvm.exe \to\path\xvm.exe
# 2. Try to get help for xvm
$ xvm --helpActivate Golang/Node/Java:
$ xvm activate go node java --add_binpathYou've got Golang/Node/Java that can be any version.
Open a new terminal and call the following command to experience the xvm-wrapped sdk:
# Uses the latest version of the go
$ go version
# Uses the latest version of the java
$ java -version
# Uses the latest version of the node
$ node --version
# Uses the latest version of the npm
$ npm --versionrule: {env.XVM_GO_VERSION} > {project}/.goversion > {home}/.goversion > {project}/go.mod#version
If the environment variable XVM_GO_VERSION is set, it will use the version specified in the value.
If the .goversion file in the root of your project has the following content, the version of Go will always be 1.21.0 in your project:
1.21.0
If .goversion is not found in the project root directory, it will try to find it in the user's home.
If the go.mod file in the root of your project has the following content, the version of Go will always be 1.21.0 in your project:
go 1.21.0
Note that before 1.21.0, the version in the go.mod file allowed only two sets of numbers, such as 1.17, so the Go version in the project would also be 1.17.
rule: {env.XVM_NODE_VERSION} > {project}/.nodeversion > {home}/.nodeversion
If the environment variable XVM_NODE_VERSION is set, it will use the version specified in the value.
If the .nodeversion file in the root of your project has the following content, the version of Node will always be 20.5.1 in your project:
20.5.1
If .nodeversion is not found in the project root directory, it will try to find it in the user's home.
rule: {env.XVM_JAVA_VERSION} > {project}/.javaversion > {home}/.javaversion
If the environment variable XVM_JAVA_VERSION is set, it will use the version specified in the value.
If the .javaversion file in the root of your project has the following content, the version of Java will always be 20.0.2 in your project:
20.0.2
If .javaversion is not found in the project root directory, it will try to find it in the user's home.
By default, Xvm gets all available versions through the official indexing api and retrieves releases from official mirror.
Unless otherwise specified, with all SDKS you can override the indexing api with environment variable XVM_{SDK}_API and the mirror with environment variable XVM_{SDK}_MIRROR.
The default mirror is https://go.dev/dl, overridden with the environment variable XVM_GO_MIRROR.
If you do not configure the environment variable XVM_GO_API, the indexing api defaults to {mirror}/?mode=json&include=all
The default mirror is https://nodejs.org/dist, overridden with the environment variable XVM_NODE_MIRROR.
If you do not configure the environment variable XVM_NODE_API, the indexing api defaults to {mirror}/index.json
The default distribution is zulu, overridden with the environment variable XVM_JAVA_DISTRIBUTION.
Xvm plans to support the following distribution of JDKS:
| Distribution | Description | Official site | License | Supported? |
|---|---|---|---|---|
zulu |
Azul Zulu OpenJDK | Link | Link | ✔️ |
oracle |
Oracle JDK | Link | Link | ❌ |
temurin |
Eclipse Temurin | Link | Link | ❌ |
ms |
Microsoft Build of OpenJDK | Link | Link | ❌ |
amazon |
Amazon Corretto Build of OpenJDK | Link | Link | ❌ |
semeru |
IBM Semeru Runtime Open Edition | Link | Link | ❌ |
Regardless of the distribution, you can override the mirror with environment variable XVM_JAVA_MIRROR and the indexing API with environment variable XVM_JAVA_INDEXING_API
For zulu, the default mirror is https://cdn.azul.com/zulu/bin, the default indexing api is https://api.azul.com/zulu/download/community/v1.0/bundles/
Run xvm show [sdk] to get more information about xvm.