【发布时间】:2015-07-26 08:18:04
【问题描述】:
我想自定义我的 Visual Studio 解决方案构建以自动创建具有 dist -> bin 目录的目录树。 bin 目录应该自动将所有二进制文件复制到其中。
注意:解决方案有很多项目,所以我不想自定义项目构建,这应该在解决方案级别。
我已经尝试了两种解决方案:
1) 修改每个项目文件以创建此 dist 目录树(如果它尚不存在)。对于添加到解决方案中的每个新项目,要求我修改项目文件似乎是多余的。
2) 通过命令行创建了用于 msbuild.exe 的解决方案 .targets 文件。这完全符合我的要求,但我更喜欢在 Visual Studio 中工作的解决方案。
如果有人关心,动机是有一种简单的方法来分发新构建,而不必每次都从中提取源代码。
更新:2015 年 5 月 26 日
我想在这里发布我的解决方案,以便有相同问题的人有解决方案。我最终在与我的解决方案文件相同的目录中创建了一个 ImportBefore 目录。在与解决方案相同的目录中,解决方案中包含的每个项目都有一个目录。这是 Visual Studio 解决方案的标准结构,该结构很重要,因为 msbuild 每个项目只有一个参考变量。
在 $(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\$(MSBuildThisFile)\ImportBefore\ 中放置一个包含以下内容的文件
在我的机器上,它位于 C:\Program Files (x86)\MSBuild\12.0\Microsoft.Common.Targets\ImportBefore
我的文件“importbefore.targets”如下所示:
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<ImportPath Condition="'$(ImportPath)'==''">$(MSBuildProjectDirectory)\..\ImportBefore</ImportPath>
</PropertyGroup>
<Import Project="$(ImportPath)\*" Condition="'$(ImportByWildcardBeforeMicrosoftCSharpTargets)' == 'true' and exists('$(ImportPath)')"/>
</Project>
为了测试这是否有效,我将以下目标文件添加到 \ImportBefore 或我的计算机 C:\Users\admin\Dropbox\Projects\BuildTestProject\ImportBefore
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Target Name="OnlyIfExists" BeforeTargets="Build" Condition="Exists('$(ImportPath)')">
<Message Text="Found import directory '$(ImportPath)'" Importance="high" />
</Target>
</Project>
最后,我将更新解决方案本地的项目文件以仅在未创建分发目录时创建分发目录,然后将正在构建的当前项目的二进制文件复制到该可分发目录。
【问题讨论】:
-
为添加到解决方案中的每个新项目修改项目文件无论如何,您都必须这样做才能设置构建选项,这似乎也是导入 msbuild 文件的一项小工作您可以在其中添加一个构建后目标来进行复制(甚至可以编写一个工具来为您执行此操作)。否则你可以使用类似stackoverflow.com/questions/3924404/…
标签: visual-studio visual-studio-2013 msbuild