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

时间:2011-06-27 21:57:07

标签: ruby rubygems dependencies bundler gemspecs

可能在mygem.gemspec中有git branch依赖吗?

我正在考虑类似以下的内容:

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

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

5 个答案:

答案 0 :(得分:38)

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

如果您想为自己的内部项目执行此操作,我的建议是使用Bundler来支持这一点。

答案 1 :(得分:12)

修改

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

  

在Gemfile和.gemspec中复制对gem的引用现在似乎在Bundler中引发警告消息,所以这个答案似乎不再是真的。

过时信息

Yehuda Katz撰写的This文章为我清除了类似的混淆。它说,仅用于开发,最好将git东西添加到gemfile中,但是捆绑器仍将使用gemspec中的依赖/版本信息(对我来说似乎很神奇,但我相信Yehuda)。

答案 2 :(得分:6)

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

在你需要oauth2 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需要的,所以我不确定这是否适用于rubygems发布的宝石。

答案 3 :(得分:1)

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

假设您在项目P中,并且要使用自制的tools宝石,该宝石本身使用OS宝石oauth2

如果您在oauth2内制作了补丁,并且需要在宝石tools中使用该补丁,则无法根据the accepted answer在宝石中修复此问题。

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

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

Here is a real life example of mine.

答案 4 :(得分:1)

我遇到了类似的问题,这是我发现的。您不能直接为其他一些 gem 添加 git branch,但是您可以通过另一种方式实现。 您可以在自定义 gem 的 gemfile 中定义一个带有存储库链接和分支名称的私有 gem,即

gem 'gem_name', '>=0.1.1', git: 'repository_link ', branch: 'brnach_name'

并运行bundle install

现在您可以在 gemspec 文件中提及它,无需添加版本,因为它已经从 Gemfile.lock 中选择

spec.add_runtime_dependency 'sms_service'

注意:请确保将 gemspec 保留在 Gemfile 的底部。因此,它会首先安装必要的 gems,然后将它们作为依赖项添加到您的 gem 中。

source "https://rubygems.org"

git_source(:github) {|repo_name| "https://github.com/#{repo_name}" }

gem 'sms_service', '>=0.1.1', git: 'repository link', branch: 'branch_name'

gemspec