Ruby Gemspec依赖:可能有git分支依赖吗?

BBJ*_*BJ3 77 ruby dependencies rubygems bundler gemspecs

可能有一个git分支依赖,在mygem.gemspec里面?

我在想类似以下内容:

gem.add_runtime_dependency 'oauth2', :git => 'git@github.com:lgs/oauth2.git'
Run Code Online (Sandbox Code Playgroud)

......但它不起作用.

gtd*_*gtd 41

这是不可能的,而且可能永远不会是因为RubyGems允许宝石开发人员要求用户安装特定的版本控制系统以访问gem,这将是相当苛刻的.Gems应该是自包含的,具有最少的依赖性,以便人们可以在尽可能广泛的应用程序中使用它们.

如果你想为你自己的内部项目做这个,我的建议是使用Bundler来支持这个.

  • 但是如果你的宝石后来被包含在另一个宝石中(例如foobar_gem)怎么办?当foobar_gem想要解决你的gem中的依赖关系时,它不会只在gemspec文件中查找吗? (31认同)
  • @gtd创建一个gem并在rubygems上发布一个gem是两个不同的东西.私有未发布的gem可能具有自己的私有依赖.这对我来说似乎很好.RubyGems似乎不适合这个用例,但我不相信这是错误的.没有太多支持它.我错了吗? (20认同)
  • ......是的,但我怎么办呢? (19认同)
  • @eremzeit&msaspence - 因为你有这么多的赞成,我觉得有必要回应.没有解决方案,因为_你做错了.使用Bundler依赖于单个应用程序的git repo是完美的,发布的gem依赖于GitHub或任何其他源代码存储库是完全错误的.如果要发布gem,其所有依赖项也必须作为gem发布.要制作一个像宝石这样的正式包依赖未发布的源代码就是把购物车放在马前.**请不要试图这样做**. (14认同)
  • 你有没有找到解决方案,我有完全相同的问题? (7认同)
  • 你就像你建议的那样,但在Gemfile中.如果没有明确的oauth2要求,请添加它("gem'oauth2',:git =>'....'")和捆绑安装. (6认同)
  • @StephenCrosby当我说RubyGems我指的是包管理器,而不是rubygems.org时,私有宝石仍然被发布(到私人服务器).同样,我不知道如何更清楚地说明这一点:如果你想从版本控制中抽出任意分支,**使用Bundler,它支持这个工作流程**.在RubyGems中这样做完全颠覆了正式发布数和声明的依赖关系,因为源repo分支没有永久性.此外,我不确定人们希望通过这个获得什么,但我向你保证它将无法维持. (3认同)
  • @eremzeit 因为 Bundler 会查看您的 `Gemfile` 和依赖项 `.gemspec` 文件,因此在您的 `Gemfile` 中添加对 Gem 的本地或 git 引用会告诉 bundler 在哪里可以找到它,即使它在另一个 gem 中被引用。你只需要确保你有兼容的版本规范。 (2认同)
  • @StephenCrosby我当时正处在Github托管我的私人宝石的情况。我正在开发依赖于私人宝石A的宝石B。我可以通过在宝石B的Gemfile中添加`gem'A',git:'git@github.com:myorganization / A.git'`使所有事情变得快乐*其.gemspec (2认同)

teh*_*ter 12

编辑

根据评论者的说法,这已不再适用.保留历史背景的先前信息.

在Gemfile和.gemspec中复制对gem的引用现在似乎在Bundler中引发了一条警告消息,所以这个答案看起来不再正确.

过时的信息

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

  • 这有什么神奇之处?Bundler只能从Gemfile中读取 - 除非你把`gemspec`放在那里,它也会从gemspec中读取.因此,当你运行`bundle install`时,我假设(但尚未测试)发生的事情是Bundler安装了Gemfile中指定的gem.由于Bundler已经安装了它,因此gem可用于`require`,无论它是不是来自gem存储库.没有魔力,只是Bundler像往常一样工作. (3认同)
  • 复制参考的Gemfile宝石和.gemspec现在看来,以提高在捆扎机一条警告消息,所以这个答案似乎是不再真实... (2认同)

kwb*_*ock 6

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

在你的宝石需要oauth2宝石运行这个.

git submodule add git@github.com:lgs/oauth2.git lib/oauth2
Run Code Online (Sandbox Code Playgroud)

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

cd lib/oauth2 && git checkout <branchname_or_ref>
cd .. && git add lib/oauth2
git commit -m "adding outh2 submodule"
Run Code Online (Sandbox Code Playgroud)

在您的gemspec中,在需要的版本行上方添加此项

$:.push File.expand_path('../lib/oauth2/lib', __FILE__)
Run Code Online (Sandbox Code Playgroud)

此外,您还需要将所有oauth2 gem的运行时依赖项添加到gemspec中.我还没有找到解决方法.

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