Heroku環境をWindowsに作るときのトラブルシューティングメモ

# コマンドプロンプトからHerokuの操作をしようとしたらエラー出た
>C:\Windows\system32>heroku login
U+5553 to WINDOWS-1252 in conversion from UTF-8 to WINDOWS-1252
C:/Program Files (x86)/Heroku/lib/heroku/jsplugin.rb:112:in `encode'
C:/Program Files (x86)/Heroku/lib/heroku/jsplugin.rb:112:in `app_dir'
C:/Program Files (x86)/Heroku/lib/heroku/jsplugin.rb:119:in `bin'
C:/Program Files (x86)/Heroku/lib/heroku/jsplugin.rb:147:in `setup?'
C:/Program Files (x86)/Heroku/lib/heroku/jsplugin.rb:213:in `check_if_old'
C:/Program Files (x86)/Heroku/lib/heroku/jsplugin.rb:123:in `setup'
C:/Program Files (x86)/Heroku/lib/heroku/cli.rb:24:in `start'
C:/Program Files (x86)/Heroku/bin/heroku:29:in `<main>'
U+5553 to WINDOWS-1252 in conversion from UTF-8 to WINDOWS-1252
C:/Program Files (x86)/Heroku/lib/heroku/jsplugin.rb:112:in `encode'
C:/Program Files (x86)/Heroku/lib/heroku/jsplugin.rb:112:in `app_dir'
C:/Program Files (x86)/Heroku/lib/heroku/jsplugin.rb:119:in `bin'
C:/Program Files (x86)/Heroku/lib/heroku/jsplugin.rb:147:in `setup?'
C:/Program Files (x86)/Heroku/lib/heroku/jsplugin.rb:124:in `setup'
C:/Program Files (x86)/Heroku/lib/heroku/cli.rb:24:in `start'
C:/Program Files (x86)/Heroku/bin/heroku:29:in `<main>'
 !    Heroku client internal error.
 !    Search for help at: https://help.heroku.com
 !    Or report a bug at: https://github.com/heroku/heroku/issues/new
    Error:       U+5553 to WINDOWS-1252 in conversion from UTF-8 to WINDOWS-1252
 (Encoding::UndefinedConversionError)
    Command:     heroku login
    Version:     heroku/toolbelt/3.42.20 (i386-mingw32) ruby/1.9.3

原因→パスに日本語が含まれてる
対処方法
    1. Windowsの環境変数設定を開く
    2. 日本語を含まないパスで、環境変数を作成する(例：変数LOCAL_APP_DATA_SAMPLE　値：C:\Mogemoge)
    3. Herokuのインストールフォルダ\lib\heroku\jsplugin.rbを開く
    4. 110行目付近のENV['LOCALAPPDATA']の記載を2で作った変数に変更する

>  def self.app_dir
    if windows? && ENV['LOCALAPPDATA']
      File.join(ENV['LOCALAPPDATA'], 'heroku').encode('windows-1252')
    else
      File.join(Heroku::Helpers.home_directory, '.heroku')
    end
  end
↓
>
  def self.app_dir
    if windows? && ENV['LOCAL_APP_DATA_SAMPLE']
      File.join(ENV['LOCAL_APP_DATA_SAMPLE'], 'heroku').encode('windows-1252')
    else
      File.join(Heroku::Helpers.home_directory, '.heroku')
    end
  end

**同じ感じで以下のファイルも修正する**

- \lib\heroku\helpers.rbのhome_directoryの定義内。
 - File.expand_path('~') -> File.expand_path(ENV['HOMEPATH_SAMPLE'])


>
     def home_directory
      if running_on_windows? && RUBY_VERSION == '1.9.3'
        File.expand_path('~')
      else
        Dir.home
      end
    end
↓
>
     def home_directory
      if running_on_windows? && RUBY_VERSION == '1.9.3'
        File.expand_path(ENV['HOMEPATH_SAMPLE'])
      else
        Dir.home
      end
    end

- LOCAL_APP_DATA_SAMPLEで指定したパスに「.heroku」フォルダが出来ているので、.heroku\client\lib以下にある、jsplugin.rbとhelpers.rbの変数(修正する内容は↑と同じ)
 - if windows? && ENV['LOCALAPPDATA'] -> if windows? && ENV['LOCALAPPDATA_SAMPLE']
 - File.join(ENV['LOCALAPPDATA'], 'heroku') -> File.join(ENV['LOCALAPPDATA_SAMPLE'], 'heroku')
 - File.expand_path('~') -> File.expand_path(ENV['HOMEPATH_SAMPLE'])

#Pushしようとしたらパスワード聞かれるし、エラーになるし…
>
$ git push heroku master 
Username for ‘https://git.heroku.com’:
Password for 'https://git.heroku.com’:
remote: !       WARNING:
remote: !       Do not authenticate with username and password using git.
remote: !       Run `heroku login` to update your credentials, then retry the git command.
remote: !       See documentation for details: https://devcenter.heroku.com/articles/http-git#authentication
fatal: Authentication failed for 'https://git.heroku.com/XXXXX.git/’

原因→設定ファイル的な「\_netrc」が見えていない。(User/<ユーザ名>/_netrcにある)

1. \Heroku\vendor\gems\netrc-0.10.3\lib\netrc.rbとLOCAL_APP_DATA_SAMPLEの同じパスにある、netrc.rbを開く
2. HOMEDRIVE,HOMEPATH,HOME,USERPROFILEを差し替える
3. 「_netrc」の場所を、日本語が含まない場所に変更する(変えなくても自動的に作られるはず)

> 
  def self.home_path
    home = Dir.respond_to?(:home) ? Dir.home : ENV['HOME_SAMPLE']
    if WINDOWS && !CYGWIN
      home ||= File.join(ENV['HOMEDRIVE_SAMPLE'], ENV['HOMEPATH_SAMPLE']) if ENV['HOMEDRIVE_SAMPLE'] && ENV['HOMEPATH_SAMPLE']
      home ||= ENV['USERPROFILE_SAMPLE']
      # XXX: old stuff; most likely unnecessary
      home = home.gsub("\\", "/") unless home.nil?
    end