Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby Gemspec依赖关系:是否可能有git分支依赖关系?_Ruby_Rubygems_Dependencies_Bundler_Gemspecs - Fatal编程技术网

Ruby Gemspec依赖关系:是否可能有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应该是自包含的,具有最少数量的依赖项,以便人们可以在尽可能广泛的应用程序中使

在mygem.gempec中是否可能存在git分支依赖关系

我的想法与以下类似:

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
工具,它本身使用的是操作系统gem
oauth2

如果您在
oauth2
中制作了一个补丁,并且需要在gem
工具中使用该补丁,那么您将无法根据在gem中修复此问题

但是,您可以在projet
p
的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__)