問題タブ [dotnet-publish]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
2 に答える
420 参照

json.net - dotnet publish 出力フォルダーからアプリを実行しているときに、ファイルまたはアセンブリ Newtonsoft.Json を読み込めませんでした

Newtonsoft.Jsonライブラリがスローする問題を見つけています

アプリを Docker コンテナーとして実行しているときに、なぜこれが発生するのか、依存関係の管理がスムーズに機能しないのかを知りたいです。

私は.NET 5を使用しています

json のシリアライズとデシリアライズにMyLibrary.A明示的に使用するライブラリがあります。Newtonsoft.Json 13.0.1

MyLibrary.Bライブラリをラップする別のライブラリがありMassTransit.AmazonSQSます。この MassTransit ライブラリも Newtonsoft.Json を使用していますが、おそらく別のバージョンです。明示的に何もしなければ、MassTransit の依存関係がNewtonsoft.Json 11.0.2. MyLibrary.B明示的に使用していなくても、明示的に追加した場合Newtonsoft.Json 13.0.1、MassTransit はこの最新のものを使用して満足しているようです。Newtonsoft.Json 13.0.1

これで、とMyAppを使用する Web アプリができました。ローカルでは問題なく動作しますが、CI/CD サーバーを使用して Docker イメージを生成します。MyLibrary.AMyLibrary.B

ここで、この Docker イメージをコンテナーとして (Docker Compose として) ローカルで起動すると、エラーが発生します。

存在すらしないバージョンについて文句を言います。13.0.0.0 はありません。このライブラリは 12.0.3 から 13.0.1 になるようです。

現在、すべてのライブラリを調べて、それらがすべてNewtonsoft.Json 13.0.1明示的に使用されていることを確認しています。そして、それらの一部が依存するサードパーティを使用していることを検出した場合Newtonsoft.Json、まったく同じバージョンを明示的に追加して、どこでも13.0.1バージョンを取得できるようにします。


更新 1: 私の回避策はうまくいきませんでした。他に何を試すべきかわかりません。

明示的に webapp に追加したNewtonsoft.Json 13.0.1ので、少なくとも実行時にそれが利用できることを望んでいました。

また、Web を標準の kestrel AspNetCore アプリ (.NET 5) としてローカルで実行すると、適切に起動します。何が起こっている?Newtonsoft.Json 13.0.0.0docker コンテナーが見つからないという不平を言っているのはなぜですか?

これらは、Docker コンテナーとして実行しようとしたときのトレースです。


更新 2 : ライブラリのどこでも MassTransit の依存関係を一致させることにしましたNewtonsoft.Json 11.0.2問題は残ります。 エラーは現在

理解できません。私の依存関係はすべてNewtonsoft.Json11.0.2でも不平を言っています。このバージョンを Web アプリのメイン アセンブリに明示的に (直接は必要ありませんが) 追加し、それでも問題が発生するかどうかを確認します。


更新 3Newtonsoft.Json 11.0.2 :すべてのライブラリに追加した後も、同じ依存関係を Web アプリ アセンブリに依存関係として追加した後も、同じ問題が発生します。

クリスのコメントによると、私は今持ってい.dockerignoreます。

私がイメージを構築する方法は、GitLab を使用して、標準のdotnet build.dotnet publish

より具体的には、私は Kaniko を使用しており、これが私の.gitlab-ci.yml

dotnet publishdocker で何かが台無しになっているかどうか、または私のプロセスに何らかの欠陥があるかどうかはわかりません(他のすべてのサービスでは問題なく動作します)。何が問題なのですか?

とともにNewtonsoft.Json.dll生成されたファイルと、Docker イメージに適切にコピーされていると思われる他のすべてのファイルを見ることができます。dotnet publishMassTransit.AmazonSqsTransport

また、 を開くと、are.deps.jsonへのすべての参照が表示されるため、バージョンの競合はもうありません (と思います!)。Newtonsoft.Json11.0.2

