Ruby Gemspec 依赖项:是否可能有 git 分支依赖项?

问题描述 投票:0回答:5

mygem.gemspec 中可能有 git 分支依赖吗?

我在想类似于以下内容的事情:

gem.add_runtime_dependency 'oauth2', :git => '[email protected]:lgs/oauth2.git'

...但这不起作用。

ruby rubygems dependencies bundler gemspecs
5个回答
48
投票

这是不可能的,而且可能永远不会,因为对于 RubyGems 来说,允许 gem 开发人员要求用户安装特定的版本控制系统来访问 gem 是相当严厉的。 Gems 应该是独立的,具有最少的依赖关系,以便人们可以在尽可能广泛的应用程序中使用它们。

如果您想为自己的内部项目执行此操作,我的建议是使用Bundler,它对此支持得很好。


15
投票

编辑

根据评论者的说法,这不再是事实。保留历史背景的先前信息。

在 Gemfile 和 .gemspec 中复制对 gem 的引用现在似乎会在 Bundler 中引发警告消息,因此这个答案似乎不再正确。

过时的信息

Yehuda Katz 的这篇

文章为我消除了类似的困惑。它说,仅在开发中使用时,最好将 git 内容添加到 gemfile 中,但该捆绑程序仍将使用 gemspec 中的依赖项/版本信息(对我来说似乎很神奇,但我相信 Yehuda)。


7
投票

在需要 oauth2 gem 的 gem 中运行此命令。

git submodule add [email protected]: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 中。我还没有找到解决这个问题的方法。

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


2
投票

假设您在一个项目中

P

并且您想使用自制的 gem

tools
,它本身使用操作系统 gem
oauth2
如果您在 

oauth2

中制作了补丁并且需要在 gem 中使用该补丁

tools
,您将无法根据
接受的答案
在 gemspec 文件中修复此问题。 但是,您可以在项目

P

的 Gemfile 中指定您想要的版本,这将是

tools
在运行时使用的版本:
gem 'oauth2', github: 'lgs/oauth2'

这是我的一个现实生活例子。


1
投票

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 的底部。因此,它将首先安装必要的 gem,然后将它们添加为您的 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

© www.soinside.com 2019 - 2024. All rights reserved.