gem内部での$LOAD_PATHの制御

このQ&Aのポイント
  • gemの中でautoloadされているhelper関数を拡張したい場合、$LOAD_PATHの制御が必要です。
  • 通常はgemspecファイルで制御することができます。
  • gemspecファイルに$LOAD_PATHの制御を追加することで、拡張gemの方が先に参照されるようにできます。
回答を見る
  • ベストアンサー

gem内部での$LOAD_PATHの制御

特定のrailsのgemにさらに機能を追加してくて、新しくgemを作成しました。 gemはtypusというgemです。 https://github.com/typus/typus これの、gemの中でautoloadされているhelper関数を拡張したいと思っています。 問題はそのためのgemの作り方で、helper関数はautoloadされるので、モンキーパッチングの適応が出来ません。 なので、typusのhelper関数よりも前に、拡張を行うgemの方で、拡張済のhelperを読み込む様にしないといけません。 そうなると、$LOAD_PATHの中で確実にtypusよりも、拡張gemの方が先に参照できる様にしないといけないのですが 普通これはどうすでばいいのでしょうか? 通常はgemspecファイルの中で、次の様に書かれて、これで制御されているので、書かれた順によると思うのです。 $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)

  • Ruby
  • 回答数1
  • ありがとう数0

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

initializeの方でどうにかなったりしないのですかね? auto loadで実際に読み込むタイミングって最初に必要になったタイミングですよね?

m_matsubara
質問者

補足

青い羊さん、ありがとうございます。 initializeと言うのが、どれのinitializeなのか次第です。 railsのinitializeであれば、ここで先に読み込んでしまうとautoloadの良さを消してしまいますし、helper関数はmoduleなのでinitializeは呼べないので、Gemで読み込み順を制御する方法は、対象次第です。

