用msbuild开关覆盖proj属性

时间:2015-02-20 11:58:50

标签: .net msbuild

给出以下proj片段:

<Project DefaultTargets="artifacts" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    <PropertyGroup>
        <msbuild40>"msbuild.exe"</msbuild40>
    </PropertyGroup>

    <Target Name="compile">
        <Exec Command="$(msbuild40) src\ClientFrameworkLoader.sln /t:Build /p:Configuration=Debug;platform=win32" />
        <Exec Command="$(msbuild40) src\ClientFrameworkLoader.sln /t:Build /p:Configuration=Release;platform=win32" />
    </Target>
</Project>
我正确地认为我可以使用以下命令覆盖msbuild40属性吗?

MSBuild.exe snippet.proj /p:msbuild40="C:\Program Files (x86)\MSBuild\12.0\bin\MSBuild.exe"

我现在没有Windows机器,否则我只是试试这个。

1 个答案:

答案 0 :(得分:1)

是的,你可以覆盖这样的属性。但是,您需要在调用的命令周围加上引号,因为它包含空格。 msbuild中的转义引用是$quot;另外一种更简单的构建方式是不重复自己并将要构建的两个配置放在一个ItemGroup中并循环它。应用这些修改可以得到:

<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="artifacts" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <PropertyGroup>
    <msbuild40>"msbuild.exe"</msbuild40>
  </PropertyGroup>

  <ItemGroup>
    <Configurations Include="Debug;Release"/>
  </ItemGroup>

  <Target Name="compile">
    <Exec Command="&quot;$(msbuild40)&quot; src\ClientFrameworkLoader.sln /t:Build /p:Configuration=%(Configurations.Identity);platform=win32" />
  </Target>
</Project>

据说在将它发送到野外之前在Windows机器上进行测试可能是明智之举:P