如何覆盖配置属性?

时间:2012-01-08 23:15:09

标签: msbuild-4.0

我正在尝试在.Net v4.0上进行发布和调试构建,其中我有一个MSBuild项目文件而不是解决方案文件。我想使用相同的构建项目文件,但只是覆盖“调试”和“发布”之间的配置属性切换。

当我按如下方式执行时

c:\windows\microsoft.net\framework\v4.0.30319\msbuild.exe buildinv.proj
/target:rebuild "/property:Configuration=Debug" /verbosity:Diagnostic

我收到以下错误

c:\Windows\Microsoft.NET\Framework\v4.0.30319\Microsoft.Common.targets(483,9):
error : The OutputPath property is not set for project
'buildinv.proj'.  Please check to make sure that you have specified a
valid combination of Configuration and Platform for this project. 
Configuration='Debug'  Platform=''.

我可以看到错误发生在_CheckForInvalidConfigurationAndPlatform

如果我传递一个OutputPath属性,它将起作用

c:\windows\microsoft.net\framework\v4.0.30319\msbuild.exe buildinv.proj
/target:rebuild "/property:Configuration=Debug" "/property:OutputPath=."

这是一个已知的错误吗?在我需要覆盖Configuration属性的地方,即使我不希望,我也会被迫覆盖OutputPath属性。

提前致谢。

3 个答案:

答案 0 :(得分:4)

在我的项目文件中,OutputPath属性在为每个配置和放大器指定的属性组中定义。平台。如果未设置正确的Platform,则不会设置OutputPath属性,并且构建将失败。

<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
  <OutputPath>bin\Debug\</OutputPath>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
    <OutputPath>bin\Release\</OutputPath>
</PropertyGroup>

将Platform属性添加到命令行中:

c:\windows\microsoft.net\framework\v4.0.30319\msbuild.exe buildinv.proj /target:rebuild "/property:Configuration=Debug;Platform=AnyCPU" /verbosity:Diagnostic

答案 1 :(得分:2)

如果您不想修改项目文件,也可以在命令中为构建指定OutputPath:

c:\windows\microsoft.net\framework\v4.0.30319\msbuild.exe buildinv.proj /target:rebuild "/property:Configuration=Debug;OutputPath=C:\MyOutputPath" /verbosity:Diagnostic

答案 2 :(得分:1)

将以下内容之一添加到项目文件中。错误意味着 OutputPath 环境变量没有得到它的值。通过从PropertyGroup中删除“Condition =”,默认情况下将始终为任何平台或配置设置OutputPath。

<PropertyGroup>
  <OutputPath>bin\Debug\</OutputPath>
</PropertyGroup>

<PropertyGroup>
    <OutputPath>$(DefaultOutputDirectory)</OutputPath>
</PropertyGroup>