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

Aff*_*eek 4 msbuild visual-studio

我已经构建了一个自定义 msbuild deploy.targets 文件,该文件允许我将生成的二进制文件发布到我在命令行中指定的目录中。这意味着如果我跑

$>msbuild /p:DestServer=\myserver\final-dest

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

这是我的问题 - 我真的不想从命令行发出它。当我选择发布构建配置(项目 | 属性 | 构建)时,我希望能够将 /p:DestServer=\myserver\final-dest 指定为 msbuild 将在正常构建时使用的参数。

我在哪里指定这个?

在项目属性 | 构建事件,我可以指定构建前或构建后事件——但这不是“构建的一部分”事件吗?

理想情况下,如果有人能给我 Visual Studio 2010 中的菜单序列,我将不胜感激。

Gle*_*ruk 5

如果您不想编辑项目文件 - 还有另一种解决方案。

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

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

添加新的PropertyGroup内部,Project如:

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
...
 <PropertyGroup>  
    <DestServer>\myserver\final-dest</DestServer>
  </PropertyGroup>
...
<!-- a lot of stuff -->
...
</Project>
Run Code Online (Sandbox Code Playgroud)

您现在的所有构建(来自 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>
Run Code Online (Sandbox Code Playgroud)

myCustom.targets

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <PropertyGroup>  
    <DestServer>\myserver\final-dest</DestServer>
  </PropertyGroup>
</Project>
Run Code Online (Sandbox Code Playgroud)

  • 所以这个变量不在源代码管理中,甚至不在源代码树中,并且适用于在这台机器上构建的每个项目?IMO 不是一个好主意,也许可以作为一个快速的 hack ......你不想只编辑项目文件的任何理由? (2认同)