問題タブ [packagereference]
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.
.net-core - 推移的な nuget パッケージの依存関係を強制的に更新する最良の方法は?
モデルを使用してA
サードパーティの nuget パッケージ ( ) を参照する .NET Core アプリケーション ( ) について考えてみます。パッケージには、別のパッケージ ( ) への独自の依存関係があります:B
PackageReference
B
C
パッケージは、バージョン制約付きでB
依存関係を宣言しています。のコンパイル時の使用法がなく、直接参照することもありません -推移的な実行時の依存関係です。C
>= 1.0.0
A
C
C
ただし、パッケージのバージョン 1.0.0 C
(ビルドによって取得される) にはバグがあります。このバグは、より新しいバージョンで修正され、増分されたマイナー バージョン (v1.1.0 など) で nuget にリリースされました。
デフォルトでは、ビルドはこの最新バージョンを取得しません。これは、 https ://docs.microsoft.com/en-us/nuget/concepts/dependency-resolution#dependency-resolution-rules で説明されている「適用可能な最低バージョン」ルールによるものだと思います 。
ビルドにバグ修正 1.1.0 バージョンのパッケージを強制的に選択させるための推奨される方法は何C
ですか?
C
1 つの解決策は、からパッケージの 1.1.0 バージョンを明示的に参照することA
です。A
ただし、これについては何も知る必要がないため、カプセル化を破っているように感じC
ます。
理想的には、パッケージの作成者がB
依存関係を更新しC
て新しいバージョンを使用することですが、私はこのパッケージを制御できません。
また、ソリューションのルートにあるファイルを使用してDirectory.Build.props
、ソリューション全体でバージョンを強制的に更新しようとしました。
...しかし、これは機能しません(「適用可能な最低バージョン」ルールがまだ適用されていると思います)。の代わりに使用しても機能しますが、ソリューション内のすべてのプロジェクトにパッケージをインストールするだけです。Include
Update
ビルド プロセスに何らかの「ポリシー」を提供して、更新されたバージョンを強制的に取得できるようにしたいと考えていますが、これを行う方法が見つかりませんでした。
注: 私の実際の例は、ここで概説したものよりも複雑です。B
とはどちらC
も広く使用されている Microsoft ASP.NET パッケージでありC
、依存関係グラフの多数の場所に表示されます (私のアプリケーションはそのコードを直接参照することはありません)。
c# - PackageReference が ExcludeAssets = "runtime" および PrivateAssets = "none" で dll をコンシューマー (テスト) プロジェクト出力にコピーしない
ここでの簡単なセットアップ:
- プロジェクト A - .NET 4.7.2 フレームワーク ライブラリ プロジェクト
- SeriLog 2.9.0 へのパッケージ参照
- ExcludeAssets="ランタイム",
- PrivateAssets="none"、デフォルトでは DLL をコピーする必要があるため、これはオプションです (設定 = "runtime")
- SeriLog 2.9.0 へのパッケージ参照
- TestProject B - .NET 4.7.2 フレームワーク単体テスト プロジェクト
- プロジェクト A が ProjectReference として追加されます
- SeriLog DLL とすべての依存関係をここにコピーする必要があります
出力: SeriLog DLLはProjectAの出力フォルダーにコピーされず、 TestProject Bにもコピーされません。私の観点からすると、TestProjectB にはSeriLog.dllが含まれているはずです。何か不足していますか?またはそれを達成するための他のオプションはありますか?
備考: PackageReference format specification から理解した限りでは、属性を正しく使用しています。
ExcludeAssets属性は、それが定義されているプロジェクトのアセットを制御します。PrivateAssetsは、プロジェクト A を使用しているプロジェクトへのフローを制御します。