我有一个简单的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
,它会执行一些非直观的操作,例如创建编译目录,但它确实可以正确运行我的清洁命令。但是,这是不可取的,因为它会创建obj
和bin/x86/debug
类型目录。它在Visual Studio中看起来也很傻,因为它仍然会提供引用下拉。
如何在没有随机错误或错误假设的情况下使用Visual Studio中的普通vanilla MSBuild项目?
注意我在Visual Studio中遇到此问题。从命令行使用msbuild它可以很好地工作
答案 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项目的纯容器。 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>