我需要在Rails应用程序中本地使用gem(Rails Panel),而无需向git
添加代码。
我不能在版本控制中修改代码的原因是,我的团队在添加新gem方面有非常严格的政策。这并不理想,但如果必须的话,我可以从版本控制中排除文件。
我尝试了以下解决方案,但不起作用:
-
运行
gem install meta_request
-
使用以下代码修改文件
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
- 将
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的要求,但它的修改方式不会影响其他开发人员或测试/生产环境。所以也许你的团队可以接受它?