私はアイデアがありません。


更新 4 すべてのローカル nuget パッケージをクリアしました (Ubuntu を使用)

興味深いのは、プロジェクトでその後依存関係を復元すると、

/home/diegosasw/.nuget/packages/newtonsoft.json バージョン11.0.2と_9.0.1

そのため、サブ依存関係が Newtonsoft 9.0.1 を使用している可能性があると思いますが、私が生成Newtonsoft.Json 9.0.1したものに a の痕跡がなくても、これが私の問題に関連しているかどうか疑問に思っています。ロードされ、無視されていますか?*.deps.jsondotnet publish11


更新 5Newtonsoft.Json 9.0.1がいくつかのテスト プロジェクトで使用されていることを確認しcoverlet.collector.deps.jsonまし たcoverlet.core 1.0.0Microsoft.Extensions.DependencyModel 2.1.0

それは私の問題の原因ではないと思います。

またdocker export $(docker ps -lq) -o foo.tar、コンテナにNewtonsoft.Json.dll.

なぜこれが起こっているのかを理解し、この種のことをより適切にトラブルシューティングする方法を学びたい.


更新 6 (10 月 4 日)

問題は Docker にあるとは思いません。問題は、dotnet publish私が見逃しているか間違っている可能性が高いと思います。

何も問題がなかったので、Docker を外に置いておきました。私は単にやろうとしました

その発行フォルダーでアプリを実行してdotnet MyCompany.ItgService.dll、例外を再現します。

しかし、公開する前に、アプリケーションを

私はその例外を取得しません。

詳細、トレース、ツリー構造などについては、https://github.com/dotnet/sdk/issues/21716を参照してください。

概要

質問は次のとおりです。

  • dotnet publishアプリの実行に必要なものがすべて生成されないように見えるのはなぜですか?

  • そこにあるアセンブリについて実行時に不平を言うのはなぜですか?


最終更新: 問題は解決しました。この種の問題を適切にトラブルシューティングする方法と、テスト プロジェクト (異なるバージョンのライブラリを使用する) がアーティファクトを公開せず、目的の依存関係アセンブリを上書きしないようにすることで問題を解決した方法に関する情報が記載されている、私自身の応答を参照してください。

0 投票する
1 に答える
241 参照

asp.net-core - Azure App Service への ASP.NET Core の発行中に stdoutLogFile の場所を設定するのは何ですか?

ASP.NET Core Web API を Azure App Service に発行しています。Visual Studio 2022 と Azure DevOps パイプラインから発行しました。Visual Studio の発行プロセスによって、Azure DevOps パイプラインとは異なる web.config ファイルが生成される理由を理解しようとしています。

私のプロジェクトには、いくつかのリクエスト制限を含む web.config ファイルが含まれています。

Visual Studio または DevOps から発行すると、発行プロセスによって aspNetCore モジュールと<aspNetCore>要素のハンドラー情報が追加されます。

Visual Studio から公開すると、要素のstdoutLogFile場所は.<aspNetCore>"\\?\%home%\LogFiles\stdout"

DevOps パイプラインからビルドして公開すると、stdoutLogFile場所は.\logs\stdout.

dotnet publishaspNetCore モディール情報を追加して web.config ファイルを変換するのは、パイプラインのタスクだと思います。自己完結型のアプリを作成するために、次の引数を渡しています --configuration Release --runtime win-x64 --output $(Build.ArtifactStagingDirectory)

web.configのドキュメントには次のように記載されています。

アプリが Azure App Service にデプロイされると、stdoutLogFile パスは \?%home%\LogFiles\stdout に設定されます。

しかし、値を設定する/設定する必要があるものについての説明が見つかりません。値を設定するとは何ですか? Azure DevOps パイプラインまたは Visual Studio の外部でその動作を模倣するにはどうすればよいですか? DevOps パイプラインで使用されていない公開プロファイル内のものですか? 私の主な目標は、プロセスをよりよく理解することです。