サイトアイコン 演劇とかの感想文ブログ

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

warningであるため、問題なく処理は終わるのですが気持ち悪いメッセージが出続ける為、調べました。解決方法は驚くほど簡単だったので、備忘を兼ねて記載しておきます。

検索したソースコードをそのまま実行するとwarningは出る

演劇感想文リンクのサイトへ載せる画像をダウンロードするためのスクリプトを書こうとして、ネットを調べて以下のサイトを見つけました。

画像URLを指定するとその画像データをローカルに保存するコードです。 保存先のディレクトリは/var/tmp/hoge/に指定して保存します。 開発環境 ruby 1.9.3 ソースコード 与えられたURLの画像を保存する関数は以下のように書けます。
RubyでWeb上の画像を指定したディレクトリに保存する - Think Big Act Local - Think Big Act Local

ちょっと古い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へのバージョンアップですが)

私の環境がMax OSですので、Homebrewでのruby 2.4.1のインストールした方法を記載します。途中でインストールが失敗しましたが、インストール完了まで記載します。1.まずはHomebrewをアップデートします。...
ruby 2.4.1 をインストールしました。 - Qiita - Qiita

が、結局結果は変わりませんでした。

Utilityの名前を大文字から小文字に変えたら解消

解消方法に手詰まりを感じていたのですが、検索して意外な程簡単に解消する方法がわかりました。

I've seen similar questions regarding this error, but all of them rails-related. I'm not using rails; I'm working on a local rake task that reads from a yaml file and then does stuff with the data....
rake error: "warning: already initialized constant FileUtils::OPT_TABLE&... - Stack Overflow

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」のリンク先は、以下。

I'm using a Mac pro Lion for development with ImageMagick Q16, RVM and ruby 1.8.7 I can use the following in IRB: Take note on the different caps in the word 'rmagick' require 'rubygems' => t...
Difference between 'require 'rmagick' and 'require RMagic... - Stack Overflow

ざっくりした理解としては、大文字で始まるユーティリティと全部小文字のユーティリティは別のモジュールであるため、既に定義された定数が再定義されているという警告が出ていたようです。
そこで、上記のソースコードのrequireを以下のように書き換えて実行したところ、warningが解消されました。
require "open-uri"
require "fileutils"

以上 rubyの実行時に「warning: previous definition of METHODS was here」というメッセージが出た時の対処法でした。

モバイルバージョンを終了