<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Hugues Verlin</title>
    <description>The latest articles on DEV Community by Hugues Verlin (@hverlin).</description>
    <link>https://dev.to/hverlin</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F156087%2Fd4fb3c29-e30a-4aca-b98e-9fc1a65e8775.jpeg</url>
      <title>DEV Community: Hugues Verlin</title>
      <link>https://dev.to/hverlin</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/hverlin"/>
    <language>en</language>
    <item>
      <title>Migrating from nvm to mise</title>
      <dc:creator>Hugues Verlin</dc:creator>
      <pubDate>Thu, 21 Nov 2024 02:43:06 +0000</pubDate>
      <link>https://dev.to/hverlin/migrating-from-nvm-to-mise-4mfp</link>
      <guid>https://dev.to/hverlin/migrating-from-nvm-to-mise-4mfp</guid>
      <description>&lt;h2&gt;
  
  
  Table of Contents
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;A brief introduction to mise&lt;/li&gt;
&lt;li&gt;Why migrate from nvm?&lt;/li&gt;
&lt;li&gt;
Migrating from nvm to mise

&lt;ul&gt;
&lt;li&gt;
Example setup &lt;/li&gt;
&lt;li&gt;Stop loading nvm&lt;/li&gt;
&lt;li&gt;Migration Options&lt;/li&gt;
&lt;li&gt;Option A: Clean Installation (Remove nvm)&lt;/li&gt;
&lt;li&gt;Option B: Keep Existing nvm Installations (Symlink)&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h2&gt;
  
  
  A brief introduction to &lt;code&gt;mise&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://mise.jdx.dev/" rel="noopener noreferrer"&gt;mise&lt;/a&gt; is a tool version manager and a task runner. It replaces tools like &lt;code&gt;asdf&lt;/code&gt;, &lt;code&gt;nvm&lt;/code&gt;, &lt;code&gt;pyenv&lt;/code&gt;, &lt;code&gt;sdkman&lt;/code&gt;, &lt;code&gt;rbenv&lt;/code&gt;, ...&lt;/p&gt;

&lt;p&gt;In this post, I will show you how to migrate from &lt;code&gt;nvm&lt;/code&gt; (node-version manager) to &lt;code&gt;mise&lt;/code&gt;. Let's first start with a quick tour of mise.&lt;/p&gt;

&lt;p&gt;If you are using &lt;code&gt;zsh&lt;/code&gt; with &lt;a href="https://ohmyz.sh/" rel="noopener noreferrer"&gt;https://ohmyz.sh/&lt;/a&gt;, here is how you can easily get started with &lt;code&gt;mise&lt;/code&gt;. (This for demonstration purpose only, if you are using another shell, go through the &lt;a href="https://mise.jdx.dev/getting-started.html" rel="noopener noreferrer"&gt;getting-started guide&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;Install &lt;code&gt;mise&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl https://mise.run | sh
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;'eval "$(~/.local/bin/mise activate zsh)"'&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; ~/.zshrc
&lt;span class="nb"&gt;source&lt;/span&gt; ~/.zshrc
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;
  Optionally, you can set up the autocompletion (on "tab")
  &lt;br&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;mise use &lt;span class="nt"&gt;-g&lt;/span&gt; usage

&lt;span class="nb"&gt;mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; ~/.oh-my-zsh/custom/completions
mise completion zsh &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; ~/.oh-my-zsh/custom/completions/_mise

&lt;span class="nb"&gt;source&lt;/span&gt; ~/.zshrc
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;




&lt;/p&gt;

&lt;p&gt;You have now installed &lt;code&gt;mise&lt;/code&gt;. Let's use it to manage &lt;code&gt;node&lt;/code&gt;. It's very similar to &lt;code&gt;nvm&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Install `nodeJS` lts globally&lt;/span&gt;
mise use &lt;span class="nt"&gt;-g&lt;/span&gt; node@lts
node &lt;span class="nt"&gt;-v&lt;/span&gt;
&lt;span class="c"&gt;# v22.x.x&lt;/span&gt;

