製品を構成するすべての VS ソリューションに対して msbuild を呼び出す Windows バッチ ファイルをいくつか作成しました。
CSPROJファイルが問題を引き起こしている1つのSLNを除いて、それらはすべて機能します。
プロジェクトはすべて VS2008 でビルドされます。
プロジェクト フォルダのレイアウト
\RootFolder
\LinqToXsd
-LinqToXsd.targets
-Xml.Schema.Linq.dll
\BL
-BL.csproj
\Config
-Config.csproj
LinqToXsd を取り込むように CSPROJ ファイルをカスタマイズしました。
この行を最初に追加しましたPropertyGroup
:
<LinqToXsdBinDir Condition="'$(LinqToXsdBinDir)' == ''">$(SolutionDir)\..\LinqToXsd</LinqToXsdBinDir>
そして、Import
forの後のこの行Microsoft.CSharp.targets
<Import Project="$(LinqToXsdBinDir)\LinqToXsd.targets" />
コマンドライン:
C:\Windows\Microsoft.NET\Framework64\v3.5\msbuild.exe /m /target:Build /nologo /property:BuildInParallel=true;OutDir=E:\Projects\BuildMaster\trunk\built\ConfigTool\;Configuration=Release /verbosity:minimal "*snip*\ConfigTool\ConfigTool.sln"
問題は、出力に次のように表示されることです。
*snip*\ConfigTool\ConfigTool.csproj(131,11): error MSB4019: The imported project "E:\LinqToXsd\LinqToXsd.targets" was not found. Confirm that the path in the <Import> declaration is correct, and that the file exists on disk.
ConfigTool.csproj : Solution file warning MSB4122: Scanning project dependencies for project "ConfigTool.csproj" failed. The imported project "E:\LinqToXsd\LinqToXsd.targets" was not found. Confirm that the path in the <Import> declaration is correct, and that the file exists on disk. *snip*\ConfigTool\ConfigTool.csproj
*snip*\BL\BL.csproj(352,11): error MSB4019: The imported project "E:\LinqToXsd\LinqToXsd.targets" was not found. Confirm that the path in the <Import> declaration is correct, and that the file exists on disk.
..\BL\BL.csproj : Solution file warning MSB4122: Scanning project dependencies for project "..\BL\BL.csproj" failed. The imported project "E:\LinqToXsd\LinqToXsd.targets" was not found. Confirm that the path in the <Import> declaration is correct, and that the file exists on disk. *snip*\BL\BL.csproj
C:\Windows\Microsoft.NET\Framework64\v3.5\Microsoft.Common.targets : warning MSB3245: Could not resolve this reference. Could not locate the assembly "Microsoft.Xml.Schema.Linq". Check to make sure the assembly exists on disk. If this reference is required by your code, you may get compilation errors.
それでも、これらの行を使用して完全に機能する他のプロジェクトがあります。同じ CSPROJ ファイルを参照するもの (共有 BL) を含みます。
bin、obj、cache、suo、およびユーザーのファイル/フォルダーをすべて削除しようとしましたが、違いはありません。
役立つ msbuild の専門家はいますか?
ありがとう、
J1M.
更新1
この行を置き換えると:
<LinqToXsdBinDir Condition="'$(LinqToXsdBinDir)' == ''">$(SolutionDir)..\LinqToXsd</LinqToXsdBinDir>
この行で:
<LinqToXsdBinDir>$(MSBuildProjectDirectory)\..\LinqToXsd</LinqToXsdBinDir>
ConfigTool および BL プロジェクト ファイルでは、BL をコンパイルするときに LinqToXsd が見つからないというエラーは発生しなくなりましたが、コンパイルされた BL dll は見つかりません。
解決
まず、SolutionDir は VS2008 でのみ定義されており、MSBUILD ではないようです。コマンドラインで渡すことができますが、私は次のことを選択しました:
<LinqToXsdBinDir>$(MSBuildProjectDirectory)\..\LinqToXsd</LinqToXsdBinDir>
MSBuildProjectDirectory
VS と MSBUILD の両方で定義されています。
第二に、同じ症状を引き起こした別の問題 (理由がわからない)
プロジェクトの 1 つ (BL) が下位 (SL) を参照し、SL の GUID が変更されました。これは VS では問題ではありませんでしたが、MSBUILDは本当に気に入らなかったのです。
参照を削除して再作成すると、2番目の解決策が修正されました。
ランダムなcsprojハッキング中に突然MSBUILDがエラーを報告し始めたときに初めてそれを知りましたproject {guid} referencing project {guid} which is not available in the SLN file
ありがとう、
J1M