在 mygem.gemspec 中是否可能有 git 分支依赖项?
我正在考虑类似于以下内容:
gem.add_runtime_dependency 'oauth2', :git => 'git@github.com:lgs/oauth2.git'
...但它不起作用。
在 mygem.gemspec 中是否可能有 git 分支依赖项?
我正在考虑类似于以下内容:
gem.add_runtime_dependency 'oauth2', :git => 'git@github.com:lgs/oauth2.git'
...但它不起作用。
这是不可能的,而且很可能永远不会,因为 RubyGems 允许 gem 开发人员要求用户安装特定的版本控制系统才能访问 gem,这将是相当严厉的。Gems 应该是自包含的,具有最少数量的依赖项,以便人们可以在尽可能广泛的应用程序中使用它们。
如果你想为你自己的内部项目做这件事,我的建议是使用Bundler很好地支持这个。
编辑
根据评论者的说法,这不再是真的。为历史背景保留的先前信息。
现在,在 Gemfile 和 .gemspec 中复制对 gem 的引用似乎会在 Bundler 中引发警告消息,因此这个答案似乎不再正确。
过时的信息
Yehuda Katz 的这篇文章为我解决了类似的困惑。它说,仅用于开发,最好将 git 内容添加到 gemfile 中,但该捆绑程序仍将使用 gemspec 中的依赖项/版本信息(对我来说似乎很神奇,但我相信 Yehuda)。
我也只是想弄清楚这个问题。我刚刚提出了以下解决方案(我不确定您是否发布了您的 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 需要的,所以我不确定这是否适用于 rubygems 发布的 gem。
我发现了一个非常简单的解决方法:
假设您在一个项目中,并且您想使用本身使用 OS gemP
的自制gem 。tools
oauth2
如果您在其中制作了补丁oauth2
并在 gem 中需要该补丁tools
,则您将无法根据接受的答案在 gem 中修复此问题。
但是,您可以在 projet 的 Gemfile 中指定您想要的版本P
,这将是tools
运行时使用的版本:
gem 'oauth2', github: 'lgs/oauth2'
我遇到了类似的问题,这就是我发现的。您不能直接为其他一些 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