warningであるため、問題なく処理は終わるのですが気持ち悪いメッセージが出続ける為、調べました。解決方法は驚くほど簡単だったので、備忘を兼ねて記載しておきます。
目次
検索したソースコードをそのまま実行するとwarningは出る
演劇感想文リンクのサイトへ載せる画像をダウンロードするためのスクリプトを書こうとして、ネットを調べて以下のサイトを見つけました。
ちょっと古いruby1.9.3対応ということだったのですが、上記のページのソースコードを元に以下のようなソースを書きました。
# encoding:UTF-8 # WordPressに利用するためのImageのクラス #2017/11/20 require "open-uri" require "FileUtils" class WPImage attr_accessor :url,:filename attr_reader:filename_org def initialize() @folder="data/images/" end #ローカルフォルダに保存する def save_local(folder=@folder) # ready filepath @filename = File.basename(url) filepath = folder + @filename # create folder if not exist FileUtils.mkdir_p(folder) unless FileTest.exist?(folder) # write image adata open(filepath, 'wb') do |output| open(url) do |data| output.write(data.read) end end @filename_org=@filename end end
単に「image」という名前にすることに抵抗があったので、WORDPRESS用に作成するImageの操作用Classという意味で、「WPImage」という名前にしていますが、やっていることはWeb上のImageのURLをわたしてローカルフォルダにダウンロードするだけです。
このクラスのテストをするspecを実行すると以下のようなこの記事の表題のwarningがどっと出力されます。
/Users/username/.rbenv/versions/2.4.2/lib/ruby/2.4.0/FileUtils.rb:1560: warning: previous definition of METHODS was here
rubyのバージョンに関わりなく出力される
元々は、以下のようにrubyのバージョンは2.2.4だったのですが、これを最新(2.4.2)にバージョンアップしても、変わりませんでした。
$ ruby -v ruby 2.2.4p230 (2015-12-16 revision 53155) [x86_64-darwin16]
これを2.4.2にアップデートしました。
以下の手順を参考(この記事は2.4.1へのバージョンアップですが)
が、結局結果は変わりませんでした。
Utilityの名前を大文字から小文字に変えたら解消
解消方法に手詰まりを感じていたのですが、検索して意外な程簡単に解消する方法がわかりました。
Stackoverflowの質問ですが、似た症状でした。回答には以下のような記載がありました。
This warning shows up when I write require ‘FileUtils’. If I write require ‘fileutils’ (all lower case) warning disappears.
This link may be helpful explaining the behavior. I think in essence ruby thinks FileUtils and fileutils are different modules, therefore imports it twice. Then the redeclaration of constants give warning messages.
上記の「This」のリンク先は、以下。
ざっくりした理解としては、大文字で始まるユーティリティと全部小文字のユーティリティは別のモジュールであるため、既に定義された定数が再定義されているという警告が出ていたようです。
そこで、上記のソースコードのrequireを以下のように書き換えて実行したところ、warningが解消されました。
require "open-uri" require "fileutils"
以上 rubyの実行時に「warning: previous definition of METHODS was here」というメッセージが出た時の対処法でした。
コメントを残す