16

2つの別々の.NETソリューションがあります。

  • 最初のソリューションのビルドを実行すると、最終製品である一連のDLLが生成されます。これらのDLLは、NuGetパッケージを介してお客様に提供されます。
  • 2番目のソリューションは製品テストソリューションとして機能します。NuGetパッケージがインストールされ、ビルドおよび実行されます。したがって、お客様とまったく同じように製品を使用します。

ここでの課題は、できればこの製品テストソリューションのビルド中に、最新のNuGetパッケージを製品テストソリューションに自動的にインストールする方法があるはずです。

同様の質問からのアイデアに基づいて、私は製品テストソリューションを構成することでこれまでに得ました:

  • まず、NuGetパッケージの復元を有効にしました。これにより、packages.configファイルで定義されたバージョンのパッケージがビルド前にNuGetによって自動的にダウンロードされるため、VCSから「packages」ディレクトリを完全に削除できます。
  • 次に、VisualStudioで次のビルド前イベントを追加しました$(SolutionDir).nuget\nuget update -prerelease $(ProjectDir)packages.config。これにより、ビルド中にNuGetパッケージの最新バージョンを取り込むことができます。

私は現在、上記のシナリオを使用して、Visual Studioを使用してローカルビルドを実行し、TeamCityを使用して無人ビルドを実行しています。このソリューションは一見両方のシナリオで機能するように見えますが、実際には期待した結果は得られません。製品テストソリューションをビルドすると、binディレクトリに最新バージョンのDLLは取得されず、最新バージョンのみが取得されます。 -1バージョン。

問題は、nuget updateコマンドがpackages.config.csprojファイルを含むすべてを期待どおりに更新するにもかかわらず、それらの新しいコンテンツがビルドによって取得されないことです。したがって、私の推測では、ファイルのHintPath設定は.csprojまだ「ビルド前」の状態を反映しています。したがって、古いDLLがbinディレクトリにコピーされます。ファイルが1回だけ処理されると仮定し.csprojます。つまり、ビルド前イベントがトリガーされる前であり、ビルド前イベントによって行われた変更は、次のビルドまで無視されます。

私は次の解決策を検討しました。

  • どうやらプレビルドは十分に「プレ」ではありません。コマンドを挿入できるさらに早い時点があればnuget update、上記の解決策はおそらく機能します。
  • ReferencePathを定義することで、.csprojファイルのHintPath-sをオーバーライドできることを読みました。しかし、正しいパスを簡単に理解できるか、ビルドがそれを取得できるように十分に早く設定できるかは疑問です。
  • 回避策として、ビルドを2回実行できます。TeamCityで製品テストソリューションのビルドステップを複製し、VisualStudioで常にローカルでソリューションを2回ビルドできます。

ビルド中にNuGetパッケージを最新バージョンに自動的に更新する方法を誰かが理解しましたか?

4

3 に答える 3

4

自動更新をビルド前のステップに入れるのはNuGetスタイルではないと思います。やると毎回この操作が必要なのがわかります。主に、ビルド時間が長くなる可能性があるためです。たとえば、TDD を使用し、頻繁にプロジェクトを再ビルドしてテストを実行する場合、それが迅速に行われることを期待します。さらに、予期しないパッケージを更新して何かを壊す可能性があり、その後、問題を見つけるために多くの時間を費やすことができます.
別のステップとして更新を行うことをお勧めします。TeamCity では、NuGet installerビルド ステップを使用できます。更新を実行するには、ステップ構成の下部にある 2 つのチェックボックスをオンにするだけです。 ここに画像の説明を入力

さらに、ビルドが成功してテストに合格した後に更新の結果を保持したい場合は、後でこの変更を VCS にコミットするビルド ステップを追加できます (たとえば、cmd または PowerShell を使用)。
ローカルで作業している場合は、プロジェクトで作業を開始する前に、更新パッケージを 1 回実行する方がよいと思います。Package Manager Consoleコマンドでこれを使用できますUpdate-Package -IncludePrerelease

于 2013-02-23T09:47:57.660 に答える