質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

RVM

RVM(Ruby Version Manager)は、UNIX系の環境で複数のRuby環境をインストール、管理・操作できるコマンドラインツール。使用するRuby処理系の切替や複数のRubyでスクリプトを一斉に実行することができます。さらに、gemの管理も可能です。

RubyGems

RubyGemsはRubyによるプログラミングのためのパッケージマネジメントツールです。ユーザはこれを使用することで、Rubyライブラリのダウンロードやアップデートや、依存関係の自動解決が可能になります。

Q&A

解決済

4回答

1579閲覧

gemのライブラリをフルパス指定して実行したい

wkbiz

総合スコア154

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

RVM

RVM(Ruby Version Manager)は、UNIX系の環境で複数のRuby環境をインストール、管理・操作できるコマンドラインツール。使用するRuby処理系の切替や複数のRubyでスクリプトを一斉に実行することができます。さらに、gemの管理も可能です。

RubyGems

RubyGemsはRubyによるプログラミングのためのパッケージマネジメントツールです。ユーザはこれを使用することで、Rubyライブラリのダウンロードやアップデートや、依存関係の自動解決が可能になります。

0グッド

1クリップ

投稿2021/09/29 10:20

編集2021/09/30 01:01

よろしくお願いいたします。
仕事にかかわることなので出せる範囲で記します。

gemを実行する際、

ruby

1# ソース側 2require_relative '/opt/ruby3/rubies/ruby-3.0.2/lib/ruby/gems/3.0.0/gems/roo-2.8.3/lib/roo.rb' 3 4#処理... 5xlsx = Roo::Excelx.new(datafile) 6p 'OK'

これをログインユーザ(sudoを付けずに)次のように実行すると次のようにエラーは表示されません。

$ ruby test.rb "OK"

しかしsudoを付けて実行するとエラーになります。

[xxx]$ sudo ruby test.rb /usr/share/rubygems/rubygems/core_ext/kernel_require.rb:55:in `require': cannot load such file -- roo/version (LoadError) from /usr/share/rubygems/rubygems/core_ext/kernel_require.rb:55:in `require' from /opt/ruby3/rubies/ruby-3.0.2/lib/ruby/gems/3.0.0/gems/roo-2.8.3/lib/roo.rb:3:in `<top (required)>' from test.rb:2:in `require_relative' from test.rb:2:in `<main>'

rubyやgem管理は rvmを使っています。

何が原因で実行できないのかが掴めておらず、何かお気づきの点あればご教授頂けると幸いです。
よろしくお願いいたします。

(追記)
いろいろアドバイス、コメント頂き有難うございます。
確認などを経て、個々のteratailの返答、評価をさせて頂きます。とり急ぎですがお礼まで。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

maisumakun

2021/09/29 11:43

> gemのライブラリをフルパス指定して実行したい Gemfileを作ってbundler管理下で実行する、では解決できないなにかがあるのでしょうか?
wkbiz

2021/09/29 12:02

ご回答ありがとうございます。 bundle install で次のエラーになってしまいます。 ## Backtrace``` Gem::FilePermissionError: You don't have write permissions for the /opt/ruby3/gems/ruby-3.0.2/wrappers directory. sudoを付けて実行すると次のようになるのですが、rvmでインストールしたものは3.0.2なのでなぜ2.3未満のものを呼んでいるのかが変わりません。 RROR: Error installing bundler: bundler requires Ruby version >= 2.3.0.
winterboum

2021/09/29 13:12

sudoしたときの PATH が違うのでしょう
wkbiz

2021/10/01 06:17

メッセージありがとうございます。 その場合、どう対処すれば良いのでしょうか。ご教授お願いいします。
guest

回答4

0

ベストアンサー

たぶんパスが通ていないだけかと思います。通常、sudo はパスが一般ユーザーと異なる場合があります。下記で確認してみてください。

sh

1sudo which gem 2sudo which ruby

一般ユーザーで実行が問題ないのであればインストールには成功していると思いますが、いちおう確認してみたほうがいいです。

sh

1sudo gem list | grep roo

上記で、sudo でパスが通っていないだけでしたら、下記のようにすることで一般ユーザーの環境を引き継ぐことが可能です。

sh

1sudo -E which gem 2sudo -E which ruby 3sudo -E ruby test.rb

バッチの場合

CRONバッチなどでどうしても sudo で特定のパスを通しておきたい場合は、CRON にパスを通しておくことが可能です。

cron

1PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin 2 30 4 * * * CRONバッチコマンド

セキュアじゃなくなるのであまりお勧めはしませんが場合によっては sudo visudo でパスを通しておく方法も使えます。

# /etc/sudoers # ↓ secure_path 変数に通したいパスを追記する Defaults secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"

投稿2021/09/29 12:21

編集2021/09/29 12:24
Tomak

総合スコア1652

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

wkbiz

2021/09/29 12:58

ご回答ありがとうございます。 冗長ですが上3つの実行結果を記載します。可能であればご助言頂けると幸いです。 [user@xxx dir]$ sudo which gem /bin/gem [user@xxx dir]$ sudo which ruby /bin/ruby [user@xxx dir]$ sudo gem list | grep roo #何も返ってこない [user@xxx dir]$ gem list roo (2.8.3) sudo -E ruby test.rb /opt/ruby3/gems/ruby-3.0.2/gems/nokogiri-1.12.5-x86_64-linux/lib/nokogiri.rb:11:in `require_relative': /opt/ruby3/gems/ruby-3.0.2/gems/nokogiri-1.12.5-x86_64-linux/lib/nokogiri/extension.rb:10: syntax error, unexpected <<, expecting ')' (SyntaxError)
Tomak

