无法使用MSBUILD构建我们的解决方案,它无法找到我们的.targets文件

时间:2012-11-29 14:49:08

标签: c# visual-studio-2008 msbuild

我已经为我们的产品所包含的所有VS解决方案编写了一些Windows批处理文件来调用msbuild。

它们都可以工作,除了一个SLN,其中CSPROJ文件导致问题。

所有项目都在VS2008中构建。

PROJECT FOLDER LAYOUT

\RootFolder
   \LinqToXsd
     -LinqToXsd.targets
     -Xml.Schema.Linq.dll
   \BL
     -BL.csproj
   \Config
     -Config.csproj

我们已经定制了CSPROJ文件来引入LinqToXsd:

将此行添加到第一个PropertyGroup

<LinqToXsdBinDir Condition="'$(LinqToXsdBinDir)' == ''">$(SolutionDir)\..\LinqToXsd</LinqToXsdBinDir>

Import 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。

UPDATE1

如果我更换此行:

<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中定义。

第二,导致相同症状的不同问题(不知道原因)

其中一个项目(BL)引用了下属(SL),SL的GUID已更改。 这在VS中并不重要,但MSBUILD 真的不喜欢它。

删除并重新创建refs修复了第二个解决方案。

我在随机的csproj hackings中发现了这一点,突然MSBUILD开始报告有关project {guid} referencing project {guid} which is not available in the SLN file的错误

谢谢,

J1M

2 个答案:

答案 0 :(得分:4)

MSBuild没有定义SolutionDir属性,因此您需要手动指定它:

msbuild.exe /p:SolutionDir=... other options

答案 1 :(得分:2)

Nuget以类似的方式工作。它将目标放在解决方案根目录下的子文件夹中。对于使用nuget的每个项目,它编辑。* proj文件并添加以下SolutionDir属性。如果以这种方式为SolutionDir提供默认值,则在调用msbuild时不必将其作为命令行参数传递:

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

然后就像这样更新你的目标:

  <Import Project="$(SolutionDir)\LinqToXsd\LinqToXsd.targets" />