91

在 mygem.gemspec 中是否可能有 git 分支依赖项?

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

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

...但它不起作用。

4

5 回答 5

47

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

如果你想为你自己的内部项目做这件事,我的建议是使用Bundler很好地支持这个。

于 2011-06-27T22:04:30.783 回答
14

编辑

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

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

过时的信息

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

于 2013-07-28T22:54:06.467 回答
7

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

在需要 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"

在您的 gemspec 中将其添加到您的要求版本行上方

$:.push File.expand_path('../lib/oauth2/lib', __FILE__)

此外,您还需要将所有 oauth2 gem 的运行时依赖项添加到您的 gemspec。我还没有想出解决这个问题的方法。

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

于 2015-04-14T15:11:08.003 回答
2

我发现了一个非常简单的解决方法:

假设您在一个项目中,并且您想使用本身使用 OS gemP的自制gem 。toolsoauth2

如果您在其中制作了补丁oauth2并在 gem 中需要该补丁tools,则您将无法根据接受的答案在 gem 中修复此问题。

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

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

这是我的一个真实的例子。

于 2019-09-19T10:23:34.340 回答
1

我遇到了类似的问题,这就是我发现的。您不能直接为其他一些 gem 添加 git 分支,但是您可以通过另一种方式实现这一点。您可以在自定义 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 的底部。因此,它将首先安装必要的 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
于 2021-06-16T11:14:42.780 回答