2021/09/30 00:43 編集

otn さんと maisumakun さんの内容と、上記回答を総合すると、ruby, gem が rvm 経由とシステムパッケージ経由で2種類以上が共存している状態なので、混乱の原因になっています。 rvm を使用しているなら rvmsudo を使ってみてはいかがでしょうか? 試していないので動作するのか不明ですが、下記によるとインストールだけでパスを解決できるようです。 https://rvm.io/integration/sudo https://stackoverflow.com/questions/5817555/rvmsudo-vs-sudo
wkbiz

2021/09/30 00:59

ご回答ありがとうございます。
guest

0

rubyやgem管理は rvmを使っています。

rvm自体はrootから使えるようにインストールしてますでしょうか?

投稿2021/09/29 12:06

maisumakun

総合スコア146018

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

wkbiz

2021/09/29 12:31

はい。 [root@xxx]# rvm -v rvm 1.29.12-next (master) by Michal Papis, Piotr Kuczynski, Wayne E. Seguin [https://rvm.io]
guest

0

現象が書かれていないので、想像ですが、
そのファイルのrequire自体は成功していて、そこからさらにrequireされるものが失敗しているのでは?
それら全部絶対パスに書き直すか、$:を設定するか。

発生している現象をちゃんと書きましょう。

投稿2021/09/29 11:11

otn

総合スコア85901

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

wkbiz

2021/09/29 11:14

コメントありがとうございます。 「発生している現象をちゃんと」とはどういう意味でしょうか? 少し具体的に話して頂けると助かります。
otn

2021/09/29 11:21

みたまま客観的な描写ですね。主観だけじゃなくて。 例えば、エラーメッセージとか。
wkbiz

2021/09/29 11:29

記事の内容を更新しました。よろしくお願いいたします。
otn

2021/09/29 12:28 編集

roo.rbの3行目に相対パスでの require "roo/version" があるということですね。 回答に書いた通りということです。 sudoをつけないとうまくいくのは、環境が異なるんでしょうね。違うrubyが動いているとか。 冒頭に、p $: を入れてみましょう。
wkbiz

2021/09/29 12:39 編集

出力結果を記します。どのような対象方法があるかご教授お願いします。 [aaa@bbb]$ ruby test.rb "OK" ["/opt/ruby3/rubies/ruby-3.0.2/lib/ruby/gems/3.0.0/gems/rexml-3.2.5/lib", "/opt/ruby3/rubies/ruby-3.0.2/lib/ruby/gems/3.0.0/gems/rss-0.2.9/lib", "/opt/ruby3/gems/ruby-3.0.2/gems/nokogiri-1.12.5-x86_64-linux/lib", "/opt/ruby3/gems/ruby-3.0.2/gems/rubyzip-2.3.2/lib", "/opt/ruby3/gems/ruby-3.0.2/gems/roo-2.8.3/lib", "/opt/ruby3/gems/ruby-3.0.2/gems/racc-1.5.2/lib", "/opt/ruby3/gems/ruby-3.0.2/extensions/x86_64-linux/3.0.0/racc-1.5.2", "/opt/ruby3/rubies/ruby-3.0.2/lib/ruby/site_ruby/3.0.0", "/opt/ruby3/rubies/ruby-3.0.2/lib/ruby/site_ruby/3.0.0/x86_64-linux", "/opt/ruby3/rubies/ruby-3.0.2/lib/ruby/site_ruby", "/opt/ruby3/rubies/ruby-3.0.2/lib/ruby/vendor_ruby/3.0.0", "/opt/ruby3/rubies/ruby-3.0.2/lib/ruby/vendor_ruby/3.0.0/x86_64-linux", "/opt/ruby3/rubies/ruby-3.0.2/lib/ruby/vendor_ruby", "/opt/ruby3/rubies/ruby-3.0.2/lib/ruby/3.0.0", "/opt/ruby3/rubies/ruby-3.0.2/lib/ruby/3.0.0/x86_64-linux"] [aaa@bbb]$
otn

2021/09/29 12:35 編集

はいそうです。 p というメソッドを知りませんか?表示するというメソッドです。$: はrequireがファイルを探すパスです。
wkbiz

2021/10/01 06:36

上記が、p $: で出力した内容です。ここから何を導き出せばよいのがお教えいただけないでしょうか。よろしくお願いいたします。
otn

2021/10/01 10:24

roo/version.rb のありかが含まれているかどうかです。 それが、sudoなしの時とありの時で異なるでしょう?ということです。 > $: はrequireがファイルを探すパスです。 という意味がわからなかったのでしょうかね。
guest

0

いろいろお教えいただき有難うございました。

shell(bash)からrubyを叩いて実行する形になりました。
shellの中でexport PATHで一時的にPATH追加をして実施することで、ruby2から3で実行できるようにしました。
まだ解決できていない部分もありますが、当初の目的は達成できましたので本件クローズとさせて頂きます。

投稿2021/10/04 08:56

wkbiz

総合スコア154

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問