プロキシ環境化の Windows に Rust 開発環境構築

プロキシ環境化で Windows に Rust 開発環境を構築する方法のメモです。

やりたいこと

Rust 自体のインストールや Cargo での crates.io の外部クレートの利用にはインターネットアクセスが必要で、プロキシ環境だといろいろ怒られるので、設定方法を纏めておきます。

環境

OS
Windows 10 21H2
Rust
rustup 1.25.1, rustc 1.62.1, cargo 1.62.1

Visual Studio C++ Build tools インストール

Rust をインストール - Rustプログラミング言語 に記載がありますが、Windows の場合 Cコンパイラとして Visual Studio C++ Build tools が必要です。
なお、Visual Studio C++ Build tools のライセンスは以下の通りですので、個人利用以外の場合はライセンスを確認してください。

  1. インストールと使用権。

お客様は、Visual Studio Community、Visual Studio Professional、Visual Studio Enterprise と共に使用する場合に限り、本ソフトウェアの任意の数の複製をインストールして使用し、お客様のアプリケーションを開発およびテストすることができます。 マイクロソフト ソフトウェア ライセンス条項

  1. Visual Studio C++ Build tools インストーラーのダウンロード

    Microsoft C++ Build Tools - Visual Studio からインストーラーをダウンロードします。

  2. インストーラーの実行

    ダウンロードした vs_BuildTools.exe を実行します。ワークロード等の選択をする必要がありますが、The Rust Programming Language 日本語版 に以下の記載があります。

    どのワークロード (workloads) をインストールするかと質問されたときは、“C++ build tools"が選択されており、Windows 10 SDKと英語の言語パック (English language pack) が含まれていることを確かめてください。 - インストール - The Rust Programming Language 日本語版

    こちらに沿って、ワークロード タブでは C++ によるデスクトップ開発 を選択し、右側のオプションで Windows 10 SDK が選択されていることを確認します。他のオプションの要否は確認していませんが、デフォルト選択されているものはそのままにしています。 ワークロード - Visual Studio Build Tools 2022

    同様に 言語パック タブでは 英語 が選択されていることを確認し、インストール をクリックします。 言語パック - Visual Studio Build Tools 2022

  3. 必要なリソースをダウンロードしながらインストールが進みます。このときもプロキシの影響を受けるはずですが、私の環境では影響ありませんでした。おそらく既存の Windows プロキシ設定を参照していると思われます。

    Windows のプロキシ設定は インターネットオプション での設定と WinHTTP での設定の2箇所ありますが、おそらく後者を参照していると思われます。WinHTTP でのプロキシ設定の確認は コマンドプロンプト あるいは Powershell で以下コマンドで確認できます。

    netsh winhttp show proxy

rustup インストール

