是否可以在我的gemspec文件中设置git分支依赖关系?
我在考虑类似于以下的做法:
gem.add_runtime_dependency 'oauth2', :git => 'git@github.com:lgs/oauth2.git'
...但它不起作用。
是否可以在我的gemspec文件中设置git分支依赖关系?
我在考虑类似于以下的做法:
gem.add_runtime_dependency 'oauth2', :git => 'git@github.com:lgs/oauth2.git'
...但它不起作用。
这是不可能的,而且很可能永远不会实现,因为让 RubyGems 允许 gem 开发者要求用户安装特定版本的版本控制系统来访问 gem,这将过于强硬。gem 应该是自包含的,并具有最少的依赖项,以便人们可以在尽可能广泛的应用程序中使用它们。
如果你想要为自己的内部项目做到这一点,我的建议是使用 Bundler ,它支持这种方式非常好。
编辑
根据评论者的说法,这已经不再正确。保留先前的信息供历史背景参考。
在Gemfile和.gemspec中复制对gem的引用现在似乎会在Bundler中引发警告消息,因此这个答案看起来已经不再正确。
过时信息
这篇由Yehuda Katz撰写的文章为我澄清了类似的困惑。它说,在仅用于开发的情况下,最好将git相关内容添加到gemfile中,但是bundler仍将使用gemspec中的依赖/版本信息(对我来说似乎有点神奇,但我相信Yehuda)。
gemspec
,它也会从gemspec中读取。因此,当您运行 bundle install
时,我认为(但未经测试)发生的是Bundler安装Gemfile中指定的gem。由于Bundler已经安装了它,该gem可供需要它的gem进行 require
,而不管它是否来自gem存储库。没有魔法,只是Bundler像往常一样工作。 - Marnen Laibow-Koser我也在尝试解决这个问题。我想到了以下的解决方案(不确定你是否发布了你的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"
$:.push File.expand_path('../lib/oauth2/lib', __FILE__)
同时,您需要将所有oauth2 gem的运行时依赖项添加到您的gemspec中。 我还没有找到解决方法。
这是我所做的事情,它对我们起作用,因为我们的gem是通过git要求的,所以我不确定这是否适用于发布在rubygems上的gem。
gem 'my_gem', git: 'git@github.com:me/myrepo', submodules: true
如果您从Github安装。 - Joe EdgarP
中想要使用自己制作的 gem tools
,而这个 gem 本身使用了一个操作系统的 gem oauth2
。oauth2
中进行了修补,并且需要在你的 gem tools
中使用这个修补程序,根据被接受的答案,你将无法在 gem 中解决这个问题。P
的 Gemfile 中指定你想要的版本,这个版本将在运行时由 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'
注意: 确保在Gemfile中将gemspec
放在底部。这样,它将首先安装必要的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
spec.add_runtime..
(如上所述),只会导致错误的 gem 版本加载。要点是,在 Gemfile 中引用需要的分支,并确保将 gemspec 添加到 Gemfile 底部。 - Evolve