如何在Gemfile中指定本地.gem文件?

dda*_*yan 152 ruby rubygems bundler

我有几个gem文件,我通过它安装gem install xx.gem.我可以告诉Bundler使用它们吗?或者我是否必须指定源路径?

pje*_*pje 277

这不是关于安装.gem包的问题的严格答案,但您可以通过编辑Gemfile以gem-by-gem为基础指定所有类型的位置.

指定:path属性将从本地计算机上的该路径安装gem.

gem "foreman", path: "/Users/pje/my_foreman_fork"
Run Code Online (Sandbox Code Playgroud)

或者,指定:git属性将从远程git存储库安装gem.

gem "foreman", git: "git://github.com/pje/foreman.git"

# ...or at a specific SHA-1 ref
gem "foreman", git: "git://github.com/pje/foreman.git", ref: "bf648a070c"

# ...or branch
gem "foreman", git: "git://github.com/pje/foreman.git", branch: "jruby"

# ...or tag
gem "foreman", git: "git://github.com/pje/foreman.git", tag: "v0.45.0"
Run Code Online (Sandbox Code Playgroud)

(正如@JHurrah评论中提到的那样.)


小智 58

似乎捆绑包不能使用开箱即用的.gem文件.指向:包含.gem文件的目录的路径不起作用.有人建议为此目的设置本地gem服务器(geminabox,stickler).

但是,我发现更简单的是从文件系统使用本地gem"服务器":只需将.gem文件放在本地目录中,然后使用"gem generate_index"使其成为Gem存储库

mkdir repo
mkdir repo/gems
cp *.gem repo/gems
cd repo
gem generate_index
Run Code Online (Sandbox Code Playgroud)

最后通过将以下行添加到Gemfile来将bundler指向此位置

source "file://path/to/repo"
Run Code Online (Sandbox Code Playgroud)

如果更新存储库中的gem,请确保重新生成索引.

  • 谢谢!另外,我需要第三个斜杠来做"file:/// Absolute/Path/to/repo" (6认同)
  • 额外提示:您可以通过使用File.expand_path来解决绝对路径要求,例如这个`source'文件://#{File.expand_path('.')} /chef-11.10.0.dev.2"` (6认同)
  • 在命令行上运行"gem server"并将源"http:// localhost:8808 /"添加到您的Gemfile中不是更容易吗? (5认同)

eda*_*dap 43

我会在应用程序供应商文件夹中解压缩您的gem

gem unpack your.gem --target /path_to_app/vendor/gems/
Run Code Online (Sandbox Code Playgroud)

然后在Gemfile上添加路径以链接解压缩的gem.

gem 'your', '2.0.1', :path => 'vendor/gems/your'
Run Code Online (Sandbox Code Playgroud)


JHu*_*rah 29

默认情况下,Bundler将首先检查您的系统,如果找不到gem,它将使用您的Gemfile中指定的源.

  • 你可以指向一个带有gem"gemname"的本地目录,:path =>"〜/ some/local/path" (183认同)
  • 我认为:path需要gemspec文件的gem文件夹.我只想安装.gem文件. (5认同)
  • 如果你告诉它使用什么版本,它可能会工作. (4认同)
  • 这绝对不是真的,至少在任何时候都是如此.Bundler不会*查看你的系统宝石,而只会查看Gemfile中的内容.其中一个原因是如此可怕. (4认同)

Hen*_*dge 6

您可以强制捆绑器使用通过“捆绑包”和“捆绑安装--local”部署的gem

在您的开发机器上:

bundle install
Run Code Online (Sandbox Code Playgroud)

(安装必需的gem并制作Gemfile.lock)

bundle package
Run Code Online (Sandbox Code Playgroud)

(在供应商/缓存中缓存宝石)

在服务器上:

bundle install --local
Run Code Online (Sandbox Code Playgroud)

(--local表示“使用供应商/缓存中的宝石”)