.NET Core 2.0コンソールアプリがあります。このアプリを正常にビルドまたは公開して、ローカルで実行できます。このアプリをAzure DevOpsでビルドして公開することもできます。ただし、Azure DevOpsでアプリのbuildアプリを実行すると、結果を実行できません。
Azure DevOpsで、以下を使用してビルドを試みました。
dotnet build -c Release -r win-x64 -o app
これにより、プロジェクトに関連するファイルのみを含む少数のファイルが生成されます。ほとんどの場合に過剰に見えるSystem。*。dllファイルなどはすべて含まれていません。このコマンドをローカルマシンで実行すると正常に動作し、MyApp.exeファイルをクリックしてコンソールアプリを正常に実行できます。ただし、Azure DevOpsで同じコマンドを実行すると、生成されたMyApp.exeファイルが期待どおりに実行されません。代わりに、起動してすぐに終了します。コンソールアプリには何も印刷されません。エラーはありません。アプリは非常に基本的で、すべての周りに「トライキャッチ」が含まれ、最後にConsole.ReadLine
が付いています。それで、それは開いたままでいると思いました。
私が走ると:
dotnet publish -c Release -r win-x64 -o app
同じファイルを取得しますが、すべてのSystem。*。dllファイルなどが含まれています。今回、MyApp.exeを正常に実行でき、期待どおりに動作することに気付きました。
dotnet build ...
がローカルで動作するのに、Azure DevOpsでdotnet build ...
を実行すると同じ動作が得られないようです。 dotnet publish
を使わざるを得ないようです。私の問題は、結果の.Zipファイルが約500kbから30MBになることです。これは大きな違いです。
馬の口からの答え:
Dotnet buildコマンドは、プロジェクトとその依存関係を一連のバイナリにビルドします。バイナリには、拡張子が.dllの中間言語(IL)ファイルのプロジェクトのコードと、拡張子が.pdbのデバッグに使用されるシンボルファイルが含まれます。アプリケーションの依存関係をリストする依存関係JSONファイル(* .deps.json)が生成されます。 * .runtimeconfig.jsonファイルが生成され、アプリケーションの共有ランタイムとそのバージョンが指定されます。
プロジェクトにNuGetのライブラリなどのサードパーティの依存関係がある場合、それらはNuGetキャッシュから解決され、プロジェクトのビルド出力では使用できません。それを念頭に置いて、dotnetビルドの製品は、実行するために別のマシンに転送する準備ができていません。
dotnet build
-プロジェクトとそのすべての依存関係をビルドします。
dotnet publish
-ホスティングシステムにデプロイするために、アプリケーションとその依存関係をフォルダーにパックします。 (PS-これはパッキング前にアプリケーションもビルドします)
Microsoftから直接提供されていることを考えると、この説明は実際には非常に優れているため、ここでは単語を重複させません。
演習として、複数のプロジェクトでソリューションを作成します。プロジェクトの1つに別のプロジェクトへの参照を追加します。コードが参照する静的ファイルといくつかのNuGetパッケージを追加します。そして、これらのコマンドをソリューションのルートレベルとプロジェクトレベルで実行し、binフォルダーの出力を確認します。
実行するコマンド:dotnet build
dotnet publish
dotnet clean
binフォルダーをクリーンアップする
また、これをルートレベルで実行し、自己完結型フラグを有効にして出力を確認します。
dotnet publish -o ./output --runtime win10-x64 --self-contained
それらの違いは次のとおりです。
公開の場合、必要なアセンブリファイル(パッケージ)が現在のフォルダーに含まれ、アプリはこれらのアセンブリを使用します。
ただし、ビルドの場合、アプリはユーザーのフォルダーにあるパッケージを参照するため、Zipファイルはわずか500 kbです。
ユーザーのフォルダーにあるパッケージを参照するため、アプリを同じユーザーのアカウントでビルドする必要があるため、公開せずにアプリを実行できます。したがって、ビルドエージェントのサービスアカウントを自分のアカウントに変更(ログオン)してから、サービスを再起動して新しいビルドをキューに入れる必要があります。
それ以外の場合は、アプリを公開する必要があります。