こんにちは。
今回はタイトル通り、sudo gem install
について気になったので検証してみました。
調べたきっかけ
iOS の環境構築中、cocoapods をインストールする際に
rbenv で Ruby をインストールしているにもかかわらず、sudo gem install
を使っている記事が多く見られました。
自分の環境では sudo を付けることに違和感があり、「本当に必要なのか?」と疑問に思ったのがきっかけです。
実際に手元の環境で検証してみることにしました。
検証環境
項目 | バージョン |
---|---|
OS | Ubuntu 22.04 |
Ruby | 3.3.0(rbenv 管理) |
rbenv | 1.3.2-4-gae72600 |
gem | 3.5.3 |
cocoapods | 1.16.2 |
前提としてMac本体を汚したくなかったため、Docker 上に Ubuntu 環境を構築して検証しました。
dockerfile の中で rbenv と ruby-build をインストールしています。
今回は dockerfile のソースコードは省略します。
フォルダ構成などに多少の差はありますが、基本的な挙動は macOS と大きく変わらないと判断しました。
動作検証
rbenv 経由で Ruby をインストール後、sudo gem install cocoapods
を実行しようとしたところ、以下のようなエラーが発生しました。
sudo: gem: command not found
理由はSystem Rubyが入っていなかったため以下のコマンドでRubyをインストールして、gemを使用できるようにしました。
$ sudo apt update
$ sudo apt install ruby3.0-dev build-essential
結果
$ gem install cocoapods
の場合
$ which pod
/home/XXXX[ユーザー名]/.rbenv/shims/pod
dockerを削除して再ビルド
$ sudo gem install cocoapods
の場合
$ which pod
/usr/local/bin/pod
結果を見ると、sudo
を使用した場合は /usr/local/bin
(ルート配下)に、
使用しない場合は ~/.rbenv/shims
(ユーザーディレクトリ)にインストールされていることがわかりました。
補足
MacOSで以下を実行
$ gem install cocoapods
の場合
$ which pod
/Users/XXXX[ユーザー名]/.rbenv/shims/pod
結論
cocoapods公式にも確かにインストール方法としてsudoが使用されていますが、本当に必要なのかどうかを判断しないといけないと思いました。
また、Rails など Ruby を使う他のプロジェクトでも、
ユーザーディレクトリ配下とルート配下の gem が混在するとトラブルの元になるため、
開発スタイルに応じて適切に判断する必要があります。
まとめ
- rbenv 管理下の Ruby では、基本的に sudo は不要と考えられる
- sudo 環境では rbenv の Ruby を参照できない(SystemのGemを使用している)
- 混在環境は不安定になる可能性があるので要注意
最後までお読みいただき、ありがとうございました。