如何使用Visual Studio 2012中的MSBuild文件?

时间:2013-04-25 18:45:09

标签: visual-studio visual-studio-2012 msbuild build-automation

我有一个简单的MSBuild文件,我正在学习。

这是:

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" DefaultTargets="Clean" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <PropertyGroup Label="Globals">
    <ProjectGuid>{D5A16164-962E-4A6D-9382-240F31AB6C50}</ProjectGuid>
  </PropertyGroup>
  <Target Name="Clean">
    <ItemGroup>
      <BinFiles Include="bin\*.*" />
      <fff Include="f\*.*" />
    </ItemGroup>
    <Delete Files="@(BinFiles)" />
    <Delete Files="@(fff)" />
  </Target>
</Project>

现在我希望将它包含在Visual Studio解决方案中,并能够从Visual Studio 2012运行“干净”目标。我尝试将其命名为testproject.msbuildproj,就像互联网似乎建议“工作”一样,但它不起作用。当我运行clean命令时,我得到“意外错误”。

如果我将项目重命名为testproject.csproj,它会执行一些非直观的操作,例如创建编译目录,但它确实可以正确运行我的清洁命令。但是,这是不可取的,因为它会创建objbin/x86/debug类型目录。它在Visual Studio中看起来也很傻,因为它仍然会提供引用下拉。

如何在没有随机错误或错误假设的情况下使用Visual Studio中的普通vanilla MSBuild项目?

注意我在Visual Studio中遇到此问题。从命令行使用msbuild它可以很好地工作

1 个答案:

答案 0 :(得分:2)

Visual Studio在打开 csproj文件时创建bin / obj文件夹。单击“构建/重建/清理”时,只需使用项目文件中的相应目标。

您无法阻止VS创建这些文件夹,但您可以通过设置相应的属性让它在say temp文件夹中创建它们 - 有关详细信息,请参阅this MSDN article

所以步骤是将项目重命名为csproj,并将以下行添加到项目中:

<PropertyGroup>
  <OutputPath>$(Temp)\bin</OutputPath>
  <IntermediateOutputPath>$(Temp)\obj</IntermediateOutputPath>
</PropertyGroup>

我通常使用一种不同的方法来处理来自VS的MSBUILD文件:

  • 我使用已删除csproj部分的常规Import ... CSharp.targets文件作为我的Build项目的纯容器。
  • 我使用“包含到项目中”添加了包含目标和逻辑的实际构建文件,以及所有属性,XSLT等必要的工件,因此我可以管理层次结构并从VS.Net中更改任何文件。
  • 我在Build文件中重新定义了Rebuild / csproj个目标,无论我需要什么,例如,Build可能包含最小输出,还有重建诊断时。

像这样:

<Target Name="Build">
  <Exec Command="%windir%\Microsoft.NET\Framework64\v4.0.30319\msbuild.exe Builds\build.proj /t:Build /v:m" />
</Target>
<Target Name="Rebuild">
  <Exec Command="%windir%\Microsoft.NET\Framework64\v4.0.30319\msbuild.exe Builds\build.proj /t:Build /v:d" />
</Target>