🙄
[Bug #21692] date などの標準的な Gem をコンパイルせずに利用したいという内容のチケット
[Bug #21692] Basic gems like date require a compiler
- コンパイラのインストールが許可されていない高セキュリティな環境で
dateなどの『コンパイルを要求する基本的な Gem 』が利用できなくて困っているというチケット- 昔は Ruby 本体にバンドルされていたので
apt install rubyだけすれば利用できていたが最近は本体から切り離されることも多くなっているのでその影響みたい -
default gemからbundled gemに移行している話になるのかな
- 昔は Ruby 本体にバンドルされていたので
- これに関して
bundle install --prefer-localのように--prefer-localオプションで回避できる、とコメントされている- https://bugs.ruby-lang.org/issues/21692#note-1
-
--prefer-localはローカルにインストールされた Gem やRubygemsのキャッシュ、vendor/cacheにすでに存在する Gem を強制的に使用するオプション - なので Gemfile で
dateを指定しても Ruby 本体に付属している gem の方を見に行くことになるんですかね?
- どういうことかというと例えば次のように
dateのdefaultのバージョンは3.3.3だとする
$ gem list | grep date
date (default: 3.3.3)
- 次のように
Gemfileにdate 3.3.3を参照するように定義されている場合に
source "https://rubygems.org"
gem "date", "3.3.3"
-
bundle installを実行すると次のようにdateを新しくコンパイルしてインストールが行われる- 今回はこのコンパイルができなくて困っている話
$ RBENV_VERSION=3.2.3 bundle install
Fetching gem metadata from https://rubygems.org/.
Resolving dependencies...
Installing date 3.3.3 with native extensions
Bundle complete! 1 Gemfile dependency, 2 gems now installed.
Use `bundle info [gemname]` to see where a bundled gem is installed.
- 一方で
bundle install --prefer-localを使用すればコンパイルすることなくインストールができる、という想定
$ bundle install --prefer-local
Bundle complete! 1 Gemfile dependency, 2 gems now installed.
Use `bundle info [gemname]` to see where a bundled gem is installed.
-
--prefer-localを使用することでdefaultで存在しているdateを直接参照する、みたいな挙動になるのかな - ただし、単純に
bundle install --prefer-localするだけどうまく動作せず、いくつか回避方法を使用する必要があるみたい- 先に意図的に
Gemfile.lockを用意しておく等の対応が必要 - https://bugs.ruby-lang.org/issues/21692#note-3
- 先に意図的に
- 今回はそのまま利用することはできなかったんですが
--prefer-localは知らなかった
Discussion