Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 在Rails 3中运行时加载gem_Ruby On Rails_Ruby_Ruby On Rails 3_Rubygems_Bundler - Fatal编程技术网

Ruby on rails 在Rails 3中运行时加载gem

Ruby on rails 在Rails 3中运行时加载gem,ruby-on-rails,ruby,ruby-on-rails-3,rubygems,bundler,Ruby On Rails,Ruby,Ruby On Rails 3,Rubygems,Bundler,我有Rails 3.0.x应用程序。我想在运行时加载gems,而不使用Gemfile 我想完成的是像往常一样加载我的应用程序,Bundler加载常规gems。之后,我想加载位于特定目录中的所有gem(Rails引擎)(但在运行时之前,我不知道这是什么gem) 有人知道这在Rails中是否可行,或者使用Bundler API吗?试试这个: Bundler.with_clean_env do # require gems... end 你想做的事很危险。如果您的每一个Rails引擎都是gem,

我有Rails 3.0.x应用程序。我想在运行时加载gems,而不使用
Gemfile

我想完成的是像往常一样加载我的应用程序,Bundler加载常规gems。之后,我想加载位于特定目录中的所有gem(Rails引擎)(但在运行时之前,我不知道这是什么gem)

有人知道这在Rails中是否可行,或者使用Bundler API吗?

试试这个:

Bundler.with_clean_env do
  # require gems...
end

你想做的事很危险。如果您的每一个Rails引擎都是gem,那么它们也会有带有其他依赖项的Gemfiles,而这些Gemfiles又会有其他依赖项,等等。如果您允许Bundler解决这些问题,那么您在运行时的问题就会少一些

这里是你如何做到这一点没有任何黑客。请记住,您的
Gemfile
只是Ruby代码,您可以使用默认情况下未加载的gem

# In your Gemfile, add at the end:
Dir[YOUR_RAILS_ENGINES_SUBFOLDER + "/*/*.gemspec"].each do |gemspec_file|
  dir_name = File.dirname(gemspec_file)
  gem_name = File.basename(gemspec_file, File.extname(gemspec_file))

  # sometimes "-" and "_" are used interchangeably in gems
  # for e.g. gemspec_file is "engines/my-engine/my_engine.gemspec"
  #   dir_name will be engines/my-engine
  #   gem_name will be my_engine

  # Register that engine as a dependency, *without* being required
  gem gem_name, :path => dir_name, :require => false

  # e.g. this is similar to saying
  #  gem 'my_engine', :path => 'engines/my-engine', :require => false
end
现在,您已经将所有动态Rails引擎注册为gem依赖项。Bundler将解决它们以及它们的所有子依赖项,所以您不必担心任何事情。只需在运行应用程序之前或在该文件夹中添加/删除任何引擎时运行一次
bundle install

好的是,这些宝石将只是注册,而不是加载。因此,在生产代码中,您现在可以加载运行时选择的任何gem,只需说
require


编辑:额外的代码注释

我以前试过,我不知道我是否遗漏了什么,但是如果我将这一行添加到
boot.rb
中,我会得到错误:
“我的宝石”不是捆绑包的一部分。将它添加到Gemfile。
你写的是什么意思:
#需要gems…
,也许这就是我缺少的东西?很好,我在1.5年前问了这个问题,我不再使用Rails了,但我想这就是我一直在寻找的东西,它实际上可以工作。谢谢,我不是执行官,但我确实为这个问题开始了悬赏。问题是如何在运行时而不是启动时动态加载引擎。如果在启动时加载就足够了,那么更简单的方法是从boot.rb调用Bundler.load_gempec。这段代码远不是动态加载gems。出于好奇:您能解释一下这个用例吗?我不清楚你为什么要这么做,想法是让模块化的Rails应用程序在运行时加载它的模块。我想把模块/gems放到目录中,启动应用程序并保持灵活性:)好的,我假设您在客户端站点安装了一些通用的rails应用程序,并根据一些选项(费用/许可证),在文件夹中安装正确的模块。但是,如果您只是编辑GEM文件,然后捆绑安装呢?它工作更少,更安全,唯一的编辑/配置是编辑文件。这就是我们所做的。我们为自己的“私人”gems托管自己的gems服务器。如果一个模块被启用或禁用,我们只需编辑Gemfile、捆绑并重新启动。当然,这是选项之一,这是最后要做的事情(请记住,最近没有问过这个问题)。但是能够以某种方式在运行时加载模块会很好。