2

いくつかの .Net 4.0 ソリューションがあり、それらはすべて、1 つの特定のソリューションである Server.sln (Shared.sln の方が適切な名前だったと思います) によって構築されたアセンブリに依存しています。ビルド プロセスでは、最初にMsBuild OutDir パラメータを使用して Server.sln を Binaries ディレクトリにビルドし、次にサブディレクトリ (Binaries\Client、Binaries\Web など) への後続のソリューションをビルドし、再び OutDir パラメータを使用してパスを指定します。適切なサブディレクトリ。これにより、個別のアプリケーションをさまざまな場所に簡単に公開できます。これは、作成した新しい API.sln を除いて、すべてのソリューションで正常に機能します。

他のソリューションと同様に、API.sln は Server.sln によってビルドされたいくつかの DLL を参照しますが、実際に発生するコンパイル エラーは、1 つのプロジェクト (これを Project1 と呼びます) が Project2 への参照を見つけることができないというものです。Project1 と Project2 は両方とも API.sln のプロジェクトであり、Project1 はプロジェクト参照を介して Project2 を参照します。dll ファイル参照ではありません。また、Project2 には外部依存関係もありません。SystemSystem.Core、およびSystem.Runtime.Serializationへの参照のみがあります。

OutDir を Binaries ディレクトリに設定するとすべてが機能しますが、API.sln アセンブリのすべてが Server.sln アセンブリのすべてと混合され、API のみを展開するようになるため、これを行いたくありません。 sln アセンブリが難しくなります。OutDir を Binaries\API に設定すると、次のようなビルド エラーが表示されます。

The name '[Project2 Class Name]' does not exist in the current context [Path to Project1.csproj]

確認しましたが、Project1.dll アセンブリと Project2.dll アセンブリの両方が Binaries\API ディレクトリに作成されているため、このエラーが生成される理由がわかりません。私たちの TFS ビルド サーバーにはこの問題がありますが、同じパラメーターを使用して .slns で MsBuild を呼び出すことにより、ローカル コンピューターで問題を再現することもできます。何か案は?

実際にビルドを行うために使用している 2 つの msbuild コマンドを次に示します。

Server.sln をビルドします。

C:\Windows\Microsoft.NET\Framework64\v4.0.30319\MSBuild.exe /nologo "C:\PlatformAPIBuild\BuildProcessTests\Sources\RQ4.Server.sln" /nr:False /fl /flp:"logfile=C:\PlatformAPIBuild\BuildProcessTests\Sources\RQ4.Server.log;encoding=Unicode;verbosity=normal" /p:SkipInvalidConfigurations=true /p:ReferencePath=C:\PlatformAPIBuild\BuildProcessTests\Binaries  /p:OutDir="C:\PlatformAPIBuild\BuildProcessTests\Binaries\\" /p:Configuration="Release" /p:Platform="Any CPU" /p:VCBuildOverride="C:\PlatformAPIBuild\BuildProcessTests\Sources\RQ4.Server.sln.Any CPU.Release.vsprops"

次に、API.sln をビルドします。

C:\Windows\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe /nologo "C:\PlatformAPIBuild\BuildProcessTests\Sources\IQ.Platform.PublicAPI.sln" /nr:False /fl /flp:"logfile=C:\PlatformAPIBuild\BuildProcessTests\Sources\IQ.Platform.PublicAPI.log;encoding=Unicode;verbosity=normal" /p:SkipInvalidConfigurations=true /p:ReferencePath=C:\PlatformAPIBuild\BuildProcessTests\Binaries  /p:OutDir="C:\PlatformAPIBuild\BuildProcessTests\Binaries\Platform.PublicAPI\\" /p:Configuration="Release" /p:Platform="Any CPU" /p:VCBuildOverride="C:\PlatformAPIBuild\BuildProcessTests\Sources\IQ.Platform.PublicAPI.sln.Any CPU.Release.vsprops" 

API.slnビルドのログ ファイルは次のとおりです。次のようなエラーがあることに気付くでしょう。

Warning as Error: Reference to type 'IQ.Platform.Framework.WebApi.Model.Hypermedia.AccessControl' claims it is defined in 'c:\PlatformAPIBuild\BuildProcessTests\Binaries\Platform.PublicAPI\IQ.Platform.Framework.WebApi.Model.dll', but it could not be found

しかし、そこにないと書かれているファイルは、ビルドが失敗した後にそれを探すと実際にはそこにあり、ログファイルの上部で最初に行うことの1つは、そのアセンブリをそのパスにコピーすることであることがわかります.そのため、なぜ見つからないのかわかりません。IQ.Platform.Framework.WebApi.Model は、上記の説明の Project2 です。

すべての Test プロジェクトを削除した API.sln ビルドのログ ファイルを次に示します。これにより、エラーが 1 つだけ残ります。これにより、ログ ファイルを確認しやすくなります。そして、これは同じログですが、診断の冗長性があります。

4

0 に答える 0