Rust をインストール - Rustプログラミング言語 のおすすめに沿って、rustup を使用して Rust をインストールします。

  1. Rust をインストール - Rustプログラミング言語 から rustup-init.exe をダウンロードします。

  2. rustup-init.exe は必要リソースをダウンロードしてインストールするので、プロキシ情報を環境変数に設定する必要があります。Network proxies - The rustup bookに沿って コマンドプロンプト あるいは Powershell で以下のように設定します。

    コマンドプロンプト の場合:

    set https_proxy=http://<IP>:<PORT>

    Powershell の場合:

    $env:https_proxy="http://<IP>:<PORT>"
  3. rustup-init.exe を実行します。以下のようにオプションを選択する必要がありますが、1 を選択します。

    This path will then be added to your PATH environment variable by
    modifying the HKEY_CURRENT_USER/Environment/PATH registry key.
    
    You can uninstall at any time with rustup self uninstall and
    these changes will be reverted.
    
    Current installation options:
    
       default host triple: x86_64-pc-windows-msvc
         default toolchain: stable (default)
                   profile: default
      modify PATH variable: yes
    
    1) Proceed with installation (default)
    2) Customize installation
    3) Cancel installation
    >1

    ここでプロキシ設定ができていないと以下のようなエラーが出てインストールに失敗します。

    error: could not download file from 'https://static.rust-lang.org/dist/channel-rust-stable.toml.sha256' to 'C:\Users\<User>\.rustup\tmp\xc9ggdng9i4u6nt1_file': failed to make network request: error sending request for url (https://static.rust-lang.org/dist/channel-rust-stable.toml.sha256): operation timed out: operation timed out
    
    Press the Enter key to continue.
  4. インストールが完了したら、以下コマンドで確認します。

    rustup -V

    次のように表示されればインストールできています。

    rustup 1.25.1 (bb60b1e89 2022-07-12)
    info: This is the version for the rustup toolchain manager, not the rustc compiler.
    info: The currently active `rustc` version is `rustc 1.62.1 (e092d0b6b 2022-07-16)`

cargo のプロキシ設定

Rust のビルドやパッケージ管理には cargo が必須ですが、crates.io の外部パッケージに依存がある場合、cargo はビルド時に crates.io を参照し、依存するリソースをダウンロードし、ビルドするため、cargo にもプロキシ設定が必要です。

cargo は様々な設定を config.toml ファイルで定義することができます。config.tomlConfiguration - The Cargo Book で説明されていますが、パッケージ、プロジェクト、ユーザー、コンピューター等様々な単位で設定できます。プロキシ設定はどのプロジェクトでも必要だと思いますので、ここではユーザー単位の config.toml に設定していきます。

プロジェクトの Cargo.toml に誤って設定しないよう注意してください。Cargo.toml に設定するとビルド時等に、warning: unused manifest key: http というワーニングが出てしまいます。(もちろん設定も反映されません)

  1. デフォルトインストールだと、%USERPROFILE% (= c:\Users\<ユーザー名) の直下に .cargo というディレクトリがあります。.cargo ディレクトリの直下に config.toml というファイルを作成します。

  2. Configuration - The Cargo Book に沿って config.toml に以下のようにプロキシ情報を記載します。

    [http]
    proxy = "http://<IP>:<PORT>"

    この設定は環境変数 CARGO_HTTP_PROXY, HTTPS_PROXY, https_proxy, http_proxy のいずれかで代替できるので、rustup のときに設定した環境変数が生きていれば使いまわせます。

  3. 試しに新しいプロジェクトを作成します。

    cargo new test1
  4. 適当な crates.io のパッケージを依存関係に追加します。

    cd ./test1
    cargo add windows --features "Win32_System_Com"

    cargo addCargo 1.62 (2022-06-30) で追加されたオプションです。これより前のバージョンの場合は、Cargo.toml に次のエントリーを記述し、cargo fetch を実行してください。

  5. Cargo.toml に以下のようなエントリーができていれば成功です。

    [dependencies]
    windows = { version = "0.39.0", features = ["Win32_System_Com"] }

cargo の SSL connection error 対応

デフォルトでは Cargo はビルド時に依存パッケージをダウンロードします。このときに私の環境では以下のようなエラーが発生しました。

warning: spurious network error (1 tries remaining): [35] SSL connect error (schannel: next InitializeSecurityContext failed: Unknown error (0x80092012))
error: failed to download from `https://crates.io/api/v1/crates/autocfg/1.1.0/download`

Caused by:
  [35] SSL connect error (schannel: next InitializeSecurityContext failed: Unknown error (0x80092012))

推測ですが、恐らく SSL コネクションが プロキシで終端していることによるものかと考えられます。

Configuration - The Cargo Bookの通り、Config.tomlhttp.check-revokefalse にすることで、TLS 証明書チェックをバイパスでき、エラーがでなくなります。

[http]
proxy = "http://<IP>:<PORT>"
check-revoke = false

あとがき

何かと面倒臭いプロキシ環境化の Windows に Rust 開発環境を構築しました。Windows だと Visual Studio C++ Build tools が必要になってしまいますので、Windows Subsystem for Linuxgcc でコンパイルする環境も整えようかなと思いますが、こちらもプロキシ環境化では悩まされそうですね。