可能在mygem.gemspec中有git branch依赖吗?
我正在考虑类似以下的内容:
gem.add_runtime_dependency 'oauth2', :git => 'git@github.com:lgs/oauth2.git'
......但它不起作用。
答案 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'
答案 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