&lt;span class="c"&gt;# mise does not require shims, the real path is used&lt;/span&gt;
which node
&lt;span class="c"&gt;# ~/.local/share/mise/installs/node/22.x.x/bin/node&lt;/span&gt;

&lt;span class="c"&gt;# we can also install `npm` packages globally and let mise manage them&lt;/span&gt;
mise use &lt;span class="nt"&gt;-g&lt;/span&gt; npm:mocha

&lt;span class="c"&gt;# the list of globally installed tools is stored in ~/.config/mise/config.toml&lt;/span&gt;
&lt;span class="nb"&gt;cat&lt;/span&gt; ~/.config/mise/config.toml
&lt;span class="c"&gt;# [tools]&lt;/span&gt;
&lt;span class="c"&gt;# node = "lts"&lt;/span&gt;
&lt;span class="c"&gt;# "npm:mocha" = "latest"&lt;/span&gt;

&lt;span class="c"&gt;# in this project we will use node 23&lt;/span&gt;
&lt;span class="nb"&gt;mkdir &lt;/span&gt;my-project &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;cd &lt;/span&gt;my-project
mise use node@23
node &lt;span class="nt"&gt;-v&lt;/span&gt;
&lt;span class="c"&gt;# v23.x.x&lt;/span&gt;

&lt;span class="c"&gt;# if we leave the current directory, we are back on node 22&lt;/span&gt;
&lt;span class="nb"&gt;cd&lt;/span&gt; ..
node &lt;span class="nt"&gt;-v&lt;/span&gt; 
&lt;span class="c"&gt;# v22.x.x&lt;/span&gt;

&lt;span class="c"&gt;# mise also supports .nvmrc files&lt;/span&gt;
&lt;span class="nb"&gt;mkdir &lt;/span&gt;nvm-project &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;cd &lt;/span&gt;nvm-project
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"18"&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; .nvmrc
mise &lt;span class="nb"&gt;install
&lt;/span&gt;node &lt;span class="nt"&gt;-v&lt;/span&gt;
&lt;span class="c"&gt;# v18.x.x&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In addition to this, &lt;code&gt;mise&lt;/code&gt; supports &lt;a href="https://mise.jdx.dev/tasks/" rel="noopener noreferrer"&gt;&lt;code&gt;tasks&lt;/code&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Why migrate from &lt;code&gt;nvm&lt;/code&gt;?
&lt;/h2&gt;

