第二次再调用gem方法会得到 "NameError: uninitialized constant "错误。

问题描述 投票:0回答:1

我们有一个私人的宝石,我在几个应用程序中使用。我最近做了一些改变。现在,对我的 gem 的调用只有在我第一次调用时才有效。第二次我再调用它时(以及之后),我得到的是 NameError: uninitialized constant. 重启rails控制台会重复出现这个问题。

% bundle exec rails console
Loading development environment (Rails 5.2.3)
irb(main):001:0> Widget::Tool.count
=> 5
irb(main):002:0> Widget::Tool.count
NameError: uninitialized constant Widget::Tool
  from (irb):2
irb(main):003:0> Widget::Tool.count
NameError: uninitialized constant Widget::Tool
  from (irb):3
irb(main):003:0> exit

% bundle exec rails console
Loading development environment (Rails 5.2.3)
irb(main):001:0> Widget::Tool.count
=> 5
irb(main):002:0> Widget::Tool.count
NameError: uninitialized constant Widget::Tool
  from (irb):2
irb(main):003:0> exit

这是一个很难搜索的问题。我使用bundler和ruby 2.4.5。我已经重新捆绑了。在每种情况下,当我第二次再次调用我的 gem 方法时,我都会得到这个错误。

ruby rubygems bundler
1个回答
0
投票

在用尽办法在网上搜索解决方案后,我开始备份我最近的改动。特别是昨天,我在本地对我的 gem 进行了一些更新,但还没准备好把它们推送到我们的私有 repo 上。我还更新了Gemfile,使其指向本地路径,而不是我们的git repo。直到今天,我才测试了其中的一些改动,所以它们在我脑海中并不是最新鲜的东西。

这就是我们的 Gemfile 通常的样子。

gem 'corp-widget', tag: 'v1.3.0',  corp_git: 'pmpclear/corp-widget-gem', require: 'widget'

当我把它指向我本地的 gem 副本时,我把它改成了。

gem 'corp-widget', tag: 'v1.3.0', path: '../corp-widget-gem', require: 'widget'  # DO NOT MERGE!
# TODO: increment to 1.3.1:  gem 'corp-widget', tag: 'v1.3.0',  corp_git: 'pmpclear/corp-widget-gem', require: 'widget'

在运行了... bundle 用这个Gemfile,问题中的错误就开始了。通过试验和错误,我删除了 tag: 'v1.3.0' 来自 path 版本的 gemfile,问题就消失了。

gem 'corp-widget', path: '../corp-widget-gem', require: 'widget'  # DO NOT MERGE!
# TODO: increment to 1.3.1:  gem 'corp-widget', tag: 'v1.3.0',  corp_git: 'pmpclear/corp-widget-gem', require: 'widget'

成功了

% bundle 
% bundle exec rails console
Loading development environment (Rails 5.2.3)
irb(main):001:0> Widget::Tool.count
=> 5
irb(main):002:0> Widget::Tool.count
=> 5
irb(main):003:0> Widget::Tool.count
=> 5
irb(main):004:0> Widget::Tool.count
=> 5

我不清楚为什么只用一次就能成功. 好像要么总是能成功,要么总是失败。我明白了 tag: 在这里没有意义,所以把它去掉就解决了我的问题。

© www.soinside.com 2019 - 2024. All rights reserved.