将rubygem收集从一台机器转移到另一台机器的最佳实践

我想将我的所有gem从一台机器(foo)复制到另一台机器(bar)。 这两台机器是相同的,只是foo安装了一堆gem而bar没有(bar不能进入互联网)。

我将/ usr / local / lib / ruby​​ / gems从foo复制到bar,现在bar识别出已经安装了gem。

root@bar # gem list *** LOCAL GEMS *** keybox (1.2.1) rake (0.9.2.2) ... and so on 

如果我尝试从他们的本地位置运行它们,它们按预期工作

 root@bar # cd /usr/local/lib/ruby/gems/1.8/gems/keybox-1.2.1/bin root@bar # ./keybox --version keybox: version 1.2.1 

我想把所有的gem放在一个共同的bin目录下,就像它们在foo上一样

 root@bar # find /usr/local/lib/ruby/gems/1.8/gems/*/bin -type f | xargs -I baz ln -s baz /usr/local/bin/ 

正如预期的那样,这会创建从每个gem的位置到/ usr / local / bin /的符号链接

对于某些gem(如rake),一切都按预期工作,对于其他gem(如密码盒),它不起作用。 对于某些gem,gem目录中的脚本与安装在/ usr / local / bin下的脚本之间存在差异。

 root@foo # diff /usr/local/lib/ruby/gems/1.8/gems/keybox-1.2.1/bin/keybox /usr/local/bin/keybox 1,4c1,7 < #!/usr/bin/env ruby < ######################################################################## < #  #!/usr/local/bin/ruby18 > # > # This file was generated by RubyGems. > # > # The application 'keybox' is installed as part of a gem, and > # this file is here to facilitate running it. > # 6,17c9 < #---------------------------------------------------------------------- < # bootstrap < #---------------------------------------------------------------------- < begin < require 'keybox' < require 'keybox/application/password_safe' < rescue LoadError < path = File.expand_path(File.join(File.dirname(__FILE__),"..","lib")) < raise if $:.include? path < $: << path < retry  require 'rubygems' 19,21c11 < #---------------------------------------------------------------------- < # instantiate the program and pass it the commandline parameters  version = ">= 0" 23,24c13,16 < keybox = Keybox::Application::PasswordSafe.new(ARGV)  if ARGV.first =~ /^_(.*)_$/ and Gem::Version.correct? $1 then > version = $1 > ARGV.shift > end 25a18,19 > gem 'keybox', version > load Gem.bin_path('keybox', 'keybox', version) 

因为我已经将gem从一台机器复制到另一台机器,我也可以轻松地复制公共脚本,但有没有更“gem”的方法呢? 有没有一个gem命令可以重新生成公共脚本,就像在密钥箱中一样?

如果您通过端口安装了gem,则以下内容应该有效

  1. 列出所有gem,例如pkg_info | grep rubygem | cut -d ' ' -f 1 pkg_info | grep rubygem | cut -d ' ' -f 1
  2. 使用’pkg_create -Rnb’从本地安装的端口(和必要的依赖项)创建包。
  3. 将包复制到目标计算机
  4. 使用pkg_add在那里安装它们。

尝试使用以下命令:

 gem pristine --all 

这将从缓存的源(我相信你复制)重新安装gem,因此应该重新创建脚本包装器,重新编译扩展等。

您还可以查看文档以调整命令以满足您的需要(如果您想要执行此操作,则只需还原可执行文件的标志)。