首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Bundler.require不需要宝石规范中的依赖项

Bundler.require不需要宝石规范中的依赖项
EN

Stack Overflow用户
提问于 2013-10-10 12:31:18
回答 1查看 1.5K关注 0票数 4

我有一个使用bundler的应用程序,它目前运行良好,但我必须将它运行到项目的bin目录之外。现在我想把它变成宝石。

bin/myexecutable (无更改):

代码语言:javascript
运行
复制
#!/usr/bin/env ruby
require 'mygem'
MyGem::MyExecutable.new.main(ARGV)

lib/mygem.rb (无更改):

代码语言:javascript
运行
复制
require 'rubygems'
require 'bundler/setup'
Bundler.require

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

mygem.gemspec (新):

代码语言:javascript
运行
复制
# 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):

代码语言:javascript
运行
复制
source 'https://rubygems.org'
gemspec

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

代码语言:javascript
运行
复制
.../resource_file.rb:2:in `<class:ResourceFile>': uninitialized constant ResourceFile::BinData (NameError)

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

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-10-11 09:04:10

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

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

代码语言:javascript
运行
复制
require 'rubygems'
require 'bundler/setup'
Bundler.require

Bundler希望gems需要它们自己的依赖关系(所以当您需要它们时,它们也可以工作)。当您的gemspec在您的Gemfile中时,Bundler.require直接需要您的gem,而不是它的任何依赖项。将其放入一个gem将导致它与已经使用Bundler的应用程序进行很差的交互,并创建一个运行时依赖关系,从您的gem到Bundler (这在您的gem规范中没有声明)。

这是故意的行为。对这些问题进行了一些讨论:

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19295815

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档