2015-08-17 50 views
1

我已經看到過有關此錯誤的類似問題,但它們都與rails有關。我沒有使用rails;我正在從一個yaml文件讀取本地rake任務,然後處理數據。我寧願不爲此安裝捆綁軟件(針對類似的導軌問題的解決方案建議預先附加bundle exec),因爲此腳本很簡單,因此不需要它。rake錯誤:「警告:已初始化常量FileUtils :: OPT_TABLE」

下面是簡單的代碼,(它得到了同樣的錯誤,因爲我工作的代碼):

require 'FileUtils' 
require 'yaml' 

SOME_FILE = "#{Dir.pwd}/some_file.yaml" 

task default: :foo 

task :foo do 
    bar = File.open(SOME_FILE) { |yf| YAML::load(yf) } 
    bar.each {|k,v| puts k} 
end 

而這裏的錯誤列表:

/Users/jpalmieri/.rbenv/versions/2.0.0-p353/lib/ruby/2.0.0/FileUtils.rb:93: warning: already initialized constant FileUtils::OPT_TABLE 
/Users/jpalmieri/.rbenv/versions/2.0.0-p353/lib/ruby/2.0.0/fileutils.rb:93: warning: previous definition of OPT_TABLE was here 
/Users/jpalmieri/.rbenv/versions/2.0.0-p353/lib/ruby/2.0.0/FileUtils.rb:1272: warning: already initialized constant FileUtils::Entry_::S_IF_DOOR 
/Users/jpalmieri/.rbenv/versions/2.0.0-p353/lib/ruby/2.0.0/fileutils.rb:1272: warning: previous definition of S_IF_DOOR was here 
/Users/jpalmieri/.rbenv/versions/2.0.0-p353/lib/ruby/2.0.0/FileUtils.rb:1535: warning: already initialized constant FileUtils::Entry_::DIRECTORY_TERM 
/Users/jpalmieri/.rbenv/versions/2.0.0-p353/lib/ruby/2.0.0/fileutils.rb:1535: warning: previous definition of DIRECTORY_TERM was here 
/Users/jpalmieri/.rbenv/versions/2.0.0-p353/lib/ruby/2.0.0/FileUtils.rb:1537: warning: already initialized constant FileUtils::Entry_::SYSCASE 
/Users/jpalmieri/.rbenv/versions/2.0.0-p353/lib/ruby/2.0.0/fileutils.rb:1537: warning: previous definition of SYSCASE was here 
/Users/jpalmieri/.rbenv/versions/2.0.0-p353/lib/ruby/2.0.0/FileUtils.rb:1656: warning: already initialized constant FileUtils::LOW_METHODS 
/Users/jpalmieri/.rbenv/versions/2.0.0-p353/lib/ruby/2.0.0/fileutils.rb:1656: warning: previous definition of LOW_METHODS was here 
/Users/jpalmieri/.rbenv/versions/2.0.0-p353/lib/ruby/2.0.0/FileUtils.rb:1662: warning: already initialized constant FileUtils::METHODS 
/Users/jpalmieri/.rbenv/versions/2.0.0-p353/lib/ruby/2.0.0/fileutils.rb:1662: warning: previous definition of METHODS was here 

該腳本將運行儘管有警告,但仍然罰款;上述代碼會在警告後立即按預期方式鍵入puts

回答

1

我發現這些警告不會出現,並且腳本完美運行,如果我只是註釋掉或刪除我的原始代碼(require 'FileUtils')的第1行。雖然我沒有瀏覽Rake的代碼,但它必須包含FileUtils(這很合理)。

爲了完整起見,這裏是我修改後的代碼(注意,我刪除了require 'FileUtils'行:

require 'yaml' 

SOME_FILE = "#{Dir.pwd}/some_file.yaml" 

task default: :foo 

task :foo do 
    bar = File.open(SOME_FILE) { |yf| YAML::load(yf) } 
    bar.each {|k,v| puts k} 
end 
+0

在我的情況下,zip已經包含FileUtils,我認爲它在Ruby中使用了類似於C的東西,以避免多重包含? –

5

此警告顯示,當我寫require 'FileUtils'如果我寫require 'fileutils'(全部小寫)警告消失。

This鏈接可能會有所幫助解釋的行爲。我認爲在本質上紅寶石自以爲FileUtilsfileutils是不同的模塊,因此進口了兩次,然後將常數重新聲明給予警告消息。

1

我和Travis有同樣的問題,問題是我忘記使用bundle exec rake db:setup而不是rake db:setup。希望它可以幫助某人:)

0

想清楚地回答這個問題(在問了兩年之後),以防萬一有人在這裏徘徊。

首先,請注意,Ruby中的require不會加載模塊,如在內存中的對象FileUtils。它從您的硬盤驅動器加載文件「fileutils.rb」。按慣例省略「.rb」,但您可以編寫require 'fileutils.rb'

Ruby中require的用途是隻加載一次文件,而不是load,它會在每次使用文件時重新加載文件。 require避免多次加載文件的方式是通過記錄文件名參數並在文件名被再次傳遞的情況下跳過。

當你第一次需要一個文件時,Ruby響應爲真,表明它已被加載。如果您需要相同的文件再次將返回false以表明它已經被加載:

> require 'fileutils' 
=> true 
> require 'fileutils' 
=> false 

因爲由require保存的文件名是區分大小寫的,但實際的文件查找是不是,fileutils.rb仍然會被發現如果您在名稱中使用大寫:

> require 'FileUtils' 
=> true 

但是,如果有你的Ruby程序已經加載該文件沒有帽(你的情況「yaml.rb」可能需要「文件實用程序」爲好),你會重新加載該文件並可能會看到警告:

> require 'fileutils' 
=> true 
> require 'FileUtils' 
/bin/ruby/lib/ruby/2.3.0/FileUtils.rb:96: warning: already initialized constant FileUtils::OPT_TABLE 
etc. 

按照慣例Ruby文件應該用小寫字母和下劃線命名,例如: 「my_class.rb」,所以你總是會使用require 'my_class'

如果您需要使用絕對路徑或相對路徑,例如require 'special_classes/my_class'。我建議閱讀關於require_relative和Ruby加載路徑($LOAD_PATH)。

相關問題