【问题标题】:How to get Visual Studio build process to create a distributable directory?如何获取 Visual Studio 构建过程以创建可分发目录?
【发布时间】: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


【解决方案1】:

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

如果您查看 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 上设置这些文件,就可以了。

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

在任何情况下,我都会查看 Microsoft.Common.Targets 文件以了解它在做什么。如果您在文本编辑器中查看 csproj 文件本身,您可以看到它在哪里导入 Microsoft.Common.Targets。这将帮助您更好地了解整个 MSBuild 过程。

【讨论】:

  • 谢谢,这看起来很有希望。但有一件事,我没有看到我的 csproj 文件导入 Microsoft.Common.Targets。相反,它看起来只导入 Microsoft.Common.Props。另外,您是否知道 $(MSBuildThisFile)\ImportBefore 文件夹的位置?我沿着 $(MSBuildThisFile) 部分的路径...
  • 我相信 Microsoft.Comon.Targets 被包含在您的 csproj 文件中的 Microsoft.CSharp.targets 文件中。至于 $(MSBuildThisFile),请查看 MSDN 上的此链接,了解所有知名属性的细分:msdn.microsoft.com/en-us/library/…
猜你喜欢
  • 2016-07-02
  • 1970-01-01
  • 2019-02-23
  • 2010-09-29
  • 2021-01-19
  • 2016-12-17
  • 2012-02-06
  • 2015-11-24
相关资源
最近更新 更多