Portable RubyInstaller: Run Ruby Anywhere Without Installation

Quick Guide: Using Portable RubyInstaller for USB or Cloud Workflows

Overview

Portable RubyInstaller packages Ruby and its runtime so you can run Ruby tools and scripts without a full system installation. It’s ideal for USB drives, ephemeral cloud instances, or locked-down environments where you can’t modify system-wide settings.

When to use it

  • On-the-go development: carry a consistent Ruby setup on a USB stick.
  • Cloud/CI ephemeral workers: provision Ruby quickly on disposable machines.
  • Restricted machines: use Ruby without admin privileges or installer access.

What you get

  • A self-contained Ruby runtime and standard libraries.
  • Bundled development tools (gem, irb, rake) ready to run.
  • Ability to configure gem paths locally to avoid touching system directories.

Quick setup (USB or local folder)

  1. Download the Portable RubyInstaller ZIP for your target Ruby version from the official distribution (choose the Windows Portable build if using Windows).
  2. Extract the ZIP to a folder on your USB drive or cloud VM (e.g., E:\portable-ruby or /home/user/portable-ruby).
  3. Inside the extracted folder, locate the ruby.exe (Windows) or bin/ruby (POSIX-like) and verify:
    • Windows: run E:\portable-ruby\ruby.exe -v in Command Prompt or PowerShell.
    • Linux WSL or POSIX-like portable builds: run /path/to/portable-ruby/bin/ruby -v.
  4. Add the portable bin directory to your PATH temporarily for the session:
    • Windows PowerShell (temporary):

      powershell

      \(env</span><span>:PATH = </span><span class="token" style="color: rgb(163, 21, 21);">"E:\portable-ruby\bin;"</span><span> </span><span class="token" style="color: rgb(57, 58, 52);">+</span><span> </span><span class="token" style="color: rgb(54, 172, 170);">\)env:PATH
    • Bash (temporary):

      bash

      export PATH=”/home/user/portable-ruby/bin:\(PATH</span><span class="token" style="color: rgb(163, 21, 21);">"</span><span> </span></code></div></div></pre> </li> </ul> </li> <li>Confirm gem and bundler work: <ul> <li><code class="qlv4I7skMF6Meluz0u8c wZ4JdaHxSAhGy1HoNVja _dJ357tkKXSh_Sup5xdW">gem env</code> to inspect gem paths.</li> <li><code class="qlv4I7skMF6Meluz0u8c wZ4JdaHxSAhGy1HoNVja _dJ357tkKXSh_Sup5xdW">gem install bundler --user-install</code> if you want gems installed into a per-user directory (or configure GEM_HOME below).</li> </ul> </li> </ol> <h3>Configure gems to stay local (avoid system directories)</h3> <ul> <li>Set environment variables in a startup script on the USB or VM: <ul> <li>Bash (.env or start.sh): <pre><div class="XG2rBS5V967VhGTCEN1k"><div class="nHykNMmtaaTJMjgzStID"><div class="HsT0RHFbNELC00WicOi8"><i><svg width="16" height="16" fill="none" xmlns="http://www.w3.org/2000/svg"><path fill="currentColor" fill-rule="evenodd" clip-rule="evenodd" d="M15.434 7.51c.137.137.212.311.212.49a.694.694 0 0 1-.212.5l-3.54 3.5a.893.893 0 0 1-.277.18 1.024 1.024 0 0 1-.684.038.945.945 0 0 1-.302-.148.787.787 0 0 1-.213-.234.652.652 0 0 1-.045-.58.74.74 0 0 1 .175-.256l3.045-3-3.045-3a.69.69 0 0 1-.22-.55.723.723 0 0 1 .303-.52 1 1 0 0 1 .648-.186.962.962 0 0 1 .614.256l3.541 3.51Zm-12.281 0A.695.695 0 0 0 2.94 8a.694.694 0 0 0 .213.5l3.54 3.5a.893.893 0 0 0 .277.18 1.024 1.024 0 0 0 .684.038.945.945 0 0 0 .302-.148.788.788 0 0 0 .213-.234.651.651 0 0 0 .045-.58.74.74 0 0 0-.175-.256L4.994 8l3.045-3a.69.69 0 0 0 .22-.55.723.723 0 0 0-.303-.52 1 1 0 0 0-.648-.186.962.962 0 0 0-.615.256l-3.54 3.51Z"></path></svg></i><p class="li3asHIMe05JPmtJCytG wZ4JdaHxSAhGy1HoNVja cPy9QU4brI7VQXFNPEvF">bash</p></div><div class="CF2lgtGWtYUYmTULoX44"><button type="button" class="st68fcLUUT0dNcuLLB2_ ffON2NH02oMAcqyoh2UU MQCbz04ET5EljRmK3YpQ CPXAhl7VTkj2dHDyAYAf" data-copycode="true" role="button" aria-label="Copy Code"><svg viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg"><path fill="currentColor" fill-rule="evenodd" clip-rule="evenodd" d="M9.975 1h.09a3.2 3.2 0 0 1 3.202 3.201v1.924a.754.754 0 0 1-.017.16l1.23 1.353A2 2 0 0 1 15 8.983V14a2 2 0 0 1-2 2H8a2 2 0 0 1-1.733-1H4.183a3.201 3.201 0 0 1-3.2-3.201V4.201a3.2 3.2 0 0 1 3.04-3.197A1.25 1.25 0 0 1 5.25 0h3.5c.604 0 1.109.43 1.225 1ZM4.249 2.5h-.066a1.7 1.7 0 0 0-1.7 1.701v7.598c0 .94.761 1.701 1.7 1.701H6V7a2 2 0 0 1 2-2h3.197c.195 0 .387.028.57.083v-.882A1.7 1.7 0 0 0 10.066 2.5H9.75c-.228.304-.591.5-1 .5h-3.5c-.41 0-.772-.196-1-.5ZM5 1.75v-.5A.25.25 0 0 1 5.25 1h3.5a.25.25 0 0 1 .25.25v.5a.25.25 0 0 1-.25.25h-3.5A.25.25 0 0 1 5 1.75ZM7.5 7a.5.5 0 0 1 .5-.5h3V9a1 1 0 0 0 1 1h1.5v4a.5.5 0 0 1-.5.5H8a.5.5 0 0 1-.5-.5V7Zm6 2v-.017a.5.5 0 0 0-.13-.336L12 7.14V9h1.5Z"></path></svg>Copy Code</button><button type="button" class="st68fcLUUT0dNcuLLB2_ WtfzoAXPoZC2mMqcexgL ffON2NH02oMAcqyoh2UU MQCbz04ET5EljRmK3YpQ GnLX_jUB3Jn3idluie7R"><svg fill="none" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path fill="currentColor" fill-rule="evenodd" d="M20.618 4.214a1 1 0 0 1 .168 1.404l-11 14a1 1 0 0 1-1.554.022l-5-6a1 1 0 0 1 1.536-1.28l4.21 5.05L19.213 4.382a1 1 0 0 1 1.404-.168Z" clip-rule="evenodd"></path></svg>Copied</button></div></div><div class="mtDfw7oSa1WexjXyzs9y" style="color: var(--sds-color-text-01); font-family: var(--sds-font-family-monospace); direction: ltr; text-align: left; white-space: pre; word-spacing: normal; word-break: normal; font-size: var(--sds-font-size-label); line-height: 1.2em; tab-size: 4; hyphens: none; padding: var(--sds-space-x02, 8px) var(--sds-space-x04, 16px) var(--sds-space-x04, 16px); margin: 0px; overflow: auto; border: none; background: transparent;"><code class="language-bash" style="color: rgb(57, 58, 52); font-family: Consolas, "Bitstream Vera Sans Mono", "Courier New", Courier, monospace; direction: ltr; text-align: left; white-space: pre; word-spacing: normal; word-break: normal; font-size: 0.9em; line-height: 1.2em; tab-size: 4; hyphens: none;"><span class="token builtin" style="color: rgb(43, 145, 175);">export</span><span> </span><span class="token assign-left" style="color: rgb(54, 172, 170);">GEM_HOME</span><span class="token" style="color: rgb(57, 58, 52);">=</span><span class="token" style="color: rgb(163, 21, 21);">"</span><span class="token environment" style="color: rgb(54, 172, 170);">\)PWD/.gems” export GEM_PATH=\(GEM_HOME</span><span class="token" style="color: rgb(163, 21, 21);">"</span><span> </span><span></span><span class="token builtin" style="color: rgb(43, 145, 175);">export</span><span> </span><span class="token assign-left environment" style="color: rgb(54, 172, 170);">PATH</span><span class="token" style="color: rgb(57, 58, 52);">=</span><span class="token" style="color: rgb(163, 21, 21);">"</span><span class="token" style="color: rgb(54, 172, 170);">\)GEMHOME/bin:\(PWD</span><span class="token" style="color: rgb(163, 21, 21);">/bin:</span><span class="token environment" style="color: rgb(54, 172, 170);">\)PATH
    • PowerShell (start.ps1):

      powershell

      \(env</span><span>:GEM_HOME = </span><span class="token" style="color: rgb(57, 58, 52);">Join-Path</span><span> </span><span class="token" style="color: rgb(54, 172, 170);">\)PSScriptRoot ’.gems’ \(env</span><span>:GEM_PATH = </span><span class="token" style="color: rgb(54, 172, 170);">\)env:GEM_HOME \(env</span><span>:PATH = </span><span class="token" style="color: rgb(57, 58, 52);">(</span><span class="token" style="color: rgb(57, 58, 52);">Join-Path</span><span> </span><span class="token" style="color: rgb(54, 172, 170);">\)PSScriptRoot ‘bin’) + ’;’ + \(env</span><span>:PATH </span></code></div></div></pre> </li> </ul> </li> <li>Create the .gems folder before installing: <code class="qlv4I7skMF6Meluz0u8c wZ4JdaHxSAhGy1HoNVja _dJ357tkKXSh_Sup5xdW">mkdir .gems</code>.</li> </ul> <h3>Using Portable Ruby in cloud workflows</h3> <ul> <li>Bake portable Ruby into your container image or VM snapshot by copying the extracted folder.</li> <li>For CI jobs, add a short script step to extract the portable ZIP and set PATH/GEM_HOME before running Ruby tasks. Example (CI job script): <pre><div class="XG2rBS5V967VhGTCEN1k"><div class="nHykNMmtaaTJMjgzStID"><div class="HsT0RHFbNELC00WicOi8"><i><svg width="16" height="16" fill="none" xmlns="http://www.w3.org/2000/svg"><path fill="currentColor" fill-rule="evenodd" clip-rule="evenodd" d="M15.434 7.51c.137.137.212.311.212.49a.694.694 0 0 1-.212.5l-3.54 3.5a.893.893 0 0 1-.277.18 1.024 1.024 0 0 1-.684.038.945.945 0 0 1-.302-.148.787.787 0 0 1-.213-.234.652.652 0 0 1-.045-.58.74.74 0 0 1 .175-.256l3.045-3-3.045-3a.69.69 0 0 1-.22-.55.723.723 0 0 1 .303-.52 1 1 0 0 1 .648-.186.962.962 0 0 1 .614.256l3.541 3.51Zm-12.281 0A.695.695 0 0 0 2.94 8a.694.694 0 0 0 .213.5l3.54 3.5a.893.893 0 0 0 .277.18 1.024 1.024 0 0 0 .684.038.945.945 0 0 0 .302-.148.788.788 0 0 0 .213-.234.651.651 0 0 0 .045-.58.74.74 0 0 0-.175-.256L4.994 8l3.045-3a.69.69 0 0 0 .22-.55.723.723 0 0 0-.303-.52 1 1 0 0 0-.648-.186.962.962 0 0 0-.615.256l-3.54 3.51Z"></path></svg></i><p class="li3asHIMe05JPmtJCytG wZ4JdaHxSAhGy1HoNVja cPy9QU4brI7VQXFNPEvF">bash</p></div><div class="CF2lgtGWtYUYmTULoX44"><button type="button" class="st68fcLUUT0dNcuLLB2_ ffON2NH02oMAcqyoh2UU MQCbz04ET5EljRmK3YpQ CPXAhl7VTkj2dHDyAYAf" data-copycode="true" role="button" aria-label="Copy Code"><svg viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg"><path fill="currentColor" fill-rule="evenodd" clip-rule="evenodd" d="M9.975 1h.09a3.2 3.2 0 0 1 3.202 3.201v1.924a.754.754 0 0 1-.017.16l1.23 1.353A2 2 0 0 1 15 8.983V14a2 2 0 0 1-2 2H8a2 2 0 0 1-1.733-1H4.183a3.201 3.201 0 0 1-3.2-3.201V4.201a3.2 3.2 0 0 1 3.04-3.197A1.25 1.25 0 0 1 5.25 0h3.5c.604 0 1.109.43 1.225 1ZM4.249 2.5h-.066a1.7 1.7 0 0 0-1.7 1.701v7.598c0 .94.761 1.701 1.7 1.701H6V7a2 2 0 0 1 2-2h3.197c.195 0 .387.028.57.083v-.882A1.7 1.7 0 0 0 10.066 2.5H9.75c-.228.304-.591.5-1 .5h-3.5c-.41 0-.772-.196-1-.5ZM5 1.75v-.5A.25.25 0 0 1 5.25 1h3.5a.25.25 0 0 1 .25.25v.5a.25.25 0 0 1-.25.25h-3.5A.25.25 0 0 1 5 1.75ZM7.5 7a.5.5 0 0 1 .5-.5h3V9a1 1 0 0 0 1 1h1.5v4a.5.5 0 0 1-.5.5H8a.5.5 0 0 1-.5-.5V7Zm6 2v-.017a.5.5 0 0 0-.13-.336L12 7.14V9h1.5Z"></path></svg>Copy Code</button><button type="button" class="st68fcLUUT0dNcuLLB2_ WtfzoAXPoZC2mMqcexgL ffON2NH02oMAcqyoh2UU MQCbz04ET5EljRmK3YpQ GnLX_jUB3Jn3idluie7R"><svg fill="none" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path fill="currentColor" fill-rule="evenodd" d="M20.618 4.214a1 1 0 0 1 .168 1.404l-11 14a1 1 0 0 1-1.554.022l-5-6a1 1 0 0 1 1.536-1.28l4.21 5.05L19.213 4.382a1 1 0 0 1 1.404-.168Z" clip-rule="evenodd"></path></svg>Copied</button></div></div><div class="mtDfw7oSa1WexjXyzs9y" style="color: var(--sds-color-text-01); font-family: var(--sds-font-family-monospace); direction: ltr; text-align: left; white-space: pre; word-spacing: normal; word-break: normal; font-size: var(--sds-font-size-label); line-height: 1.2em; tab-size: 4; hyphens: none; padding: var(--sds-space-x02, 8px) var(--sds-space-x04, 16px) var(--sds-space-x04, 16px); margin: 0px; overflow: auto; border: none; background: transparent;"><code class="language-bash" style="color: rgb(57, 58, 52); font-family: Consolas, "Bitstream Vera Sans Mono", "Courier New", Courier, monospace; direction: ltr; text-align: left; white-space: pre; word-spacing: normal; word-break: normal; font-size: 0.9em; line-height: 1.2em; tab-size: 4; hyphens: none;"><span class="token" style="color: rgb(57, 58, 52);">unzip</span><span> portable-ruby.zip -d portable-ruby </span><span></span><span class="token builtin" style="color: rgb(43, 145, 175);">export</span><span> </span><span class="token assign-left environment" style="color: rgb(54, 172, 170);">PATH</span><span class="token" style="color: rgb(57, 58, 52);">=</span><span class="token" style="color: rgb(163, 21, 21);">"</span><span class="token environment" style="color: rgb(54, 172, 170);">\)PWD/portable-ruby/bin:\(PATH</span><span class="token" style="color: rgb(163, 21, 21);">"</span><span> </span><span></span><span class="token builtin" style="color: rgb(43, 145, 175);">export</span><span> </span><span class="token assign-left" style="color: rgb(54, 172, 170);">GEM_HOME</span><span class="token" style="color: rgb(57, 58, 52);">=</span><span class="token" style="color: rgb(163, 21, 21);">"</span><span class="token environment" style="color: rgb(54, 172, 170);">\)PWD/portable-ruby/.gems” gem install bundler –no-document bundle install –path vendor/bundle rake test
    • Keep caches for bundler/gems between jobs to speed up builds.

    Advantages and limitations

    Advantage Limitation
    No admin rights needed Some native gems needing compilation or system libraries may fail
    Fast setup on ephemeral machines Larger ZIP size than minimal runtimes
    Reproducible environment across machines Windows vs POSIX differences require different builds

    Tips and best practices

    • Use the same portable Ruby version across devices to avoid compatibility issues.
    • For native extension gems, include necessary build tools in the environment (DevKit for Windows or build-essential on Linux).
    • Sign or checksum your portable ZIP if distributing within a team for integrity.
    • Keep a small startup script (start.sh / start.ps1) that sets paths and GEMHOME to make usage consistent.

    Example start script (Windows)

    powershell

    # start.ps1 \(root</span><span> = </span><span class="token" style="color: rgb(57, 58, 52);">Split-Path</span><span> </span><span class="token" style="color: rgb(57, 58, 52);">-</span><span>Parent </span><span class="token" style="color: rgb(54, 172, 170);">\)MyInvocation.MyCommand.Definition \(env</span><span>:PATH = </span><span class="token" style="color: rgb(57, 58, 52);">(</span><span class="token" style="color: rgb(57, 58, 52);">Join-Path</span><span> </span><span class="token" style="color: rgb(54, 172, 170);">\)root ‘bin’) + ’;’ + \(env</span><span>:PATH </span><span></span><span class="token" style="color: rgb(54, 172, 170);">\)env:GEM_HOME = Join-Path \(root</span><span> </span><span class="token" style="color: rgb(163, 21, 21);">'.gems'</span><span> </span><span></span><span class="token" style="color: rgb(54, 172, 170);">\)env:GEM_PATH = \(env</span><span>:GEM_HOME </span><span></span><span class="token" style="color: rgb(0, 0, 255);">if</span><span> </span><span class="token" style="color: rgb(57, 58, 52);">(</span><span class="token" style="color: rgb(57, 58, 52);">-not</span><span> </span><span class="token" style="color: rgb(57, 58, 52);">(</span><span class="token" style="color: rgb(57, 58, 52);">Test-Path</span><span> </span><span class="token" style="color: rgb(54, 172, 170);">\)env:GEM_HOME)) { New-Item -ItemType Directory -Path \(env</span><span>:GEM_HOME </span><span class="token" style="color: rgb(57, 58, 52);">}</span><span> </span><span></span><span class="token" style="color: rgb(57, 58, 52);">Write-Host</span><span> </span><span class="token" style="color: rgb(163, 21, 21);">"Portable Ruby ready. Ruby version:"</span><span class="token" style="color: rgb(57, 58, 52);">;</span><span> </span><span class="token" style="color: rgb(57, 58, 52);">(</span><span class="token" style="color: rgb(57, 58, 52);">Join-Path</span><span> </span><span class="token" style="color: rgb(54, 172, 170);">\)root ‘bin\ruby.exe’) -replace ‘\’,’/’ | ForEach-Object { & $_ -v }

    Troubleshooting

    • If gems with native extensions fail, install appropriate build tools or use precompiled gem versions.
    • If PATH conflicts with system Ruby, ensure your startup script prepends the portable bin directory.
    • Verify GEM_HOME/GEM_PATH with gem env to ensure gems install into the intended folder.

    Summary

    Portable RubyInstaller gives a convenient, self-contained Ruby environment for USB and cloud workflows. Extract the portable build, use a short startup script to set PATH and GEM_HOME, and include it in CI/containers to make Ruby portable and reproducible across environments.

Comments

Leave a Reply

Your email address will not be published. Required fields are marked *