用户级捆绑器Gemfile

时间:2011-04-05 15:11:54

标签: bundler

我很想在Bundler中创建一个Gemfile,只需将我自己的个人Gemfiles设置为捆绑...

又称ruby-debug,交互式编辑器等等。

知道怎么做吗?

5 个答案:

答案 0 :(得分:2)

我们使用这种技术。 请在你的Gemfile中找到它:

eval File.read(File.expand_path("Gemfile.personal")) if File.exists?(File.expand_path("Gemfile.personal"))

然后将您的个人宝石添加到Gemfile.personal。当然,从版本控制中排除Gemfile.personal。

答案 1 :(得分:2)

这样做的一种方法是创建不同的环境

group :scott do 
end

然后

bundle --with-env = scott

答案 2 :(得分:1)

我不是100%确定你想要达到的目标,但是;

如果您只想指定一些仅限开发的gem,您可以指定可以从部署中排除的开发组:

group :development do
  gem "ruby-debug"
  gem "interactive-editor"
end

然后在生产或测试中你会做:

bundle install --without development

答案 3 :(得分:0)

我的主张不依赖于Bundler。因此,不会使Gemfile*与您的私人宝石混乱,因为价格不如@ScottSchulthess的回答便宜。

Bundler如何运作

有一个存储在$LOAD_PATH全局变量中的数组,它是“加载或需要的脚本和二进制模块的加载路径”(参见Ruby docs),Bundler修改了这个数组。

如果您正在开发一个gem $LOAD_PATH,它将包含系统中所有gem的路径。你可以简单地写一下require "pry"某处和pry gem将被正确加载,即使它没有在gemspec和Gemfile中提及。您不必将其添加到依赖项。 (当然它必须已经安装gem install pry。)

Bundler在开发应用程序时采取的一种非常不同的策略。在这种情况下,大多数$LOAD_PATH将在require bundler/setup上删除(Rails在config/boot.rb中调用它)。只有基本路径和那些指向Gemfile.lock中指定的宝石的路径才会保留。因此,如果您想在不将其添加到Gemfile的情况下使用pry,则必须在要求之前将其附加到$LOAD_PATH

应用程序解决方案

gems_root = $LOAD_PATH.detect{ |p| %r{/bundler-} =~ p}.sub(%r{/bundler-.*}, "")

additional_gems = {
  "pry" => "pry-0.10.1/lib",
  "pry-rails" => "pry-rails-0.3.2/lib",
}

load_paths = additional_gems.values.map{ |p| File.join gems_root, p }
$LOAD_PATH.unshift *load_paths
additional_gems.keys.each{ |r| require r }

如果您正在使用Rails,请将其保存在/config/initializers/00_custom_gems.rb中,这就是全部。外部Rails你还需要它,最好是在require "bundler/setup"之后:

require "path/to/it" if File.exists? "path/to/it"

请记住在.gitignore中提及此文件。

有时,正确的gem路径不会以/lib结尾,而是以架构名称结尾。学习它的最简单方法是将它暂时添加到Gemfile中,并在上述初始化程序中执行puts $LOAD_PATH。你也可以从gemspec学习这些目录。

宝石解决方案

开发gem时,您不需要增强$LOAD_PATH,只需要需要的宝石。如果您在测试中需要自定义gem并且正在使用RSpec,则可以在/spec/support中的某处完成。

另一个(不那么理智)的想法是添加文件lib/development.rb

require_relative "my_gem_name"
require "path/to/private/requires" if File.exists? "path/to/private/requires"

并在测试,演示应用程序等中引用此文件而不是“my_gem_name”。

答案 4 :(得分:0)

到目前为止,我找到的最干净的解决方案是使用单独的Gemfile.personal并使用自定义Gemfile路径。我喜欢这个解决方案,因为您可以在任何项目中使用它,而无需修改项目代码。

1。将Gemfile.personal添加到项目根目录

# /path/to/your_ruby_project/Gemfile.personal
eval File.read('Gemfile') # use all gems from Gemfile

gem 'personal-gem1'
gem 'personal-gem2'

2。使用Gemfile.personal文件安装gems

BUNDLE_GEMFILE="Gemfile.personal" bundle install
# or
bundle install --gemfile=Gemfile.personal

请记住,每次使用捆绑程序执行命令时都要指定BUNDLE_GEMFILE

我个人使用dotenvBUNDLE_GEMFILE=Gemfile.personal env变量放入.env文件中,这确保了在我用Gemfile.personal执行任何命令时始终使用bundler,因此不需要每次都手动放置。

3。将Gemfile.personalGemfile.personal.lock放入.gitignore

对于Linux用户:

touch ~/.gitignore
echo "Gemfile.personal\nGemfile.personal.lock" >> ~/.gitignore

这将影响所有项目,因此您无需分别更新每个项目.gitignore