Ruby Gemspec依赖关系:是否可能有git分支依赖关系?
在mygem.gempec中是否可能存在git分支依赖关系 我的想法与以下类似:Ruby Gemspec依赖关系:是否可能有git分支依赖关系?,ruby,rubygems,dependencies,bundler,gemspecs,Ruby,Rubygems,Dependencies,Bundler,Gemspecs,在mygem.gempec中是否可能存在git分支依赖关系 我的想法与以下类似: gem.add_runtime_dependency 'oauth2', :git => 'git@github.com:lgs/oauth2.git' 。。。但是它不起作用。这是不可能的,而且可能永远也不会,因为RubyGems允许gem开发者要求用户安装特定的版本控制系统来访问gem,这对RubyGem来说是相当苛刻的。Gems应该是自包含的,具有最少数量的依赖项,以便人们可以在尽可能广泛的应用程序中使
gem.add_runtime_dependency 'oauth2', :git => 'git@github.com:lgs/oauth2.git'
。。。但是它不起作用。这是不可能的,而且可能永远也不会,因为RubyGems允许gem开发者要求用户安装特定的版本控制系统来访问gem,这对RubyGem来说是相当苛刻的。Gems应该是自包含的,具有最少数量的依赖项,以便人们可以在尽可能广泛的应用程序中使用它们 如果您想为自己的内部项目执行此操作,我的建议是使用支持此操作的工具。EDIT 据一位评论人士称,这已不再是事实。为历史背景保留的先前信息
在Gemfile和.gempec中复制对gem的引用现在似乎会在Bundler中引发一条警告消息,因此这个答案似乎不再正确 过时信息
耶胡达·卡茨的文章为我澄清了类似的困惑。它说,仅用于开发,最好将git内容添加到gemfile中,但bundler仍将使用gemspec中的依赖项/版本信息(对我来说似乎很神奇,但我相信Yehuda)。我也在试图解决这个问题。我刚刚提出了以下解决方案(我不确定您是否发布了gem或者是否有权重新发布oauth2gem) 在需要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"
此外,您还需要将所有oauth2 gem的运行时依赖项添加到您的gemspec中。我还没有想出解决这个问题的办法
这就是我所做的,它对我们有效,因为我们的gem需要通过git,所以我不确定这是否适用于rubygems发布的gem。我发现了一个非常简单的工作: 假设你在一个项目中,你想使用自制的gem
工具,它本身使用的是操作系统gemoauth2
如果您在oauth2
中制作了一个补丁,并且需要在gem工具中使用该补丁,那么您将无法根据在gem中修复此问题
但是,您可以在projetp
的GEM文件中指定所需的版本,这将是运行时工具使用的版本:
gem'oauth2',github:'lgs/oauth2'
。。。是的,但是我怎么做呢?但是如果你的宝石以后会被包括在另一个宝石中(例如foobar_宝石)呢?当foobar_gem想要解决您的gem中的依赖关系时,它不会只在gemspec文件中查找吗?您是否找到了解决方案?我也有完全相同的问题?@eremzeit&msaspence-既然您有这么多的投票权,我觉得必须做出回应。没有解决办法,因为你做错了。使用Bundler为单个应用程序依赖git repo是可以的,而发布的gem依赖GitHub或任何其他源代码存储库是完全错误的。如果您要发布gem,那么它的所有依赖项也必须作为gem发布。要使一个正式的包(如gem)依赖于未发布的源代码是本末倒置的。请不要尝试这样做。@gtd在rubygems上创建宝石和发布宝石是两件不同的事情。一个私有的未发布的gem可能有自己的私有依赖项。这对我来说很好。RubyGems似乎不适合这个用例,但我不认为这是错误的。支持它的东西不多。我错了吗?我有同样的问题,只是我想要一个路径依赖,而不是git依赖。难道没有办法绕过这件事吗?也许在gemspec中的某个地方粘贴一些粗糙的Ruby代码?这有什么神奇之处?Bundler只从gempec文件中读取数据,除非您将gempec
放入其中,否则它也会从gempec读取数据。因此,当您运行bundle install
时,我假设(但尚未测试)Bundler安装gem文件中指定的gem。由于Bundler已经安装了它,所以无论它不是来自gem存储库,gem都可以使用该gem来require
。没有魔法,只是Bundler像往常一样工作。在Gemfile和.gempec中复制对gem的引用现在似乎会在Bundler中发出警告消息,因此,这个答案似乎不再正确……如果您已经编写了两个gem并且都在积极开发中,那么将依赖项添加为子模块是正确的解决方案。重要的是,如果您这样做,您可能需要使用:gem'my_gem',git:'git@github.com:me/myrepo',子模块:如果您是从github安装,则在主机应用程序中为true
。
$:.push File.expand_path('../lib/oauth2/lib', __FILE__)