関連するQ&A

  • gem install railsで「NameError」

    gemでrailsを指定ディレクトリにインストールをしようとしているのですが、railsのインストールでエラーが出てしまいます。 rubyはもともと入っており、管理者権限などが無いため、 rubygemsを指定ディレクトリ以下にいれgemコマンドで ←gem install rails --include-dependencies を投入したところ、 →ERROR: While executing gem ... (NameError) uninitialized constant Digest::MD5 のエラーが表示されてしまいます。 gem -vなど、正常に実行されるコマンドもあります。 原因などわかる方がいらっしゃれば、教えていただきたいです。 ・バージョン、場所 rubygems:1.3.1  指定ディレクトリ/rubygems ruby:1.8.7 /usr/local/lib/ruby

    • ベストアンサー
    • Ruby
  • spl_autoload_registerについて

    PHPのspl_autoload_registerについて、2つ教えてください ■質問1 ・(func1の中で複数処理するのではなく)この関数自体を2つ書いても良い? ・その場合、後から書いた方が優先される? spl_autoload_register(func1()); spl_autoload_register(func2()); ■質問2 ・spl_autoload_registerで登録しているパスを確認する方法は? ・get_include_pathみたいに、読み込むよう設定されているパスを確認したい

    • ベストアンサー
    • PHP
  • エラーでハマっている為、use AutoLoaderする際の記述法と概

    エラーでハマっている為、use AutoLoaderする際の記述法と概念を知りたいです。 ----------------------------------------------- test.cgi use lib '/var/www/lib'; unshift @INC, '/var/www/lib'; use AutoLoader 'AUTOLOAD'; RegistDataList();#ここで存在しない関数を呼び出す ----------------------------------------------- ●自作モジュール(UserEditCommon.pm) ----------------------------------------------- package UserEditCommon; BEGIN{ use Exporter(); @ISA = qw(Exporter); @EXPORT_OK = qw(RegistDataList); } use utf8; use open ":utf8"; use open ":std"; use AutoLoader 'AUTOLOAD'; 1; __END__ ここ以降に色々な関数が記述されていますが、元々ライブラリーだった為、OOP的なコンストラクタやデストラクタは記述していません。 ---------------------------------------------- $ perl -e 'use AutoSplit; autosplit($ARGV[0], $ARGV[1], 0, , 1)' UserEditCommon.pm auto 上記を実行すると、auto/UserEditCommon/関数名.alファイルが沢山出来ました。 それを/var/www/lib/autoとしてUP ●下記を参考にしているのですが http://perldoc.jp/docs/perl/5.8.0/AutoLoader.pod.pod 抜粋「B<AutoLoader>のAUTOLOADサブルーチンために、 明示的にそれをインポートI<しなければなりません>。」 とある為、 use AutoLoader 'AUTOLOAD'; と記述する際はtest.cgi内ではsub AUTOLOADが必要ないと解釈しています。 実行した際、 Can't locate auto/main/RegistDataL.al in @INC (@INC contains: /var/www/lib ... となり、auto/main/のRegistDataList.alが呼ばれているはずなのに、なぜRegistDataL.alという名前でのエラーなのでしょうか ●またtest.cgi内で use AutoLoader; とした場合のsub AUTOLOAD内の記述をお教え願えませんでしょうか sub AUTOLOAD { #print "$AUTOLOAD は未定義です"; my $sub = $AUTOLOAD; $sub =~ s/.*:://; $AutoLoader::AUTOLOAD = $sub; goto &AutoLoader::AUTOLOAD; } 上記のようにしても、エラー内容が Can't locate auto/AutoLoader/RegistDataL.al in @INC (@INC contains: /var/... となってしまい、どうすればよいか途方にくれています。

    • ベストアンサー
    • Perl
  • MinGWをXPにインストール後 DOSのipconfig など使えな

    MinGWをXPにインストール後 DOSのipconfig など使えなくなる 標記の通り、昨日MinGWというC言語の環境をインストールした。 それに応じてシステムの環境関数もいくつか追加した。下記: 1 MINGW_PATH=G:\MinGW 2 C_INCLUDE_PATH=%MINGW_PATH%\include;%MINGW_PATH%\lib\gcc\mingw32\3.4.5\include 3 CPLUS_INCLUDE_PATH=%MINGW_PATH%\include\c++\3.4.5;%MINGW_PATH%     \include\c++\3.4.5\mingw32;%MINGW_PATH%\include\c++\3.4.5backward;%C_INCLUDE_PATH% 4 LIBRARY_PATH=%MINGW_PATH%\lib;%MINGW_PATH%\lib\gcc\mingw32\3.4.5 5 PATH=%MINGW_PATH%\bin;%MINGW_PATH%\libexec\gcc\mingw32\3.4.5 そうしてから、DOSでipconfig 出来なくなるだけじゃなく、社内用のメールボクスも開けなくなる。 一体なぜか? どなたか教えていただきませんか

  • rubyでrequireできない

    gemを使ってmechanizeをインストール完了までいったのですが、ruby実行時にrequire 'mechanize'で落ちてしまいます。 --sample.rb-- require 'rubygems' require 'mechanize' #require 'mechanize-2.7.3' p 'OK' 結果 /home/USERNAME/.rbenv/versions/2.1.5/lib/ruby/2.1.0/rubygems/core_ext/kernel_require.rb:55:in `require': cannot load such file -- mechanize (LoadError) from /home/USERNAME/.rbenv/versions/2.1.5/lib/ruby/2.1.0/rubygems/core_ext/kernel_require.rb:55:in `require' from sample.rb:2:in `<main>' 現在のgem listでmechanizeは出てきましたので、gemのインストールは上手くいってます。 mechanize (2.7.3) ただLOAD_PATHをみてみると、 ["/home/USERNAME/.rbenv/rbenv.d/exec/gem-rehash", "/home/USERNAME/.rbenv/versions/2.1.5/lib/ruby/site_ruby/2.1.0", "/home/USERNAME/.rbenv/versions/2.1.5/lib/ruby/site_ruby/2.1.0/x86_64-linux", "/home/USERNAME/.rbenv/versions/2.1.5/lib/ruby/site_ruby", "/home/USERNAME/.rbenv/versions/2.1.5/lib/ruby/vendor_ruby/2.1.0", "/home/USERNAME/.rbenv/versions/2.1.5/lib/ruby/vendor_ruby/2.1.0/x86_64-linux", "/home/USERNAME/.rbenv/versions/2.1.5/lib/ruby/vendor_ruby", "/home/USERNAME/.rbenv/versions/2.1.5/lib/ruby/2.1.0", "/home/USERNAME/.rbenv/versions/2.1.5/lib/ruby/2.1.0/x86_64-linux"] でgemによってインストールされたlibが /var/lib/gems/1.9.1/gems/mechanize-2.7.3/lib/ LOAD_PATHにないことが原因かもしれないですが、対処法が分からず困ってます。 どなたかご回答願いします。 尚rubyのバージョンは ruby 2.1.5p273 (2014-11-13 revision 48405) [x86_64-linux]

  • さくらレンタルサーバー上でのredmineインストールについて

    こんにちは。始めまして。 どこに質問して良いのか迷ったのですがここで質問させて下さい。 現在さくらのレンタル鯖にredmineというwebプロジェクト管理アプリケーションを導入したく 色々情報をかき集めて、設定していったのですが何度やってもweb上でHTTP500エラーが出てしまいます。 大まかに自分が行った事を記載しますのでもし間違い等ありましたら指摘してくれるとうれしいです。 ■$HOME/local に必要環境をインストール (1)rubyのインストール(1.8.6) (2)rubygemのセットアップ(1.3.1) (3)railsのセットアップ(2.1.2) (4).bashrc ファイルにパスを通す (SQLは最初からさくらのサーバーに入っているそうです) ■$HOME/rails/redmine にredmine(0.7.3)をインストール $ cd $HOME/rails $ wget redmine-0.7.3.tar.gz $ tar zxvf redmine-0.7.3.tar.gz $ mv redmine-0.7.3.tar.gz redmine $ cd redmine $ chmod o+w tmp log ■redmine/config のデータベース設定の編集 $ cd $HOME/rails/redmine/config $ cp database.yml.example database.yml $ vi database.yml ↓変更前 /*---------------------------------------------------*/ production: adapter: mysql database: redmine host: localhost username: root password: encoding: utf8 /*---------------------------------------------------*/ ↓変更後 /*---------------------------------------------------*/ production: adapter: sqlite3 database: db/redmine.db timeout: 5000 /*---------------------------------------------------*/ ■データベースの作成 $ cd $HOME/rails/redmine/config $ rake db:migrate RAILS_ENV=production ここでno such file to load -- iconv言われ、iconvをインストール 更にno such file to load -- sqlite3と言われ、 $ gem install sqlite3-ruby 再度 $ rake db:migrate RAILS_ENV=production $ rake redmine:load_default_data RAILS_ENV=production ■アプリケーションの実行環境設定 設定ファイルの変更 (1) $ cd $HOME/rails/redmine/config $ vi environment.rb 先頭に以下を追加 /*---------------------------------------------------*/ $LOAD_PATH.push("/home/***/local/lib/ruby/site_ruby/1.8") $LOAD_PATH.push("/home/***/local/lib/ruby") ENV['GEM_HOME'] ||= '/home/***/local/lib/ruby/gems/1.8' ENV['PATH']+=':/home/***/local/bin' /*---------------------------------------------------*/ (2) $ cd $HOME/rails/redmine/public $ vi .htaccess 以下の行をコメントアウト #Options +FollowSymLinks +ExecCGI (3) $ cd $HOME/rails/redmine/public $ cp dispatch.cgi.example dispatch.cgi $ vi dispatch.cgi 文頭の /*---------------------------------------------------*/ #!/usr/bin/ruby  /*---------------------------------------------------*/ の部分を /*---------------------------------------------------*/ #!/home/***/local/bin/ruby ENV[’RAILS_ENV’] ||= ‘production’ /*---------------------------------------------------*/ に変更 ■webサーバーで表示するようシンボリックリンクを作成 $ cd $HOME/www $ mkdir test $ ln -s $HOME/rails/redmine/public $HOME/www/test/redmine このような設定で、http://***.sakura.ne.jp/test/redmine/にアクセスすると トップページが表示されるはずなのですが、何度やり直してもHTTP500エラーになってしまいます。 どなたかこれだけの情報で、間違いの点に気づく方いましたら教えてもらえるとうれしいです。 よろしくお願いします。

  • ZenCartのインストールができません

    共用サーバーにZenCartをインストールしようとしています。 MySQLデータベースは、サーバー標準のものを利用、データベースはONになっています。 ZenCartのバージョンは、v1.3.0.2日本語版です。 インストールで、システム検査は、すべてグンリーンのチェックとなります。 データベース設定で、「データベース設定の保存」ができず、すすむことができません。(エラー表示等はありません。) データベースパスワードを入力しないと、データベースに接続できないというエラーが出るので、データベースには、接続できているようです。 サーバーのエラーログには、以下の内容が残っております。 PHP Warning: include(/includes/classes/class.base.php): failed to open stream: No such file or directory in /(中略)/includes/autoload_func.php on line 59 PHP Warning: include(): Failed opening '/includes/classes/class.base.php' for inclusion (include_path='.:/usr/lib64/php/pear') in /(中略)/includes/autoload_func.php on line 59 PHP Warning: include(/includes/classes/class.notifier.php): failed to open stream: No such file or directory in /(中略)/includes/autoload_func.php on line 59 PHP Warning: include(): Failed opening '/includes/classes/class.notifier.php' for inclusion (include_path='.:/usr/lib64/php/pear') in /(中略)/includes/autoload_func.php on line 59 PHP Fatal error: Class 'notifier' not found in /(中略)/includes/autoload_func.php on line 78 どこをどのようにすれば、解決できるのか、ご教示いたければありがたいです。よろしくお願いします。

  • Rails bootstrapの環境構築について

    Ruby on RailsでTwitter bootstrapを使用するための環境構築方法をご教授ください。 【環境】 Windows7 ruby 1.9.2 rails 3.2.3 『Gemfile』の一番下に gem 'twitter-bootstrap-rails' を追記して bundle install を実施すると下記エラーで止まります。 -------------------------------------------------------------------------------- $ bundle install Fetching gem metadata from https://rubygems.org/......... Using rake (0.9.2.2) Using i18n (0.6.0) Using multi_json (1.3.6) Using activesupport (3.2.3) Using builder (3.0.0) Using activemodel (3.2.3) Using erubis (2.7.0) Using journey (1.0.4) Using rack (1.4.1) Using rack-cache (1.2) Using rack-test (0.6.1) Using hike (1.2.1) Using tilt (1.3.3) Using sprockets (2.1.3) Using actionpack (3.2.3) Using mime-types (1.19) Using polyglot (0.3.3) Using treetop (1.4.10) Using mail (2.4.4) Using actionmailer (3.2.3) Using arel (3.0.2) Using tzinfo (0.3.33) Using activerecord (3.2.3) Using activeresource (3.2.3) Using bundler (1.1.5) Using coffee-script-source (1.3.3) Using execjs (1.4.0) Using coffee-script (2.2.0) Using rack-ssl (1.3.2) Using json (1.7.4) Using rdoc (3.12) Using thor (0.14.6) Using railties (3.2.3) Using coffee-rails (3.2.2) Using commonjs (0.2.6) Using jquery-rails (2.0.2) Using less (2.2.1) Using less-rails (2.2.3) Installing libv8 (3.3.10.4) with native extensions Gem::Installer::ExtensionBuildError: ERROR: Failed to build gem native extension. c:/Ruby192/bin/ruby.exe extconf.rb *** extconf.rb failed *** Could not create Makefile due to some reason, probably lack of necessary libraries and/or headers. Check the mkmf.log file for more details. You may need configuration options. Provided configuration options: --with-opt-dir --without-opt-dir --with-opt-include --without-opt-include=${opt-dir}/include --with-opt-lib --without-opt-lib=${opt-dir}/lib --with-make-prog --without-make-prog --srcdir=. --curdir --ruby=c:/Ruby192/bin/ruby Checking for Python...Unable to build libv8: Python not found! Gem files will remain installed in c:/Ruby192/lib/ruby/gems/1.9.1/gems/libv8-3.3.10.4 for inspection. Results logged to c:/Ruby192/lib/ruby/gems/1.9.1/gems/libv8-3.3.10.4/ext/libv8/gem_make.ou -------------------------------------------------------------------------------- 自分で調べたところ『libv8』,『therubyracer』が影響している?ようですが、 自環境にlibv8,therubyracerをうまくインストールする事ができません。 こちらを解決したら、Twitterbootstrapが使えるようになるのかもよく分かってません。。。。 結果として、上記環境のRailsでTwitterbootstrapが使えるようにしたいです。 解決策がお分かりの方がいましたら、ご教授をお願い致します。

    • ベストアンサー
    • Ruby
  • Passengerがインストールできない。。。

    Apache上にて Railsアプリケーションを動作させたいために、 Apacheのモジュールである、”Phusion Passenger”をインストールしようと思ったのですが、 C:\>gem install passengerにて以下のエラーがでます。 ************↓ここから**************************************** Building native extensions. This could take a while... ERROR: Error installing passenger: ERROR: Failed to build gem native extension. c:/ruby/bin/ruby.exe extconf.rb install passenger creating Makefile nmake Microsoft(R) Program Maintenance Utility Version 8.00.50727.762 Copyright (C) Microsoft Corporation. All rights reserved. cl -nologo -I. -Ic:/ruby/lib/ruby/1.8/i386-mswin32 -Ic:/ruby/lib/ruby/1. 8/i386-mswin32 -I. -MD -Zi -O2b2xg- -G6 -c -Tcnative_support.c cl : コマンド ライン warning D9035 : オプション 'Og-' の使用は現在推奨されていま せん。今後のバージョンからは削除されます。 cl : コマンド ライン warning D9002 : 不明なオプション '-G6' を無視します native_support.c native_support.c(22) : fatal error C1083: include ファイルを開けません。'sys/un. h': No such file or directory NMAKE : fatal error U1077: '"C:\Program Files\Microsoft Visual Studio 8\VC\BIN\c l.EXE"' : Stop. Gem files will remain installed in c:/ruby/lib/ruby/gems/1.8/gems/passenger-2.0. 6 for inspection. Results logged to c:/ruby/lib/ruby/gems/1.8/gems/passenger-2.0.6/ext/passenger/g em_make.out ************↓ここまで**************************************** 環境変数などの問題かとも思いましたが。。。bin/lib/includeのパスも追加しましたがダメでした。 是非この問題の対応が分かる方は教えて下さい。 環境:: OS:Windows XPPro SP3 ruby 1.8.6 (2007-09-24 patchlevel 111) [i386-mswin32] Rails 2.3.0 gem 1.3.1

  • インクルードファイルの設定について

    現在code gear C++ builder 2009でプログラミングを勉強してるのですが、 #include <boost/regex.hpp> このファイルをインクルードしてビルドするとビルドができるのですが、 ”ツール”--->”オプション”---->”C++オプション”---->”パスとディレクトリ” (インクルードパス) $(BDS)\ObjRepos\Cpp $(BDS)\include\Indy10 $(BDS)\RaveReports\Lib C:\lib\jvcl\include\D12 C:\c_compornet\component\TMS4808 この中のパスの中には”regex.hpp”がある”C:\Program Files (x86)\CodeGear\RAD Studio\6.0\include\boost_1_35\boost\spirit\utility”のパスを指していないように思うのですが、このふぃあるを指していることを確認する方法などありますでしょうか? また (BDS)というのはどんなものなのかも教えて頂けないでしょうか?

専門家に質問してみよう