如何让Visual Studio构建过程创建可分发的目录?

时间:2015-05-14 16:07:19

标签: visual-studio visual-studio-2013 msbuild

我想自定义我的Visual Studio解决方案构建以自动创建带有dist的目录树 - > bin目录。 bin目录应该自动将所有二进制文件复制到它。

注意:解决方案有很多项目,所以我不想自定义项目构建,这应该在解决方案级别。

我已经尝试了两种解决方案:

1)修改每个项目文件以创建此dist目录树(如果它尚不存在)。对于我来说,为每个添加到解决方案的新项目修改项目文件似乎是多余的。

2)创建解决方案.targets文件,以便通过命令行与msbuild.exe一起使用。这完全按照我的意愿工作,但我更喜欢在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>

最后,我将更新解决方案本地的项目文件,以便仅在未创建分发目录时创建分发目录,然后将正在构建的当前项目的二进制文件复制到该可分发目录。

1 个答案:

答案 0 :(得分:0)

还需要一些额外的设置,但是一旦完成设置,它就适用于所有解决方案\项目。

如果您查看Microsoft.Common.Targets(位于C:\ Windows \ Microsoft.Net \ Framework(MSBuildVersion)中),您将看到它尝试导入许多自定义目标文件。您可以将自己的目标文件放在$(MSBuildExtensionsPath)\ $(MSBuildToolsVersion)\ $(MSBuildThisFile)\ ImportBefore \文件夹中,也可以在$(MSBuildExtensionsPath)\ v中创建Custom.Before.Microsoft.Common.targets文件$(MSBuildToolsVersion)文件夹。在自定义扩展中,您可以添加具有自定义复制命令的$(SolutionDir)Solution.targets导入。由于Microsoft.Common.Targets文件用于C#和C ++编译,因此所有项目类型都将加载自定义目标。只要您在所使用的所有PC上设置这些文件,就应该没问题。

另一种选择是使用自定义命令创建 {Your Project Name and extension} .user文件。此解决方案不需要修改MSBuild文件夹,但需要每个项目都有自己的文件。也就是说每个.user文件都可以加载一个带有复制命令的$(SolutionDir)\ Common.Targets文件。

在任何情况下,我都会查看Microsoft.Common.Targets文件以查看它在做什么。如果你在文本编辑器中查看csproj文件本身,你可以看到它导入Microsoft.Common.Targets的位置。这有助于您更好地了解MSBuild流程。