Elixir
Phoenix

Windowsで認証付きProxy環境下でElixir+Phoenix Frameworkをインストールする際にハマった事。

タイトル通りで、えらくハマって諦めかけてたんですが、たまたま抜け方がわかったので記事にしておきます。

実施環境

Elixir 1.6.4 (compiled with OTP 19)

手順

  1. Phoenix Frameworkに使うアプリのインストール
    1. nodejsのインストール
    2. PostgreSQLのインストール
  2. Elixirのインストール
    1. Elixirのインストーラーをダウンロード&実行(この時にErlangもインストールされる)
  3. Phoenix Frameworkのインストール
    1. mix local.hexを実行
    2. mix archive.install https://github.com/phoenixframework/archives/raw/master/phx_new.ezを実行
  4. テスト
    1. プロジェクトのフォルダを作りたいところで、mix phx.new <project>を実行
    2. プロジェクトのフォルダの中に入り(cd <project>)、mix ecto.createを実行

以下の公式のドキュメントを元に、若干手順前後させてます
Installation – Phoenix v1.3.2
Up and Running – Phoenix v1.3.2

nodeとかpostgresのインストールは省略します。

手順1、2のやり方は省略。認証付きプロキシの設定は似たような話がありますが、nodejsの場合にはnpm config setでやるのがよいと思います。
あと、プロキシの情報は会社の場合PACファイルでやってる事が多いと思いますが、このPACファイルをそのまま使う方法までは思いついてないです。
PACファイルの内容からプロキシサーバの情報は抜いてますが、やり方は省略。

ハマった所

上記の手順3、手順4でProxy通す方法が異なる為、えらくハマったので記載しておきます。

mix local.hexが実行出来ない

何も仕込んでない場合には以下の通り、接続出来ない旨のエラーが出て来ます。

>mix local.hex
** (Mix) httpc request failed with: {:failed_connect, [{:to_address, {'repo.hex.
pm', 443}}, {:inet, [:inet], :nxdomain}]}

Could not install Hex because Mix could not download metadata at https://repo.he
x.pm/installs/hex-1.x.csv.

で、結論だけ言いますと、以下のように環境変数を設定すると、認証付きプロキシでも通ります。

set HTTPS_PROXY=http://<proxy_userid>:<proxy_password>@<proxy_server>:<proxy_port>

ここで、注意点です。
自分が試した環境であると、<proxy_userid>に@が入っています。その場合、どうもその@のまま設定しないと上手く認証が通りません。パーセントエンコーディングしてしまうとダメです。
また、二重引用符で囲んで環境変数を設定した場合も、認証が通りません。

上記状態で、mix ecto.createが通らない。

mix archive.install ...も、上記プロキシ設定で通ります。mix phx.new <project>も通ります。
しかし、cd <project>の後のmix ecto.createでエラーになります。

>mix ecto.create
escript: exception error: no match of right hand side value undefined
  in function  rebar_log:log/3 (/home/tristan/Devel/rebar3/_build/default/lib/re
bar/src/rebar_log.erl, line 94)
  in call from rebar3:handle_error/1 (/home/tristan/Devel/rebar3/_build/default/
lib/rebar/src/rebar3.erl, line 325)
  in call from escript:run/2 (escript.erl, line 759)
  in call from escript:start/1 (escript.erl, line 277)
  in call from init:start_em/1 (init.erl, line 1085)
  in call from init:do_boot/3 (init.erl, line 793)
** (Mix) Could not compile dependency :ranch, "escript.exe "c:/Users/thyodo/.mix
/rebar3" bare compile --paths "c:/project/pleiades/elix/pilot/_build/dev/lib/*/e
bin"" command failed. You can recompile this dependency with "mix deps.compile r
anch", update it with "mix deps.update ranch" or clean it with "mix deps.clean r
anch"

結論から言うと、さっき変更した環境変数HTTPS_PROXYの中身のうち、@を%40に変更して再度設定した後、mix ecto.createを実行すると通ります。

>mix ecto.create
Compiling 13 files (.ex)
Generated pilot app
The database for Pilot.Repo has been created

免責事項

障害箇所の特定はやってません。その為、もっといい方法があるかも知れません。
特定のプラットフォームやバージョン依存の可能性があります。今後修正されるかも知れません。
(修正されるなら、%エンコーディングを許容してほしいですが・・・・・・)