ruby - Bundler.require 不需要 gemspec 中的依赖项

标签 ruby gem bundler

我有一个使用 bundler 的应用程序,目前工作正常,但我必须从项目的 bin 目录中运行它。现在我正在尝试将其转换为 gem 。

bin/myexecutable(无变化):

#!/usr/bin/env ruby
require 'mygem'
MyGem::MyExecutable.new.main(ARGV)

lib/mygem.rb(无变化):

require 'rubygems'
require 'bundler/setup'
Bundler.require

require 'mygem/version'
require 'mygem/my_executable'

mygem.gemspec(新):

# coding: utf-8
lib = File.expand_path('../lib', __FILE__)
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
require 'mygem/version'

Gem::Specification.new do |spec|
  # ... omitting boilerplate specs of gem ...

  spec.files         = `git ls-files`.split($/)
  spec.executables   = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
  spec.test_files    = spec.files.grep(%r{^(test|spec|features)/})
  spec.require_paths = ['lib']

  spec.add_development_dependency 'bundler', '~> 1.3'
  spec.add_development_dependency 'rake'

  spec.add_runtime_dependency 'bindata'
end

Gemfile(将依赖项移动到 mygem.gemspec):

source 'https://rubygems.org'
gemspec

当我安装 gem 并尝试运行可执行文件时,我得到:

.../resource_file.rb:2:in `<class:ResourceFile>': uninitialized constant ResourceFile::BinData (NameError)

将依赖项复制回 Gemfile 使其再次工作,但现在我在两个位置有相同依赖项的冗余声明。

为什么在使用 gemspec 声明时它不起作用?

最佳答案

您需要在 lib/mygem.rb 的顶部调用 require 'bindata'

此外,我建议从 mygem.rb 中删除这些行:

require 'rubygems'
require 'bundler/setup'
Bundler.require

Bundler 期望 gems 需要它们自己的依赖项(这样当您在没有 Bundler 的情况下需要它们时它们仍然可以工作)。当您的 Gemfile 中有 gemspec 时,Bundler.require 直接需要您的 gem,但不需要它的任何依赖项。将其放入 gem 将导致它与已经使用 Bundler 的应用程序交互不良,并创建从您的 gem 到 Bundler 的运行时依赖性(未在您的 gemspec 中声明)。

这是故意的行为。有一些关于这些 Bundler 问题的讨论:

关于ruby - Bundler.require 不需要 gemspec 中的依赖项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19295815/

相关文章:

Ruby:不允许在 'yield' 之后放置空格

ruby-on-rails - Rails 3.2 rake 编译问题

ruby - bundle gem : rspec says 'No examples found'

ruby-on-rails - 是否可以在 Gemfile 中让一组从另一组继承

arrays - ruby 中的最佳排列计数算法

ruby - 计数的目的是什么? 7号线

ruby-on-rails - 如何开发 gem ?

ruby - 如何使用 TeamCity 在所有代理上安装 Ruby gems?

ruby - "shell out"或 "shelling out"是什么意思?

ruby-on-rails - Ruby path_to 仅在显式时有效