在rails应用程序中本地使用gem,而无需修改Gemfile



我需要在Rails应用程序中本地使用gem(Rails Panel),而无需向git添加代码

我不能在版本控制中修改代码的原因是,我的团队在添加新gem方面有非常严格的政策。这并不理想,但如果必须的话,我可以从版本控制中排除文件。

我尝试了以下解决方案,但不起作用:

  1. 运行gem install meta_request

  2. 使用以下代码修改文件bin/rails

#!/usr/bin/env ruby
# original code [...]
gems = %w[meta_request]
gem_home = ENV['GEM_HOME']
gem_dir = Dir["#{gem_home}/gems/*/lib"]
gems.each do |gem|
gem_path = gem_dir.select { |r| r.include?(gem) }
$LOAD_PATH.append(*gem_path)
require gem
end
  1. bin/rails添加到.git/info/exclude

NB:在这种情况下,这个线程的答案不起作用,因为gem需要是";所需";。如何在本地使用gem而不将其强加给合作者?

解决方案1(易于理解但不通用)

无需修改加载路径的快速解决方案。

步骤1,打开一个终端并运行此命令以获得您想要在本地使用的gem的完整路径:

gem which GEM_NAME

第2步,在config/initializers/中创建一个初始值设定项文件local_dependencies.rb,并在文件中要求您的gem如下:

# file: config/initializers/local_dependencies.rb
require 'GEM_FULL_PATH'

步骤3,编辑.git/info/exclude并排除local_dependencies.rb文件:

# file: .git/info/exclude
config/initializers/local_dependencies.rb

全部完成!

解决方案2

这是一个更通用的解决方案,尽管这两个解决方案都绕过了bundler,但优点是不必更新Gemfile。

config/initializers/中创建一个初始化器文件local_dependencies.rb,并添加以下代码:

gems = {
'meta_request' => '0.7.2',
}
gem_home = ENV['GEM_HOME']
gems.each do |gem_name, version|
gem_path = "#{gem_home}/gems/#{gem_name}-#{version}/lib"
raise "GemNotFound: name: #{gem_name}, version: #{version}" unless File.directory?(gem_path)
$LOAD_PATH << gem_path
require gem_name
end

编辑.git/info/exclude并排除local_dependencies.rb文件:

# file: .git/info/exclude
config/initializers/local_dependencies.rb

全部完成!

您可以定义开发或测试之类的组,这些组在生产中不会产生任何影响,因此您可以将它们推送到git,而无需担心代码。

group :development do 
gem 'gem-name'
end

group :test do
gem 'gem-name'
end

环境名称("development"、"production"、"test")并没有什么神奇之处。因此,您可以定义一个单独使用的环境,如"lh_development"。

为了支持这一点,你需要一个config/environments/lh_development.rb文件,它本质上是config/envronments/development-rb的副本。在你的Gemfile中,你可以定义包含在:lh_development组中的gem。。。

group :lh_development do
# here list all the same gems that are included in the :development group
gem 'meta-request'
end

然后你将在你的开发机器上用启动你的服务器

RAILS_ENV=lh_development rails s

当然,您不建议使用包含特殊gem的代码进行测试,b/c您的测试构建应该与其他开发人员和生产构建相同。

我想这并不能严格满足您不修改Gemfile的要求,但它的修改方式不会影响其他开发人员或测试/生产环境。所以也许你的团队可以接受它?

最新更新