Logo

How to install a gem or update RubyGems if it fails with a permissions error?

Encountering a “permission denied” or “you don’t have write permissions” error when installing gems or updating RubyGems is quite common. This issue typically arises because your system Ruby is installed in a protected directory—one that requires elevated privileges (e.g., root or administrator) to modify. Below, we’ll explore different ways to overcome these permission errors and maintain a safer, cleaner Ruby environment.

1. Use --user-install for Installing Gems

If you only need a particular gem for your own user account, you can bypass system-wide installation with the --user-install flag:

gem install <gem_name> --user-install

Pros:

  • Installs gems under your home directory, avoiding the need for admin privileges.
  • Keeps your system Ruby environment untouched.

Cons:

  • If multiple user accounts need access to the gem, you’ll have to install it again for each user.

You can also add the --user-install flag permanently by placing this in your ~/.gemrc:

install: --user-install update: --user-install

This way, you’ll never inadvertently install gems into the system’s protected directories.

2. Use sudo Cautiously

If you truly need to install or update gems system-wide (for all users), you might consider sudo:

sudo gem install <gem_name>

or

sudo gem update --system

Pros:

  • Lets you install or update gems for everyone on the machine (common for servers or shared development environments).

Cons:

  • Poses security risks: running gem installations with elevated privileges can potentially overwrite system files.
  • May lead to a cluttered system Ruby environment, making debugging more difficult.

Best Practice: In general, avoid sudo for Ruby gem management unless you have a very specific reason to modify the system Ruby environment.

3. Consider Ruby Version Managers (e.g., rbenv or RVM)

Rather than using system Ruby, a Ruby version manager like rbenv or RVM allows you to install multiple Ruby versions in your home directory without any special privileges:

  • rbenv: A lightweight version manager that modifies your PATH so you can seamlessly switch between different Ruby versions.
  • RVM: An older, more all-inclusive tool that can manage gemsets, Ruby versions, and more, all at the user level.

Pros:

  • No sudo needed for gem installs or updates.
  • Keeps each Ruby version and gemset isolated, reducing conflicts.
  • Makes it easy to switch Ruby versions per project.

Cons:

  • Slightly more setup initially (though typically just a few commands).

Example with rbenv:

  1. Install rbenv (using your package manager or official instructions).
  2. Install Ruby:
    rbenv install 3.1.2 rbenv global 3.1.2
  3. Install Gems (no sudo needed):
    gem install rails

4. Update RubyGems with Proper Permissions

If you specifically need to update RubyGems itself (e.g., gem update --system), you have two main options:

4.1 Via sudo (System Ruby)

sudo gem update --system

This updates the RubyGems version for the system-wide Ruby installation.

4.2 Through a Version Manager

If you’re using rbenv or RVM, simply open a new shell session to ensure your version manager is loaded and then run:

gem update --system

No sudo needed—RubyGems will update inside your user environment.

5. Fixing Directory Permissions (Advanced)

If you’re certain you want gems installed system-wide but you don’t want to keep using sudo, you could change the directory ownership of the system gem directory. For example (on macOS or Linux):

sudo chown -R $(whoami) /Library/Ruby/Gems/2.6.0

or

sudo chown -R $(whoami) /usr/local/lib/ruby/gems/3.1.0

(Adjust the path to match your actual Ruby gems directory.)

Warning:

  • This can lead to security issues if multiple users share the system.
  • Future OS updates may reset permissions.

Best Practices Recap

  1. Local Install: If you’re the only one who needs the gem, use --user-install or a version manager.
  2. System Install: If truly necessary, use sudo or adjust directory permissions—but do so carefully.
  3. Isolated Environments: Tools like rbenv and RVM allow for a safer, user-scoped approach.

Level Up Your Ruby and System Design Skills

Managing gem installations and environment configurations is just one part of your growth as a Ruby developer. If you’re aiming to excel in technical interviews or build production-grade Rails apps, check out these DesignGurus.io resources:

If you want personalized advice and feedback, consider a Coding Mock Interview or System Design Mock Interview with ex-FAANG engineers.

Conclusion

When RubyGems or gem installations fail with permission errors, you have several ways to resolve the issue:

  • Use --user-install to keep installations in your home directory.
  • Use sudo carefully for system-wide updates, if absolutely necessary.
  • Adopt rbenv or RVM to bypass the system Ruby entirely.
  • Adjust permissions (advanced) if you have a very specific system-wide setup in mind.

Following these best practices will ensure a smoother, less error-prone experience when managing gems in Ruby.

CONTRIBUTOR
TechGrind