我将一些ruby代码打包到gem中.我想在其他一些代码中引用gem中的代码.所以在Gemfile中我指定了gem的名称,版本和本地路径.喜欢:
gem 'gemname','0.x', :path => 'RELATIVE_PATH_TO_GEM_FILE'
Run Code Online (Sandbox Code Playgroud)
捆绑安装后,我明白了
Using gemname (0.x) from source at RELATIVE_PATH_TO_GEM_FILE
Run Code Online (Sandbox Code Playgroud)
但是当我运行代码时,它无法在gem中找到代码.LOAD_PATH显示ABSOLUTE_PATH_TO_GEM_FILE/lib.
难怪它找不到代码,只有ABSOLUTE_PATH_TO_GEM_FILE下的gem文件.它没有打开包装.所以没有lib目录.
如果我宝石将这个宝石文件安装到我的系统中,那么一切正常.我可以看到gem文件被解压缩到源代码文件中.但我的问题是它是否可以直接引用本地gem文件?
我明白要添加$ LOAD_PATH的路径就行了
$LOAD_PATH.unshift(path)
Run Code Online (Sandbox Code Playgroud)
但是我必须在我写的每个程序中添加这一行.无论如何将其添加到系统级别?
我尝试在Ruby的启动脚本上搜索一下,但没有找到答案.我试图加入这一行kernel/common/module.rb,ruby_constants.rb,loader.rb,等.但都不起作用.
我应该在哪个文件中添加此行?
更新:
我正在使用ubuntu 10.04和Rubinius.没有调用的系统变量RUBYLIB.
尝试创建一个但没有工作.但我意识到我犯了一个错误,忘了在bash脚本中添加变量.bashrc.添加变量后,一切正常!
我正在升级到Rails 3.2.6(ruby 1.9.3-p194)并在Debian上安装RVM并使用Apache2服务器(2.2.19).
我使用了这些非常好的说明:http://dalibornasevic.com/posts/21-rvm-and-passenger-setup-for-rails-2-and-rails-3-apps/
Apache服务器配置/etc/apache2/apache2.conf包括:
LoadModule passenger_module /usr/local/rvm/gems/ruby-1.9.3-p194@rails326/gems/passenger-3.0.13/ext/apache2/mod_passenger.so
PassengerRoot /usr/local/rvm/gems/ruby-1.9.3-p194@rails326/gems/passenger-3.0.13
PassengerRuby /usr/local/rvm/wrappers/ruby-1.9.3-p194@rails326/ruby
Run Code Online (Sandbox Code Playgroud)
当我设置好一切(并摆脱了大量的错误消息:)时,会出现以下来自乘客的错误消息:
$LOAD_PATH.unshift行,所有应该再次正常.通过$LOAD_PATH.unshift在MyApp/config/setup_load_paths.rb中注释,此错误消失,而我得到500错误,内部服务器错误.
/etc/log/apache2/error.log:
[ pid=5262 thr=3075372800 file=ext/apache2/Hooks.cpp:862 time=2012-07-10 12:33:41.475 ]: Unexpected error in mod_passenger: Cannot spawn application '/var/www/MyApp': The spawn server has exited unexpectedly.
Backtrace:
in 'virtual Passenger::SessionPtr Passenger::ApplicationPool::Client::get(const Passenger::PoolOptions&)' (Client.h:742)
in 'Passenger::SessionPtr Hooks::getSession(const Passenger::PoolOptions&)' (Hooks.cpp:294)
in 'int Hooks::handleRequest(request_rec*)' (Hooks.cpp:563)
Run Code Online (Sandbox Code Playgroud)
如果有人能给我一个关于这个问题的线索,我会很高兴.
非常感谢你.
鸢尾花
我有两节课:
1.Sale是ActiveRecord的子类; 它的工作是将销售数据保存到数据库中.
class Sale < ActiveRecord::Base
def self.total_for_duration(start_date, end_date)
self.count(conditions: {date: start_date..end_date})
end
#...
end
Run Code Online (Sandbox Code Playgroud)
2.SalesReport是一个标准的Ruby类; 它的工作是生成和绘制有关销售的信息.
class SalesReport
def initialize(start_date, end_date)
@start_date = start_date
@end_date = end_date
end
def sales_in_duration
Sale.total_for_duration(@start_date, @end_date)
end
#...
end
Run Code Online (Sandbox Code Playgroud)
因为我想使用TDD并且我希望我的测试运行得非常快,所以我为SalesReport编写了一个不加载Rails的规范:
require_relative "../../app/models/sales_report.rb"
class Sale; end
# NOTE I have had to re-define Sale because I don't want to
# require `sale.rb` because it would then require ActiveRecord.
describe SalesReport do
describe "sales_in_duration" do
it "calls Sale.total_for_duration" do
Sale.should_receive(:total_for_duration)
SalesReport.new.sales_in_duration
end …Run Code Online (Sandbox Code Playgroud) 我想将 gem 配置为仅使用系统 gem - 而不是$HOME/.gem. 这是因为我正在编写一个将访问的脚本Gem.path,但我不希望它返回我的主目录中 gems 的路径。
我很确定我没有在我的等中明确设置GEM_HOME或类似的内容.bashrc。.bash_login
但Gem.path首先返回我的 homedir gems:
irb
> Gem.path
=> ["/home/nfm/.gem/ruby/1.9.1", "/usr/local/lib/ruby/gems/1.9.1"]
Run Code Online (Sandbox Code Playgroud)
我可以阻止这种情况发生吗?在哪里配置的?或者只是默认首先查看 homedir ?
如果我无法配置此功能,我可以使用 regexp hackery 返回 gem 的系统路径吗?
更多细节:
which ruby
/usr/local/bin/ruby
ruby --version
ruby 1.9.2p0 (2010-08-18 revision 29036) [x86_64-linux]
gem env
- RUBYGEMS VERSION: 1.3.7
- RUBY VERSION: 1.9.2 (2010-08-18 patchlevel 0) [x86_64-linux]
- INSTALLATION DIRECTORY: /usr/local/lib/ruby/gems/1.9.1
- RUBY EXECUTABLE: /usr/local/bin/ruby
- EXECUTABLE DIRECTORY: /usr/local/bin
- RUBYGEMS PLATFORMS: …Run Code Online (Sandbox Code Playgroud) 我需要知道我的Ruby加载路径中有什么,所以我这样做了:
$ ruby -e "puts $LOAD_PATH"
Run Code Online (Sandbox Code Playgroud)
它没有打印任何东西,我没想到.所以我尝试了这个:
$ ruby -e "puts $:"
/usr/local/lib/site_ruby/1.8
/usr/local/lib/site_ruby/1.8/i486-linux
/usr/local/lib/site_ruby/1.8/i386-linux
/usr/local/lib/site_ruby
/usr/lib/ruby/vendor_ruby/1.8
/usr/lib/ruby/vendor_ruby/1.8/i486-linux
/usr/lib/ruby/vendor_ruby
/usr/lib/ruby/1.8
/usr/lib/ruby/1.8/i486-linux
/usr/lib/ruby/1.8/i386-linux
.
Run Code Online (Sandbox Code Playgroud)
为什么第二个给我预期的输出而第一个没有?它们不应该是一样的吗?我刚尝试过irb,我得到了我期望的结果.
这是我的Ruby版本,以防它有所不同:
$ ruby --version
ruby 1.8.7 (2008-08-11 patchlevel 72) [i486-linux]
Run Code Online (Sandbox Code Playgroud) 我想知道更多,$:但我不知道怎么称呼.
:015 > $:
=> ["/Users/Nerian/.rvm/rubies/ruby-1.9.3-rc1/lib/ruby/site_ruby/1.9.1",
"/Users/Nerian/.rvm/rubies/ruby-1.9.3-rc1/lib/ruby/site_ruby/1.9.1/x86_64-darwin11.1.0",
"/Users/Nerian/.rvm/rubies/ruby-1.9.3-rc1/lib/ruby/site_ruby",
"/Users/Nerian/.rvm/rubies/ruby-1.9.3-rc1/lib/ruby/vendor_ruby/1.9.1",
"/Users/Nerian/.rvm/rubies/ruby-1.9.3-rc1/lib/ruby/vendor_ruby/1.9.1/x86_64-darwin11.1.0",
"/Users/Nerian/.rvm/rubies/ruby-1.9.3-rc1/lib/ruby/vendor_ruby",
"/Users/Nerian/.rvm/rubies/ruby-1.9.3-rc1/lib/ruby/1.9.1",
"/Users/Nerian/.rvm/rubies/ruby-1.9.3-rc1/lib/ruby/1.9.1/x86_64-darwin11.1.0"]
Run Code Online (Sandbox Code Playgroud)
我是ruby的新手但是我使用RVM安装了各种版本的Ruby,这是我的LOAD_PATH的输出
ruby-1.9.2-p136 :001 > puts $LOAD_PATH
/home/jose/.rvm/rubies/ruby-1.9.2-p136/lib/ruby/site_ruby/1.9.1
/home/jose/.rvm/rubies/ruby-1.9.2-p136/lib/ruby/site_ruby/1.9.1/i686-linux
/home/jose/.rvm/rubies/ruby-1.9.2-p136/lib/ruby/site_ruby
/home/jose/.rvm/rubies/ruby-1.9.2-p136/lib/ruby/vendor_ruby/1.9.1
/home/jose/.rvm/rubies/ruby-1.9.2-p136/lib/ruby/vendor_ruby/1.9.1/i686-linux
/home/jose/.rvm/rubies/ruby-1.9.2-p136/lib/ruby/vendor_ruby
/home/jose/.rvm/rubies/ruby-1.9.2-p136/lib/ruby/1.9.1
/home/jose/.rvm/rubies/ruby-1.9.2-p136/lib/ruby/1.9.1/i686-linux
Run Code Online (Sandbox Code Playgroud)
好.所以这里的问题是,在这些目录中我可以看到像Array或Time这样的类的源代码吗?(我知道,这是一个非常n00b的问题,但我需要知道.)
我一直需要看看Array的来源很长一段时间.
提前致谢!
PS.如果我想成为一名更好的红宝石程序员,你建议看哪一堂课?
为什么当前目录不包含在$ LOAD_PATH中?这看起来很奇怪.我只是继续添加它,但是有一些原因我没有看到它只是没有自动包含?