6

packages.configNuGet 用の .NET の古いシステムでは、Package 要素の属性を使用して、パッケージの更新時に考慮されるパッケージの可能なバージョンを制限できました。allowedVersions

<package id="Newtonsoft.Json" version="10.0.3" allowedVersions="[10.0.3]" />

update-package上記を含むプロジェクトの Visual Studio 内で を実行すると、属性を使用して 10.0.3 に固定しているため、更新は行われませんNewtonsoft.JsonallowedVersions

でこれを達成するにはどうすればよいPackageReferenceですか? Version 属性にsemver構文を適用すると、復元されたバージョンにのみ影響します。更新は制限されません。したがって、以下を指定してPackageReference実行するupdate-packageと、たとえば、11.0.1 が NuGet リポジトリにある場合、11.0.1 にアップグレードされます。

<PackageReference Include="Newtonsoft.Json" Version="[10.0.3]" />

バックグラウンド

パッケージの更新にはコマンド ライン ツールを使用しています。これは、高速で移動する内部パッケージ (1 日に複数回更新) と、より安定した移動の少ないパッケージ (例: ASP.NET) の両方があるためです。大規模なコードベースでは、ファイル内の各依存関係を手作業で更新すること.csprojは、単純にスケーラブルではありません (そしてエラーが発生しやすくなります)。その下packages.configで、アップグレードしたくないサードパーティのパッケージを「固定」し、最新の急速に変化する依存関係に更新することもできます。

4

2 に答える 2

3

この回答から:

現時点では、これは不可能です。追跡については、この GitHub の問題を参照してください。

ただし、参照を追加するための cli コマンドは、再実行によるプロジェクト内の単一パッケージの更新をサポートしていdotnet add package The.Package.Idます。

GitHubの問題4358から:

PackageReferenceに代わるものはまだありません。update参照を変更するコマンドは にしかありませんdotnet

これについては、オープン機能リクエストのGitHub イシュー 4103を参照してください (4358 は重複としてクローズされました)。Microsoft は、この機能に高い優先度を置いていません (最初は 2016 年 10 月に公開されました)。

考えられる回避策

オプション1

参照を削除および追加することで、依存関係を「更新」することができます。この投稿によると、コマンドでバージョンを明示的に指定すると、最新バージョンではなく正確なバージョンがインストールされます。次のコマンドでバージョン制約を追加できることも確認しました。

dotnet remove NewCsproj.csproj package Newtonsoft.Json
dotnet add NewCsproj.csproj package Newtonsoft.Json -v [10.0.3]

これらのコマンドでできること:

  1. パッケージのバージョン番号をテキスト ファイルに保持します (おそらく名前をそのままにしておきますpackages.config)。
  2. スクリプトを使用して、テキスト ファイルを読み取り、上記の 2 つのコマンドを使用してループ内の各依存関係を処理する独自の「更新」コマンドを作成します。.slnスクリプトは、ファイルを渡してその中の各プロジェクトを処理するように設定できます。

オプション 2

MSBuild を使用して、共通の MSBuild ファイルから依存関係を "インポート" し、1 か所でバージョンを更新できます。

独自の要素を定義して<IncludeDependencies>、各プロジェクトに特定の依存関係を含めることができます。

SomeProject.csproj

<Project Sdk="Microsoft.NET.Sdk">

    <IncludeDependencies>Newtonsoft.Json;FastMoving</IncludeDependencies>
    <Import Project="..\..\..\Dependencies.proj" />
  
    ...
  
</Project>

Dependencies.proj

<Project>

    <ItemGroup>
        <PackageReference Condition="$(IncludeDependencies.Contains('Newtonsoft.Json'))" Include="Newtonsoft.Json" Version="[10.0.3]" />
        <PackageReference Condition="$(IncludeDependencies.Contains('FastMoving'))" Include="FastMoving" Version="3.332.0" />
    </ItemGroup>
  
</Project>
于 2018-03-21T06:42:30.867 に答える