2012-01-04 47 views
2

我已经构建了一个自定义的msbuild deploy.targets文件,它允许我将生成的二进制文件发布到我在命令行中指定的目录。这也就意味着,如果我跑如何获取Visual Studio 2010将变量传递给MSBuild?

$>的MSBuild/P:DestServer = \ MYSERVER \最终-DEST

然后我的项目将被编译,得到的* .DLL文件将被复制到一个临时实例 - 在这种情况下,myserver上的目录是final-dest。我想要这个功能,因为当我做一个好的编译时,我需要在该目录中的* .dlls的副本,但我也希望它们是本地的。

这是我的问题 - 我真的很想不必从命令行发出这个问题。当我选择发布构建配置(Project | Properties | Build)时,我希望能够指定/ p:DestServer = \ myserver \ final-dest作为参数,msbuild将使用,因为它的常规构建

我该在哪里指定?

在项目属性|构建事件,我可以指定预构建或事后构建事件 - 但这不是“构建”事件的一部分?理想情况下,如果有人可以给我在Visual Studio 2010中的菜单顺序,我会很感激。

回答

3

如果你不想编辑项目文件 - 有是另一种解决方案

每个* .csproj文件包含:<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />

在我的电脑和.NET 4.0这个文件位于"C:\Windows\Microsoft.NET\Framework\v4.0.30319\Microsoft.CSharp.targets"

添加新PropertyGroupProject,如:

<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> 

myCustom.targets

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

所以这个变量不在源代码控制中,即使在源代码树中,并且适用于本机上构建的每个单个项目?不是一个好主意海事组织,或许可以作为一个快速入侵......任何你不想编辑项目文件的原因? – 2014-05-20 16:03:54

+0

我有50多个项目启用了Code Contracts,这是在我的本地PC上快速禁用它的唯一方法。在所有配置和几个分支中修改所有这些项目是一件痛苦的事情。 – 2014-05-21 11:03:20

+0

[足够公平](http://meta.stackexchange.com/questions/700/can-we-get-rid-of-the-threshold-of-15-chars-for-comments) – 2014-05-21 13:38:02

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 <<<<< --> 
    ... 

Visual Studio将保持这种就算你通过GUI编辑其他特性(至少趋于 ...)

+0

那么,有没有办法再指定多个属性组,然后根据活动构建配置的属性组选择? – 2012-01-05 11:41:48

+0

@AffableGeek每个平台/配置组合已经有一个属性组,所以你可以在相关的地方插入你的属性。另外,为了避免重复你自己,你可以创建一个完全独立的PropertyGroup,它具有你所需要的条件,比如'Condition =''$(Configuration)'=='Release'“' – 2012-01-05 11:46:06