WindowsとLinuxで同じRakefileを使用する

Last Updated 2014-10-03

HomeBack

  1. Rakefileサンプル
  2. 使用方法
  3. WindowsとLinuxで異なる箇所の処理

開発マシンがWindowsで、本番サーバーがLinuxということは良くあります。 そのような状況の場合、データベースの作成や修正をWindowsではバッチファイルでやり、 Linuxではシェルスクリプトを今まで使っていました。しかし、WindowsとLinuxにRubyが インストールされていればRakeが使用できるので、RakefileをWindowsとLinuxの両方で 動作するように書けば良いと思い、作ってみました。

また、どうせ作るならrailsのRakeのコマンドに似せようと思って、似たようなコマンドにしました。

Rakefileサンプル

PostgreSQLとMySQLの両方に対応したRakefileのサンプルを作成しました。

PASSWORD = ""
DBNAME = "mydb_test"
MIGRATE_DDL = "test.ddl"

MYUSER = "root"
PGUSER = "postgres"

if /windows/i =~ ENV['OS'] then
  MYPATH = "C:\\xampp\\mysql\\bin\\"
  PGPATH = "\"c:/Program Files/PostgreSQL/8.3/bin/\""
else
  MYPATH = ""
  PGPATH = ""
end

load File.join(File.dirname(__FILE__), 'rakefile.mysql')
load File.join(File.dirname(__FILE__), 'rakefile.psql')

task :default => [ "myql:default" ]

このRakefileは以下のMySQL用とPostgreSQL用のタスクの定義ファイルを読み込んでいます。

開発やテスト等では1ファイルの方が便利なので、1つにまとめたRakefileも作成しました。

使用方法

サンプルでは以下のように使用します。

WindowsとLinuxで異なる箇所の処理

現在使用しているOSは環境変数で判別することができます。 例えば、WindowsXPのDOS窓では環境変数OSに”Windows_NT”が設定されているので、以下のようにチェックすれば Windowsとその他のOSの区別することもできると思います。

  if /windows/i =~ ENV['OS'] then
    ・・・
  end

Rakeにはwin23.rbでWindowsかどうかを判断するメソッドがあるので、それを使用する方法もあります。

以下の例では、WindowsでPostgreSQLのパスを指定しています。
  if Rake::Win32.windows? then
    PGPATH = "\"c:/Program Files/PostgreSQL/8.3/bin/\""
  else
    PGPATH = ""
  end

その他として、RUBY_PLATFORMにプラットホームを示す文字列が入っているようなので、 これでチェックする方法もあります。

  if /cygwin/i =~ RUBY_PLATFORM then
    ・・・
  end
ただし、この方法ではWindows版rubyを上手く判別できない可能性があります。 Windows版rubyではバージョンが同じものが複数あり、そのそれぞれでRUBY_PLATFORMの文字列が異なります。 そのためWindows用rubyを変更した場合、想定していないRUBY_PLATFORMの文字列になるかもしれません。
参考 [ruby-list:36194] Re: RUBY_PLATFORM にはどんなものがある?
ix86-mingw32
ix86-msdosdjgpp
ix86-mswin32

参考 rake.rb (バージョン 0.8.7)では以下のようにunixとwindowsのチェックを分けています。

require 'rake/win32'
   ・・・
  
    def unix?
      RUBY_PLATFORM =~ /(aix|darwin|linux|(net|free|open)bsd|cygwin|solaris|irix|hpux)/i
    end
    
    def windows?
      Win32.windows?
    end	

さらにrake/win32.rb を調べると、環境変数APPDATAをチェックしてWindowsかどうかを判定していました。 そこでWindowsXPの環境変数APPDATAを確認すると、下記のようになっていました。([username]にはユーザー名が入ります)

APPDATA=C:\Documents and Settings\[username]\Application Data
rake/win32.rb (バージョン 0.8.7)は以下のように定義されています。
module Rake

  # Win 32 interface methods for Rake. Windows specific functionality
  # will be placed here to collect that knowledge in one spot.
  module Win32
    class << self
      # True if running on a windows system.
      if File::ALT_SEPARATOR == '\\' # assume other DOSish systems are extinct.
        def windows?; true end
      else
        def windows?; false end
      end
    end

    class << self
      # The standard directory containing system wide rake files on
      # Win 32 systems. Try the following environment variables (in
      # order):
      #
      # * APPDATA
      # * HOME
      # * HOMEDRIVE + HOMEPATH
      # * USERPROFILE
      #
      # If the above are not defined, retruns the personal folder.
      def win32_system_dir #:nodoc:
        win32_shared_path = ENV['APPDATA']
        if !win32_shared_path or win32_shared_path.empty?
          win32_shared_path = '~'
        end
        File.expand_path('Rake', win32_shared_path)
      end

      # Normalize a win32 path so that the slashes are all forward slashes.
      def normalize(path)
        path.tr('\\', '/')
      end
    end if windows?
  end

  if Win32.windows?
    def standard_system_dir
      Win32.win32_system_dir
    end
  end
end


HomeBack