Ruby Gemspec依赖关系:可能有git branch依赖关系吗?


82

在mygem.gemspec内部是否可能有git分支依赖项?

我在想类似以下内容的东西:

gem.add_runtime_dependency 'oauth2', :git => 'git@github.com:lgs/oauth2.git'

...但是它不起作用。


除了要路径依赖而不是git依赖之外,我也有同样的问题。没有办法解决这个问题吗?也许通过在gemspec中的某个地方粘贴一些hackish Ruby代码?
2014年

Answers:


44

这是不可能的,而且可能永远不会,因为对于RubyGems而言,它相当费力,以允许gem开发人员要求用户安装特定的版本控制系统才能访问gem。宝石应该是独立的,并且具有最少的依赖性,以便人们可以在尽可能广泛的应用程序中使用它们。

如果您想为自己的内部项目执行此操作,我的建议是使用Bundler,它对此提供了很好的支持。


22
...是的,但是我该怎么办呢?
卡·

33
但是,如果您的宝石以后要包含在另一个宝石(例如foobar_gem)中怎么办?当foobar_gem要解析您的gem中的依赖项时,它不是仅在gemspec文件中显示吗?
eremzeit

7
您有没有找到解决这个问题的方法呢?
msaspence

14
@eremzeit&msaspence-由于您的投票太多,我不得不回应。没有解决方案,因为您做错了。使用Bundler为单个应用程序依赖git repo是很好的,对于发布的gem来说,依赖GitHub或任何其他源代码存储库是完全错误的。如果要发布gem,则其所有依赖项也必须作为gem发布。要制作诸如gem之类的正式程序包时,要依靠未发布的源代码,这就是将购物车摆在马前。 请不要尝试这样做
gtd 2014年

23
@gtd创建宝石并在rubygems上释放宝石是两件分开的事情。私有未发布的gem可能具有自己的私有依赖关系。在我看来,这很好。RubyGems似乎不适合这种用例,但我不认为这是做错了。没有太多的支持。我错了吗?
斯蒂芬·克罗斯比

13

编辑

据评论者说,这不再是事实。保留先前的信息以用于历史背景。

现在,在Gemfile和.gemspec中复制对gem的引用似乎会在Bundler中引发警告消息,因此此答案似乎不再成立。

过时的信息

Yehuda Katz的这篇文章为我澄清了类似的困惑。它说,仅用于开发中,最好将git东西添加到gemfile中,但是捆绑程序仍将使用gemspec中的依赖项/版本信息(对我来说似乎很神奇,但我相信Yehuda)。


3
那有什么神奇的呢?Bundler仅从Gemfile中读取-除非您将其gemspec放在其中,否则它也会从gemspec中读取。因此,当您运行时bundle install,我假设(但尚未测试)发生的情况是Bundler安装了Gemfile中指定的gem。由于Bundler已经安装了该宝石,因此该宝石可用于require,而不管它不是来自宝石库。没有魔术,只有邦德勒照常工作。
Marnen Laibow-Koser 2014年

2
现在,在Gemfile和.gemspec中复制对gem的引用似乎会在Bundler中引发警告消息,因此,此答案似乎不再正确……
Andy Jones

7

我只是试图解决这个问题。我只是想出了以下解决方案(我不确定您是发布您的gem还是有权重新分发该oauth2 gem)。

在需要oauth2 gem的gem中运行它。

git submodule add git@github.com:lgs/oauth2.git lib/oauth2

如果您需要与默认分支不同的分支

cd lib/oauth2 && git checkout <branchname_or_ref>
cd .. && git add lib/oauth2
git commit -m "adding outh2 submodule"

在您的gemspec中,将其添加到您所需的版本行上方

$:.push File.expand_path('../lib/oauth2/lib', __FILE__)

另外,您还需要将所有oauth2 gem的运行时依赖项添加到gemspec中。我还没有想办法解决这个问题。

这就是我所做的,并且对我们有用,因为通过git需要我们的gem,所以我不确定这是否适用于rubygems发布的gem。


如果您已经编写了两个gem,并且两个都处于活跃开发中,那么将依赖项添加为子模块是正确的解决方案。
Benjineer '16

重要的是,如果这样做,则可能需要gem 'my_gem', git: 'git@github.com:me/myrepo', submodules: true在主机应用程序中使用: 如果是从github安装的。
乔·埃德加

1

我发现一种解决方法很简单:

假设您在一个项目中,P并且想要使用tools本身使用OS gem的自制gem oauth2

如果您oauth2在宝石中制作了一个补丁,并需要该补丁tools,您将无法根据公认的答案在宝石中修复此问题。

但是,您可以在projetP的Gemfile中指定所需的版本,这将是tools运行时使用的版本:

gem 'oauth2', github: 'lgs/oauth2'

这是我真实的例子。

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.