如何使用rubygems正确打包应用程序?

如何使用rubygems正确打包应用程序?,ruby,rubygems,dependencies,gem,distribution,Ruby,Rubygems,Dependencies,Gem,Distribution,我一直在做一些我想分享的实用程序(不是库)。使用rubygems包装它们的正确方式是什么?有什么最佳实践吗 具体来说,我想知道如何处理用户拥有多个版本的依赖关系的可能性。Bundler在开发环境中表现出色;最终用户应用程序是否有任何等价物?是否可以使用gemspec自动要求所有指定gems的正确版本 我知道有几种将一切都打包为可执行解决方案,但我想避免它们。我认为用户应该能够发布gem install my_utility,获得具有正确依赖项的最新版本,并且仍然拥有一个健全的环境。您可以用于开发

我一直在做一些我想分享的实用程序(不是库)。使用rubygems包装它们的正确方式是什么?有什么最佳实践吗

具体来说,我想知道如何处理用户拥有多个版本的依赖关系的可能性。Bundler在开发环境中表现出色;最终用户应用程序是否有任何等价物?是否可以使用
gemspec
自动要求所有指定gems的正确版本


我知道有几种将一切都打包为可执行解决方案,但我想避免它们。我认为用户应该能够发布
gem install my_utility
,获得具有正确依赖项的最新版本,并且仍然拥有一个健全的环境。

您可以用于开发gems。

看起来您最大的问题是如何在使用gempec文件时获得正确版本的gem依赖项,对吗

下面是一个典型的gemspec文件示例:

Gem::Specification.new do |spec|
  spec.name         = "hello_world"
  spec.version      = "0.1.0"
  spec.author       = "Bilbo Baggins"
  # Here's a gem dependency
  spec.add_dependency "json", ">= 0.4.0"
end
如果您只想使用json 1.5.4版,请尝试以下方法:

Gem::Specification.new do |spec|
  # ...
  spec.add_dependency "json", "= 0.4.0"
end
这将仅确保已安装指定的版本,但要真正确保在实用程序中加载该版本,可以执行以下操作:

gem "json", "= 0.4.0"
require "json"

是的,但我不希望有人
bundle exec
我的应用程序。我需要一种在加载期间锁定gem版本的方法。gem用户不需要使用bundler。bundler rubygems接口,用于gemspec和依赖项分离以及gem版本控制。在我的代码中,我使用标准的
require
加载库。即使用户有多个可能较新的gem版本,是否只有
gempec
就足以确保需要指定的版本?作为一名开发人员,我使用RVM gemsets来处理这个问题,但我不想把它强加给其他人。是的,这正是我的意思,但它似乎不是真的。。。但好消息是:仍然有一种方法可以轻松做到这一点!我现在就更新答案。+1,谢谢。我觉得
gem
方法是用来替换
require
,所以我避免了它,因为它会导致与rubygems的紧密耦合。我想找个好地方隔离这些电话。只是澄清一下,它不会加载我的库,只会确保在
require
d时加载正确的版本,对吗?当然,没问题!:)是的,他们所做的唯一一件事就是告诉他们需要加载哪个版本的gem。我不知道该怎么做,哈威尔,我想我已经准备好了。我接受了你的回答。再次感谢你清理这个!