本地 gem 的 'bundle install' 未能解决依赖,而 'gem install' 却可以。

6

我有一个本地的 gem (enterprise-0.0.1.gem),存放在目录 '/home/enterprise/pkg' 中。它依赖于 active_directory gem (v 1.5.5),并且在其 enterprise.gemspec 文件中像这样指定了:

gem.add_dependency("active_directory")

在我的应用程序的Gemfile中,我添加了以下行:-
gem 'enterprise', '0.0.1', path => '/home/enterprise/pkg'

当我在应用程序源目录中执行“bundle install”时,只安装了enterprise gem。因此,我会因对active_directory gem的引用而出现运行时错误。
但是当我执行“gem install /home/enterprise/pkg/enterprise-0.0.1.gem”时,解决了依赖关系,并且在gem列表中可以看到active_directory gem。
为什么使用bundler解决依赖性时存在差异,而使用rubygems则不存在。
如果需要提供更多有关环境的信息,请告知。
Ruby:1.9.2, RubyGems:1.8.24, Bundler:1.1.5, rvm:1.9.2。
我的enterprise.gemspec文件供参考:-
 # -*- encoding: utf-8 -*-
   require File.expand_path('../lib/enterprise/version', __FILE__)

   Gem::Specification.new do |gem|
      gem.authors       = ["example"]
      gem.email         = ["example@example.com"]
      gem.description   = %q{Enterprise Gem: example}
      gem.summary       = %q{Services: Authentication, Access Control}
      gem.homepage      = "http://example.com"  
      gem.files         = %w[
                       README.md
                       Rakefile
                       Gemfile
                       Gemfile.lock
                       enterprise.gemspec
                       lib/enterprise.rb
                       lib/enterprise/auth_service.rb
                       lib/enterprise/version.rb
                       ]
     gem.executables   = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
     gem.test_files    = gem.files.grep(%r{^(test|spec|features)/})
     gem.name          = "enterprise"
     gem.require_paths = ["lib"]
     gem.version       = Enterprise::VERSION
     gem.add_dependency("active_directory")
   end
3个回答

2

我曾经遇到同样的问题,最终删除了Gemfile.lock文件来解决这个问题。


删除本地 Gemfile.lock 中的条目对我的依赖关系问题也有解决作用。 - Samuel

0
你的gem文件中是否有以下内容的Gemfile?
source 'https://rubygems.org'

# Specify your gem's dependencies in enterprise.gemspec
gemspec

尝试在你的应用程序gemspec中添加一个require。
gem 'enterprise', '0.0.1', path => '/home/enterprise/pkg', :require => "active_directory"

是的,我在我的企业宝石文件的Gemfile中有这些。 您需要我的gemspec文件吗? - neosab
不,似乎它没有使用:require选项安装active_directory gem。它的行为与之前相同。只有enterprise gem被安装。 - neosab
我只是好奇使用自定义本地 gem 的标准做法是什么。每次将我的应用程序移动到生产服务器时执行 [gem install 'enterprise'&bundle install] 操作都没有意义。 - neosab
我想我只需要在应用程序的Gemfile中添加“active_directory”吧? - house9
每次部署到生产环境时,您都需要执行bundle install命令,它不会拉取任何未更改的内容 - bundle install --deployment。猜测您已经阅读了这份文档:http://gembundler.com/rationale.html - house9

0
在你的gemspec中使用gem.add_runtime_dependency,而不是add_dependency,这样就可以无论是否将其添加到Gemfile中都需要该gem。

显然,它们是彼此的别名(SO答案:https://dev59.com/mmAf5IYBdhLWcg3wu0tD#24334371,Ruby文档:http://ruby-doc.org/stdlib/libdoc/rubygems/rdoc/Gem/Specification.html#method-i-add_runtime_dependency) - Brian Kung

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接