4

我有一个正在学习的简单 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,它会做一些不直观的事情,比如创建编译目录,但它确实会正确运行我的 clean 命令。但是,这是不可取的,因为它会创建objbin/x86/debug键入目录。它在 Visual Studio 中看起来也很愚蠢,因为它仍然提供了“引用”下拉菜单。

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

注意我只是在 Visual Studio 中遇到了这个问题。从命令行使用 msbuild 它可以完美运行

4

1 回答 1

2

Visual Studio 在打开csproj 文件时会创建 bin / obj 文件夹。当您单击 Build / Rebuild / Clean 时,它只使用项目文件中的适当目标。

您无法阻止 VS 创建这些文件夹,但您可以通过设置适当的属性要求它在临时文件夹中创建它们 - 有关详细信息,请参阅此 MSDN 文章

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

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

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

  • csproj我使用带有删除部分的常规文件Import ... CSharp.targets作为构建项目的纯容器。
  • 我使用“包含到项目”添加带有目标和逻辑的实际构建文件,以及所有属性、必要的工件(如 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>
于 2013-04-26T12:18:56.447 回答