3

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

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

这些项目都建立在VS2008中。

项目文件夹布局

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

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

将此行添加到第一行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、缓存、suo 和用户文件/文件夹,没有区别。

任何可以提供帮助的 msbuild 专家吗?

谢谢,

J1M。

更新1

如果我替换这一行:

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

有了这条线:

<LinqToXsdBinDir>$(MSBuildProjectDirectory)\..\LinqToXsd</LinqToXsdBinDir>

在 ConfigTool 和 BL 项目文件中,我不再收到关于 LinqToXsd 在编译 BL 时找不到的错误,尽管它找不到已编译的 BL dll。

解决方案

首先,SolutionDir 仅由 VS2008 定义,而不是 MSBUILD 似乎。您可以在命令行上传递它,但我选择执行以下操作:

<LinqToXsdBinDir>$(MSBuildProjectDirectory)\..\LinqToXsd</LinqToXsdBinDir>

MSBuildProjectDirectory在 VS 和 MSBUILD 中都定义了。

二、不同的问题导致相同的症状(不知道为什么)

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

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

我只是在随机的 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 回答