29

私は100を超えるプロジェクト(C ++、マネージC ++、C#)を含む大規模なソリューションを持っており、それらの多くは相互に依存しています。

TeamCityサーバーがあり、そこでこのソリューションを構築したいと思います。

VisualStudioでソリューションを構築すると、すべてうまくいきますが、TeamCityではCS0006エラーが発生します。その理由はわかっています-TeamCityはMSBuild4を使用してソリューションをビルドしますが、MSBuild 4には既知のバグがあります-ビルドの順序を無視し、必要に応じてソリューションからプロジェクトをビルドします。あなたが持っている場合、この振る舞いのために:

Project A
Project B which has reference to A

MSBuildは、次の順序でこれらのプロジェクトをビルドできます。

1. B
2. A

最も簡単な解決策は、BuildProjectReferences = true(デフォルト)を設定することです。これにより、参照されるすべてのプロジェクトが自動的にビルドされます。ただし、このソリューションで参照されているプロジェクトがすべてではなく、別のソリューションからプロジェクトをビルドできないため、このアプローチを使用することはできません。

この問題の別の修正方法は次のとおりです。ConfigurationManagerを使用して、ビルドすべきではないすべてのプロジェクトを無効にしますが、VisualStudioでのみ機能します。MSBuildはそれを無視し、参照されているすべてのプロジェクトをビルドします。

問題は、VisualStudioのウィンドウProjectBuildOrderに表示されるビルド順序を復元することです。これは、コンソールから直接MSBuildを使用する場合には当てはまりません。

4

4 に答える 4

30

Visual StudioブログでMSBuild.exeを使用する場合の、ソリューションのビルド順序が正しくないを参照してください。

この原則に従ってください:ソリューションファイルで表現された依存関係をまったく使用しないでください!依存関係のあるファイルで依存関係を表現することをお勧めします。代わりに、プロジェクトにプロジェクト参照を配置します。この例では、これはBからCへのプロジェクト参照になります。

プロジェクト参照のターゲットを参照したくなかったため、以前はこれを行ったことがないかもしれませんが、ビルドを注文するだけです。ただし、4.0では、参照を追加せずにビルドのみを注文するプロジェクト参照を作成できます。これは次のようになります–メタデータ要素に注意してください。<ItemGroup>もちろん、これはすべてタグ内にあります。

<ProjectReference Include="foo.csproj">
    <ReferenceOutputAssembly>false</ReferenceOutputAssembly>
</ProjectReference>

テキストエディターで子要素を追加する必要があることに注意してください— Visual Studioはプロジェクト参照を追加できますが、このメタデータのUIは公開しません。

ソリューションファイルの依存関係も削除することで整理できます。このように不要な行を削除します。GUIDは異なりますが、VSダイアログを使用すると機能します...

于 2012-08-14T12:53:48.087 に答える
9

上記の解決策は、.NetCoreプロジェクトからの出力に依存する.NetStandardプロジェクトを構築しようとしたときにうまくいきませんでした。ソリューションをVS2017とMSBuildでビルドするには、「SkipGetTargetFrameworkProperties」を追加する必要がありました。

<ProjectReference Include="foo.csproj">
    <ReferenceOutputAssembly>false</ReferenceOutputAssembly>
    <SkipGetTargetFrameworkProperties>true</SkipGetTargetFrameworkProperties>
</ProjectReference>
于 2019-02-08T08:56:40.363 に答える
8

私はこのような問題を抱えていました。ソリューション全体を正常にビルドする前に2つのビルドを要求することにより、ソリューションに現れました。

結局のところ、 ProjectReferenceではなくReferenceを誤って追加しました(.slnファイルでこれを探してください)。つまり、VS / MSBuildは参照されたライブラリファイルを必要とし、探しますが、それをビルドする方法を完全に認識していません。それはありませんでした。最終的に、ビルドプロセスは、参照されたライブラリを使用してプロジェクトに到達し、ライブラリをビルドして、次のビルド試行で使用できるようにします。

依存関係ツリーとMSツールチェーンの特定のムードによっては、これは散発的なエラーとして表示される可能性があるため、デバッグするのが難しい場合があります。

短いバージョン:ソリューション内のプロジェクトへの参照が、参照だけでなくProjectReferenceとしてリストされていることを確認してください。これを行うには、DLLファイルを参照して選択する代わりに、[ソリューション]タブに参照を追加します。

于 2016-04-27T06:36:04.423 に答える
0

上記の何も私には役に立たなかった。私が使用した解決策は、slnを数回ビルドし、最初の実行で/t:1stproject.csprojを渡し、次に/ t:2ndprojectを渡し、最後に/tなしでslnを渡して残りのソリューションを完成させることでした。

于 2021-07-02T19:42:08.147 に答える