【发布时间】:2013-01-26 14:17:11
【问题描述】:
有没有办法配置捆绑器,这样当我执行 rake release 时,它会将 gem 提交到我自己的 gem 服务器(gem in a box 实例)而不是 rubygems?
理想情况下,我可以从我的 git 存储库中省略此配置。
【问题讨论】:
有没有办法配置捆绑器,这样当我执行 rake release 时,它会将 gem 提交到我自己的 gem 服务器(gem in a box 实例)而不是 rubygems?
理想情况下,我可以从我的 git 存储库中省略此配置。
【问题讨论】:
我设法更改了将 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
【讨论】:
将'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,它模仿 geminabox http post 请求并用 rake release:inabox 覆盖 bundlers rake release
【讨论】:
Rubygems 实际上是硬编码到 bundler 中的,我发现只有一种解决方法。
以下的猴子补丁应该可以满足您的需求:
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 中省略它,恐怕我们不走运。但是,您可以在项目之间适当地共享它,因此只需将其签入一个位置而不是多个位置。希望这会有所帮助!
【讨论】: