有没有办法配置捆绑器,这样当我这样做时,rake release
它会将 gem 提交到我自己的 gem 服务器(盒子实例中的 gem)而不是 rubygems?
理想情况下,我可以从我的 git 存储库中省略此配置。
Rubygems 实际上是硬编码到 bundler 中的,我只找到了一种解决方法。
以下monkeypatch应该可以满足您的需求:
module Bundler
class GemHelper
protected
def rubygem_push(path)
if Pathname.new("~/.gem/nexus").expand_path.exist?
sh("gem nexus '#{path}'")
Bundler.ui.confirm "Pushed #{name} #{version} to https://<your-url-here>/."
else
raise "Your Nexus credentials aren't set. Run `gem nexus #{path}` to push your gem and set credentials."
end
end
end
end
以上是针对 Nexus 而不是 Geminabox,但这个概念应该适用于任何一个。
至于从 git 中省略它,恐怕我们不走运。但是,您可以在项目之间适当地共享它,因此只需将其签入一个位置而不是多个位置。希望这可以帮助!
我为此制作了一个无依赖的 gem,它模仿 geminabox http post 请求并用 rake release:inabox 覆盖捆绑器 rake 发布
添加'bundler_geminabox'
到您的 Gemfile:
group :development do
gem 'bundler_geminabox'
end
然后,在您的 rakefile 中,而不是要求'bundler/gem_tasks'
:
require 'bundler_geminabox/gem_tasks'
您不需要向 rakefile 添加任何任务;你会自动得到rake build
, rake install
, 和rake release
, 最后一个上传到列出的服务器~/.gem/geminabox
。否则,行为与 提供的等效任务相同bundler/gem_tasks
。
Github 上的宝石:https ://github.com/joshkrueger/bundler_geminabox
我设法更改了将 gem 上传到 rubygems 的任务,这比 JohnIV 提供的解决方案更具侵入性,尽管概念是相同的。
Rake::Task['release:rubygem_push'].clear
namespace :release do
task :rubygem_push do
version = ModuleName::VERSION
name = 'module_name'
cmd = "gem nexus pkg/#{name}-#{version}.gem"
puts `#{cmd} 2>&1`
end
end