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


Answers:


282

严格来说,这并不是您安装.gem软件包的问题的答案,但是您可以通过编辑Gemfile逐个 gem地指定各种位置。

指定:path属性将通过该路径在您的本地计算机上安装gem。

gem "foreman", path: "/Users/pje/my_foreman_fork"

或者,指定: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"

(正如@JHurrah他的评论中提到的。)


同样对于某些防火墙,git协议可能是一个问题。在这种情况下,请尝试gem "foreman", :git => "https://github.com/pje/foreman.git"
kode 2013年

60

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

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

mkdir repo
mkdir repo/gems
cp *.gem repo/gems
cd repo
gem generate_index

最后,通过将以下行添加到您的Gemfile中,将捆绑程序指向该位置

source "file://path/to/repo"

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


6
谢谢!另外,我需要第三个斜杠来执行“ file:/// Absolute / Path / to / repo”
Anna

5
在命令行上运行“ gem服务器”并将源“ localhost:8808 ”添加到您的Gemfile中会不会更容易
Anna

马丁真是太酷了!感谢您的共享,这正是我一直在寻找的原因,因为我不想依赖于运行,gem server也不想托管整个项目,而只是.gem文件。
Leo Gallucci

6
温馨提示:您可以使用File.expand_path这样的方法来满足绝对路径的要求source "file://#{File.expand_path('.')}/chef-11.10.0.dev.2"
Leo Gallucci

对我不起作用。Mac OS X. Bundler v1.11.2:Could not fetch specs from file://Users/nakilon/....../
Nakilon '16

43

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

gem unpack your.gem --target /path_to_app/vendor/gems/

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

gem 'your', '2.0.1', :path => 'vendor/gems/your'

29

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


真正。但是,如果我以前没有安装过该怎么办?(当我将其部署到服务器时)在完成的任何source命令中都找不到Imlib2-Ruby-0.5.2
ddayan 2011年

184
您可以使用gem“ gemname”指向本地目录::path =>“〜/ some / local / path”
JHurrah 2011年

5
我认为:path需要带有gemspec文件的gem文件夹。我只有我要安装的.gem文件。
ddayan 2011年

1
好的,所以帽部署通过了,但是未安装gem“没有要加载的文件-vips”:/
ddayan 2011年

4
至少在任何时候都绝对不是这样。捆绑并没有看你的系统的宝石,只有通过什么在Gemfile中去。如此可怕的原因之一。
bioneuralnet'2

6

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

在您的开发机器上:

bundle install

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

bundle package

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

在服务器上:

bundle install --local

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


如果我无法在服务器上安装任何东西怎么办?在这种情况下,我需要使用rake进行构建,但是服务器没有用于构建的gem;但是我在检查依赖项时没有问题。
亨里克

如果宝石未包含在我现有的Gemfile中,则“捆绑安装”对我不起作用。–
安娜

只需将宝石文件从宝石文件中临时删除,然后再将宝石文件bundle install复制到供应商/缓存中,然后将宝石重新添加到宝石文件中并执行 bundle install --local
bert bruynooghe,2013年

1
bundle package即使在三年后的今天,也是一个很好的建议。如果您的Bundler版本早于2.0(在撰写本文时尚未发布),bundle package --all则如果要包含带有pathgit依赖的gem,则需要使用。但是,如果它检测到这种依赖性,它将给您一个有用的提醒。
L2G 2014年

1
仅供参考:如果您在与部署平台不同的平台上进行开发(例如,在macOS上开发,部署到Linux),这可能无法达到您希望的效果。根据--local文档:“请注意,如果在rubygems.org上存在适当的平台特定的gem,则将找不到它。”
利亚姆·道森


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.