如何在Visual Studio 2010中将变量传递给MSBuild?

4
我已经创建了一个定制的msbuild deploy.targets文件,使我能够将生成的二进制文件发布到我在命令行中指定的目录。这意味着如果我运行以下命令: $>msbuild /p:DestServer=\myserver\final-dest
然后我的项目将被编译,并且生成的*.dll文件将被复制到一个暂存实例 - 在这种情况下是myserver上的final-dest目录。我需要这个功能,因为当我做一个好的编译时,我希望在那个目录中有一个*.dll文件的副本,但我也希望它们在本地。
这里是我的问题 - 我真的不想从命令行发出这个命令。当我选择发布版本构建配置(项目|属性|构建)时,我希望能够将/p:DestServer=\myserver\final-dest指定为msbuild将在其正常构建时使用的参数。我要在哪里指定它?
在项目属性|构建事件中,我可以指定预构建或后构建事件,但这不是"构建的一部分"吗?
理想情况下,如果有人能给我Visual Studio 2010中的菜单序列,我会很感激。
2个回答

4
如果您不想编辑项目文件,还有另一种解决方案。
每个*.csproj文件都包含以下内容:<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
在我的电脑和.Net 4.0上,该文件位于"C:\Windows\Microsoft.NET\Framework\v4.0.30319\Microsoft.CSharp.targets"Project中添加新的PropertyGroup
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
...
 <PropertyGroup>  
    <DestServer>\myserver\final-dest</DestServer>
  </PropertyGroup>
...
<!-- a lot of stuff -->
...
</Project>

您的所有构建(无论是来自MSBuild还是Visual Studio)现在将使用此属性,因此您不需要修改.csproj或从命令行传递参数。
更新:
这是一种快速而粗略的方法,因为它将覆盖在该PC上构建的所有项目。只有在有许多项目且您没有权限修改它们时才执行此操作。
通常,您只需在单个项目中添加一个新的PropertyGroup即可。
如果有许多项目需要此变量,则可以创建并导入您的自定义扩展目标到默认目标下面。
App1.csproj
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
...
  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
  <Import Project="..\myCustom.targets" />
...
</Project>

and

myCustom.targets

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <PropertyGroup>  
    <DestServer>\myserver\final-dest</DestServer>
  </PropertyGroup>
</Project>

2
那么这个变量不在源代码控制中,甚至不在源代码树中,并且适用于在此计算机上构建的每个项目?在我看来,这不是一个好主意,也许作为一个快速的hack可以。您不想直接编辑项目文件的原因是什么? - Roman Starkov
我有50多个启用了代码合同的项目,这是在我的本地PC上快速禁用它的唯一方法。修改所有这些项目的所有配置和几个分支是一件痛苦的事情。 - Gleb Sevruk
好的。 - Roman Starkov

1

我不知道有没有通过VisualStudio GUI设置这个属性的方法(可能确实没有),但是你应该可以编辑你的.csproj/.vcproj文件,将该属性添加到适当的配置中:

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <PropertyGroup>
    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
    <ProductVersion>9.0.30729</ProductVersion>
    ...
    ...etc
    ...
  </PropertyGroup>
  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
    <DestServer>\myserver\final-dest</DestServer>   <!-- <<<<< HERE <<<<< -->
    ...

即使您通过GUI编辑其他属性,Visual Studio也会保留此属性(至少它倾向于这样做...)


那么,有没有办法指定多个属性组,然后根据活动构建配置选择一个属性组呢? - Affable Geek
@AffableGeek每个平台/配置组合已经有一个属性组,因此您只需在相关位置插入您的属性即可。或者,为了避免重复,您可以创建一个完全独立的PropertyGroup,其中包含所需的条件,例如 Condition=" '$(Configuration)' == 'Release' " - Roman Starkov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接