[ruby]warning: previous definition of METHODS was here が発生する時の対処法

広告

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」というメッセージが出た時の対処法でした。

広告

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です