dotnet buildを実行するとerror NU1301

.NET/SDK NuGetのProxy設定 .NET
.NET/SDK NuGetのProxy設定

なんとなく開発を始めてなんとなく使えるようになった気でいる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に問題があってダウンロードできなかったのだと思われる。

参考サイト

   

コメント

タイトルとURLをコピーしました