在mygem.gemspec内部是否可能有git分支依赖项?
我在想类似以下内容的东西:
gem.add_runtime_dependency 'oauth2', :git => 'git@github.com:lgs/oauth2.git'
...但是它不起作用。
在mygem.gemspec内部是否可能有git分支依赖项?
我在想类似以下内容的东西:
gem.add_runtime_dependency 'oauth2', :git => 'git@github.com:lgs/oauth2.git'
...但是它不起作用。
Answers:
这是不可能的,而且可能永远不会,因为对于RubyGems而言,它相当费力,以允许gem开发人员要求用户安装特定的版本控制系统才能访问gem。宝石应该是独立的,并且具有最少的依赖性,以便人们可以在尽可能广泛的应用程序中使用它们。
如果您想为自己的内部项目执行此操作,我的建议是使用Bundler,它对此提供了很好的支持。
编辑
据评论者说,这不再是事实。保留先前的信息以用于历史背景。
现在,在Gemfile和.gemspec中复制对gem的引用似乎会在Bundler中引发警告消息,因此此答案似乎不再成立。
过时的信息
Yehuda Katz的这篇文章为我澄清了类似的困惑。它说,仅用于开发中,最好将git东西添加到gemfile中,但是捆绑程序仍将使用gemspec中的依赖项/版本信息(对我来说似乎很神奇,但我相信Yehuda)。
gemspec
放在其中,否则它也会从gemspec中读取。因此,当您运行时bundle install
,我假设(但尚未测试)发生的情况是Bundler安装了Gemfile中指定的gem。由于Bundler已经安装了该宝石,因此该宝石可用于require
,而不管它不是来自宝石库。没有魔术,只有邦德勒照常工作。
我只是试图解决这个问题。我只是想出了以下解决方案(我不确定您是发布您的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 'my_gem', git: 'git@github.com:me/myrepo', submodules: true
在主机应用程序中使用: 如果是从github安装的。