3

製品を構成するすべての 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>

そして、Importforの後のこの行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>

MSBuildProjectDirectoryVS と 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

4

2 に答える 2

5

MSBuild はプロパティを定義しないため、SolutionDir手動で指定する必要があります。

msbuild.exe /p:SolutionDir=... other options
于 2012-11-29T14:59:13.453 に答える
2

Nugetも同様に機能します。ターゲットをソリューションルートから離れたサブフォルダーに配置します。nugetを使用するプロジェクトごとに、。* projファイルを編集し、次のSolutionDirプロパティを追加します。この方法でデフォルト値をSolutionDir指定した場合、msbuildを呼び出すときにコマンドライン引数として渡す必要はありません。

  <PropertyGroup>
    <!-- ... other properties -->
    <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\</SolutionDir>
  </PropertyGroup>

次に、次のようにターゲットを更新します。

  <Import Project="$(SolutionDir)\LinqToXsd\LinqToXsd.targets" />
于 2012-11-29T15:22:08.433 に答える