&lt;p&gt;NVM (node version manager) is a popular way to install NodeJS. There are others like &lt;code&gt;fnm&lt;/code&gt; or &lt;code&gt;volta&lt;/code&gt; (here is an article that compares &lt;code&gt;mise&lt;/code&gt; with &lt;code&gt;volta&lt;/code&gt;: &lt;a href="https://ricostacruz.com/posts/mise-vs-volta" rel="noopener noreferrer"&gt;https://ricostacruz.com/posts/mise-vs-volta&lt;/a&gt;)&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;While &lt;code&gt;nvm&lt;/code&gt; only manages Node.js versions, mise can handle &lt;a href="https://mise.jdx.dev/dev-tools/" rel="noopener noreferrer"&gt;multiple languages and tools&lt;/a&gt; like python, go, ruby, deno, bun, ... It can also help you to manage binaries from &lt;code&gt;npm&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;mise&lt;/code&gt; supports &lt;a href="https://mise.jdx.dev/tasks/" rel="noopener noreferrer"&gt;&lt;code&gt;tasks&lt;/code&gt;&lt;/a&gt; as well as &lt;a href="https://mise.jdx.dev/environments.html" rel="noopener noreferrer"&gt;environment variables&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;mise&lt;/code&gt; is written in &lt;code&gt;rust&lt;/code&gt; and is faster than &lt;code&gt;nvm&lt;/code&gt;. It won't slow down your shell.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;mise&lt;/code&gt; supports &lt;code&gt;.nvmrc&lt;/code&gt; and &lt;code&gt;.node-version&lt;/code&gt; making it easy to switch&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Migrating from &lt;code&gt;nvm&lt;/code&gt; to &lt;code&gt;mise&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;As indicated above, mise can read &lt;code&gt;.nvmrc&lt;/code&gt; files to determine the required Node.js version.&lt;br&gt;
This will help to migrate from &lt;code&gt;nvm&lt;/code&gt;.&lt;/p&gt;
&lt;h3&gt;
  
  
  Example setup
&lt;/h3&gt;

&lt;p&gt;For the migration example, we will consider the following NodeJS setup:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Node.JS 20 and 22 are installed globally using &lt;code&gt;nvm&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Node 22 is used by default&lt;/li&gt;
&lt;li&gt;There are two projects, one using Node 17 and the other using Node 18&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The project directories contain &lt;code&gt;.nvmrc&lt;/code&gt; files:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;- node-project-17/.nvmrc: 17
- node-project-18/.nvmrc: 18
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;
  Here is what you one might have done using nvm
  &lt;br&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-o-&lt;/span&gt; https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.1/install.sh | bash
&lt;span class="nb"&gt;source&lt;/span&gt; ~/.bashrc

nvm &lt;span class="nb"&gt;install &lt;/span&gt;22
nvm &lt;span class="nb"&gt;install &lt;/span&gt;20
nvm &lt;span class="nb"&gt;alias &lt;/span&gt;default 22

&lt;span class="nb"&gt;mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; node-18-project &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;cd &lt;/span&gt;node-18-project &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"18"&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; .nvmrc &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; nvm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;cd&lt;/span&gt; -
&lt;span class="nb"&gt;mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; node-17-project &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;cd &lt;/span&gt;node-17-project &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"17"&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; .nvmrc &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; nvm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;cd&lt;/span&gt; -
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;




&lt;/p&gt;

&lt;h3&gt;
  
  
  Stop loading &lt;code&gt;nvm&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;If it's not already done, install &lt;code&gt;mise&lt;/code&gt; (see &lt;a href="https://dev.to/getting-started"&gt;Getting Started&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;Open your shell configuration file (&lt;code&gt;.bashrc&lt;/code&gt;, &lt;code&gt;.zshrc&lt;/code&gt;, ...) and remove or comment out the &lt;code&gt;nvm&lt;/code&gt; initialization script:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Comment out or remove these lines&lt;/span&gt;
&lt;span class="c"&gt;# export NVM_DIR="$HOME/.nvm"...&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;then, restart your shell.&lt;/p&gt;

&lt;h3&gt;
  
  
  Migration Options
&lt;/h3&gt;

&lt;p&gt;You now have two options for migration:&lt;/p&gt;

&lt;h4&gt;
  
  
  Option A: Clean Installation (Remove nvm)
&lt;/h4&gt;

&lt;p&gt;Unload &lt;code&gt;nvm&lt;/code&gt; and remove its directory:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;nvm_dir&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;NVM_DIR&lt;/span&gt;&lt;span class="k"&gt;:-&lt;/span&gt;&lt;span class="p"&gt;~/.nvm&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
nvm unload
&lt;span class="nb"&gt;rm&lt;/span&gt; &lt;span class="nt"&gt;-rf&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$nvm_dir&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Reinstall your global Node.js version with &lt;code&gt;mise&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;mise use &lt;span class="nt"&gt;-g&lt;/span&gt; node@22
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This will install Node.js 22 globally and set it as the default version.&lt;br&gt;
If you also want to install Node.js 20, you can run &lt;code&gt;mise install node@20&lt;/code&gt; without setting it as the default version.&lt;/p&gt;

&lt;p&gt;Install Node.js 17 and 18 for the projects:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd &lt;/span&gt;node-project-17
mise &lt;span class="nb"&gt;install

cd&lt;/span&gt; ../node-project-18
mise &lt;span class="nb"&gt;install&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Option B: Keep Existing &lt;code&gt;nvm&lt;/code&gt; Installations (Symlink)
&lt;/h4&gt;

&lt;p&gt;This option is useful if you want to keep your existing &lt;code&gt;nvm&lt;/code&gt; installations and use them with &lt;code&gt;mise&lt;/code&gt;. (You won't need to reinstall global packages for example.)&lt;/p&gt;

&lt;p&gt;Sync existing &lt;code&gt;nvm&lt;/code&gt; installations with &lt;code&gt;mise&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt; mise &lt;span class="nb"&gt;sync &lt;/span&gt;node &lt;span class="nt"&gt;--nvm&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Verify the sync by listing installations with &lt;code&gt;mise ls&lt;/code&gt;:&lt;/p&gt;

&lt;p&gt;
  mise ls
  &lt;br&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;Tool  Version            Config Source Requested
node  17.9.1 &lt;span class="o"&gt;(&lt;/span&gt;symlink&lt;span class="o"&gt;)&lt;/span&gt;
node  18.20.4 &lt;span class="o"&gt;(&lt;/span&gt;symlink&lt;span class="o"&gt;)&lt;/span&gt;
node  20.11.0 &lt;span class="o"&gt;(&lt;/span&gt;symlink&lt;span class="o"&gt;)&lt;/span&gt;
node  22.1.0 &lt;span class="o"&gt;(&lt;/span&gt;symlink&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;




&lt;/p&gt;

&lt;p&gt;If you navigate to &lt;code&gt;node-project-17&lt;/code&gt; and &lt;code&gt;node-project-18&lt;/code&gt;, you will see that the correct Node.js version is used.&lt;/p&gt;

&lt;p&gt;
  mise ls
  &lt;br&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;node-18-project# mise &lt;span class="nb"&gt;ls
&lt;/span&gt;Tool  Version            Config Source           Requested
node  17.9.1 &lt;span class="o"&gt;(&lt;/span&gt;symlink&lt;span class="o"&gt;)&lt;/span&gt;
node  18.20.4 &lt;span class="o"&gt;(&lt;/span&gt;symlink&lt;span class="o"&gt;)&lt;/span&gt;  /node-18-project/.nvmrc 18
node  22.11.0 &lt;span class="o"&gt;(&lt;/span&gt;symlink&lt;span class="o"&gt;)&lt;/span&gt;
node  23.1.0 &lt;span class="o"&gt;(&lt;/span&gt;symlink&lt;span class="o"&gt;)&lt;/span&gt;
node-18-project# node &lt;span class="nt"&gt;-v&lt;/span&gt;
v18.20.4
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;




&lt;/p&gt;

&lt;p&gt;Let's now create a new project with Node 19:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;mkdir &lt;/span&gt;node-project-19 &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;cd &lt;/span&gt;node-project-19
mise use node@19 &lt;span class="c"&gt;# create a mise.toml file with node@19&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;
  mise ls
  &lt;br&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;Tool  Version            Config Source               Requested
node  17.9.1 &lt;span class="o"&gt;(&lt;/span&gt;symlink&lt;span class="o"&gt;)&lt;/span&gt;
node  18.20.4 &lt;span class="o"&gt;(&lt;/span&gt;symlink&lt;span class="o"&gt;)&lt;/span&gt;
node  19.9.0             /node-project-19/.mise.toml 19
node  22.11.0 &lt;span class="o"&gt;(&lt;/span&gt;symlink&lt;span class="o"&gt;)&lt;/span&gt;
node  23.1.0 &lt;span class="o"&gt;(&lt;/span&gt;symlink&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;




&lt;/p&gt;

</description>
      <category>mise</category>
      <category>nvm</category>
      <category>node</category>
      <category>asdf</category>
    </item>
  </channel>
</rss>
