用 msbuild 开关覆盖 proj 属性

Overwrite proj property with msbuild switch

给定以下项目片段:

<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.0\bin\MSBuild.exe"

我手头没有 Windows 机器,否则我就试试这个。

是的,您可以像那样覆盖 属性。但是,您需要在调用的命令两边加上引号,因为它包含空格。 msbuild 中的转义引号是 $quot; 另外一个更 msbuild 的方法是不要重复你自己并将你想要构建的两个配置放在一个 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