なんとなく開発を始めてなんとなく使えるようになった気でいるC#をもう一度学び直そうと思って、Microsoft LearnのC#チュートリアルを始めた。別の言語でやってる記述をそのまま持ってきたりしてるせいか、たまにチュートリアルなど読むともっと簡単な書き方があるのを発見したりもする。
C#は今までならVisual Studioを開いていたところだが、dotnetコマンドでコンソールアプリケーションのプロジェクトを作り、VS codeでC#のコードを書き、dotnetコマンドでビルドして実行するという初めての使い方を今回覚えることができた。
そんな折に、エラーが突然現れた。
dotnet buildを実行するとNU1301エラーが発生
Microsoft LearnのC# コンソール アプリケーションにロジックを追加する (C# の概要、パート 3)のガイド付きプロジェクト – C# で条件付き分岐とループ構造を開発するまでやってきたところで、手順に従って演習用プロジェクトをビルドすると次のようにビルドエラーが現れた。
PS C:\GuidedProject\Starter> dotnet build
C:\GuidedProject\Starter\Starter.csproj : error NU1301:
ソース https://api.nuget.org/v3/index.json のサービス インデックスを読み込めません。
The proxy tunnel request to proxy 'http://<proxy>:<port>/' failed with status code '407'."
C:\GuidedProject\Starter\Starter.csproj : error NU1301:
ソース https://api.nuget.org/v3/index.json のサービス インデックスを読み込めません。
The proxy tunnel request to proxy 'http://<proxy>:<port>/' failed with status code '407'."
C:\GuidedProject\Starter\Starter.csproj : error NU1301:
ソース https://api.nuget.org/v3/index.json のサービス インデックスを読み込めません。
The proxy tunnel request to proxy 'http://<proxy>:<port>/' failed with status code '407'."
C:\GuidedProject\Starter\Starter.csproj : error NU1301:
ソース https://api.nuget.org/v3/index.json のサービス インデックスを読み込めません。
The proxy tunnel request to proxy 'http://<proxy>:<port>/' failed with status code '407'."
24.7 秒後に 4 件のエラーで失敗しました を復元する
NU1301とは
NU1301についてググると、Microsoft LearnのNuGet エラー NU1301が現れた。しかしなんのことかわからない。ともかく、ここの記載から察するにNU1301は結果であって真の原因ではないようだ。
code ‘407’とは
エラーメッセージのとおりproxyでなにかが起こっているのでcode ‘407’についてググると、407 Proxy Authentication Requiredとのこと。どうやらproxyの認証が通っていないらしい。
dotnet / NuGetのproxy設定
NuGetは.NETのパッケージマネージャ。それがindex.jsonをダウンロードしようとしてProxyで認証エラーになったというものだった。NuGetのproxy設定についてググるとnuget.config 参照に、nuget configコマンドを使用して云々と記載されている。「http_proxy の形式は http://<username>:<password>@<domain> とする必要があります。」なるほど。で、そのnuget configコマンドは?nuget.exeにてconfigするといいらしいのだがそもそもnuget.exeがない。
次にググって出てきたNuGet クライアント ツールをインストールするというページ。これによると、nuget.exeは非 SDK スタイル プロジェクト 用の CLI ツールと記載されている。演習でやっているdotnet SDKのCLIとは違いそうだ。
dotnet/sdkにNuGet機能が入っているように書いているが、一体どうすれば。とりあえずdotnetコマンドのヘルプをあたる。
PS C:\GuidedProject\Starter> dotnet -h
使用法: dotnet [runtime-options] [path-to-application] [arguments]
.NET アプリケーションを実行します。
runtime-options:
--additionalprobingpath <path> 調査ポリシーと調査対象アセンブリを含むパス。
--additional-deps <path> 追加の deps.json ファイルへのパス。
(中略)
SDK コマンド:
add .NET プロジェクトにパッケージまたは参照を追加します。
build .NET プロジェクトをビルドします。
build-server ビルドによって開始されたサーバーとやり取りします。
clean .NET プロジェクトのビルド出力をクリーンします。
format プロジェクトやソリューションにスタイルのユーザー設定を適用します。
help 指定されたコマンドの参照ページをブラウザーで開きます。
list .NET プロジェクトのパッケージまたは参照を一覧表示します。
msbuild Microsoft Build Engine (MSBuild) コマンドを実行します。
new 新しい .NET プロジェクトまたはファイルを作成します。
nuget 追加の NuGet コマンドを提供します。
pack NuGet パッケージを作成します。
publish .NET プロジェクトを配置のために公開します。
remove .NET プロジェクトからパッケージまたは参照を削除します。
restore .NET プロジェクトに指定されている依存関係を復元します。
run .NET プロジェクトの出力をビルドして実行します。
sdk .NET SDK のインストールを管理します。
(後略)
nuget発見。nugetは独立したnuget.exeではなくdotnetコマンドに含まれているようだ。続いてそのdotnet nugetを調べてみる。
PS C:\GuidedProject\Starter> dotnet nuget --help
NuGet Command Line 6.12.2.1
Usage: dotnet nuget [options] [command]
Options:
-h|--help Show help information
--version Show version information
Commands:
add NuGet ソースを追加します。
config NuGet 構成 CLI
delete サーバーからパッケージを削除します。
disable NuGet ソースを無効にします。
enable NuGet ソースを有効にします。
list 構成されている NuGet ソースを一覧表示します。
locals http 要求キャッシュ、パッケージ フォルダー、プラグイン操作キャッシュ、マシン全体のグローバルなパッケージ フォルダーなどのローカル NuGet リソースをクリアまたは一覧表示します。
push パッケージをサーバーにプッシュし、公開します。
remove NuGet ソースを削除します。
sign 指定された証明書を使用して <package-paths> で NuGet パッケージに署名します。
trust 信頼された署名者を管理します。
update NuGet ソースを更新します。
verify 署名済みの NuGet パッケージを検証します。
why 特定のプロジェクトまたはソリューションの特定のパッケージの依存関係グラフを表示します。
Use "dotnet nuget [command] --help" for more information about a command.
configも発見。省略するが、ひらたくいうと次のようにすればよかった。
dotnet nuget config set http_proxy http://<username>:<password>@<proxy>:<port>/
設定されたはずなので、再度buildを試してみた。
PS C:\GuidedProject\Starter> dotnet build
復元が完了しました (8.2 秒)
Starter 成功しました (7.8 秒) → bin\Debug\net8.0\Starter.dll
うまくできた。イコールを使わないなどnuget.exeとは若干書式が違ったがこれでよし。
ところで、c# – NuGet behind a proxy – Stack Overflowによると %appdata%/Nuget/NuGet.Config に記載すればいいらしい。そのファイルを開くと次のように先ほどコマンドで設定したproxyが記載されていた。なのでこのファイルに直接書いてもいいかもしれない。
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<packageSources>
<add key="nuget.org" value="https://api.nuget.org/v3/index.json" />
<add key="Microsoft Visual Studio Offline Packages" value="C:\Program Files (x86)\Microsoft SDKs\NuGetPackages\" />
</packageSources>
<config>
<add key="http_proxy" value="http://<username>:<password>@<proxy>:<port>/" />
</config>
</configuration>
また、そのページによると次のように記載されているので、user/passwordを分けてもいいのかもしれない。
<configuration>
<config>
<add key="http_proxy" value="http://<IP>:<Port>" />
<add key="http_proxy.user" value="<user>" />
<add key="http_proxy.password" value="<password>" />
</config>
</configuration>
でも先に見た「http_proxy の形式は http://<username>:<password>@<domain> とする必要があります。」の記載とは矛盾するけど。
いずれにしても平文でパスワードを書くのはいい気がしない。
まとめ
dotnet / nugetのProxyの設定方法について調べることができた。
メッセージには復元と書いてあったので、dotnet restore、つまりなんらかの依存関係を復元させる必要があった。dotnet buildを行う際に内部で自動的に依存関係を修復・構築してくれるのだろう。そしてその復元に必要なモジュール(のインデックスが書かれているjsonファイル)のダウンロードの際にproxyに問題があってダウンロードできなかったのだと思われる。
参考サイト
- NuGet エラー NU1301 | Microsoft Learn
- nuget.configファイルリファレンス | Microsoft Learn
- NuGet クライアント ツールをインストールする | Microsoft Learn
- c# – NuGet behind a proxy – Stack Overflow

コメント