【问题标题】:Zip files after build completes in Visual Studio在 Visual Studio 中构建完成后的 Zip 文件
【发布时间】:2014-05-07 17:58:04
【问题描述】:

我有一个需求,我需要在构建解决方案文件后压缩一些文件。

在发布/调试模式下构建项目后,这是否可以自动实现?

【问题讨论】:

标签: c# visual-studio visual-studio-2012 msbuild


【解决方案1】:

仅在发布版本时使用 powershell:
if $(ConfigurationName) == Release (powershell Compress-Archive -Path '$(TargetDir)*.dll', '$(TargetDir)*.pdb', '$(TargetDir)*.config' -DestinationPath '$(SolutionDir)PublishOutput\YourNameHere.zip' -Force)

它只压缩 dll、pdb 和配置文件。
-Force 用于在每次构建时覆盖 zip 文件。

【讨论】:

  • 不幸的是,如果输出文件夹不存在,Force 不会创建它。稍微改进的版本: if $(ConfigurationName) == Debug (powershell.exe -Command $null=mkdir '$(SolutionDir)PublishOutput'; Compress-Archive -CompressionLevel Optimal -Path '$(TargetDir)*.dll', ' $(TargetDir)*.pdb', '$(TargetDir)*.config' -DestinationPath '$(SolutionDir)PublishOutput\$(ProjectName).zip' -Force)
  • 将此命令添加到 Visual Studio 项目生成事件属性中的“生成后事件命令行”框中。最初的“if”需要仅用于“Release”配置,因为VS在所有配置中都执行该命令。
【解决方案2】:

通常我不会将创建 zip 文件、安装程序、NuGet 包等内容放入我的实际项目中。
为什么?因为当我把它放在那里时,它会被执行每次我在 Visual Studio 中构建项目,例如在调试时。
但是 zip 文件、安装程序等仅在发布时才需要,因此我不想等待每次在 Visual Studio 中按 F5 时重新生成它们。

为了发布,我通常会创建一个批处理文件来执行 MSBuild project file,它会创建发布所需的所有内容。
IMO 创建 ZIP 文件也属于该 MSBuild 项目文件。

您可以在我之前的这两个答案中找到您需要的所有信息:

另外,here's an example MSBuild project file 来自我的一个项目,它执行以下操作:

  • 构建项目
  • 运行单元测试
  • 创建两个包含二进制文件的发布文件夹(一个 DLL 和一个 .exe)
  • 创建两个 zip 文件,每个文件夹一个包含二进制文件
  • 为 DLL 创建 NuGet 包
  • 为 .exe 创建 ClickOnce 设置
  • 自动为所有内容设置正确的版本号

这种方法的好处是我可以通过单击(运行批处理文件)来发布,其中包括我刚刚列出的所有内容。
创建所有这些东西需要一些时间,但由于它不是 Visual Studio 解决方案的一部分,所以每次我在 Visual Studio 中构建时它都不会运行 - 我只在真正需要时执行它。

【讨论】:

  • 或者使用更简单的方法将其放在构建后事件中,并且仅在运行发布构建配置时执行发布所需的步骤...您仍然可以从命令行执行此构建,所以使用后期构建并没有任何缺点,只要你正确地实现它。
  • 很抱歉让这匹死马复活,但您也可以只创建一个名为 Deploy 的新目标。所以基本上,你会有 Debug、Release 和 Deploy。其中 Deploy 是 Release 的变体,添加了额外的步骤。
  • 我的回答是基于我个人的喜好,所以先提他们是有道理的,这样人们就知道我为什么这样做了。如果您的个人偏好与我的不同,请随时添加其他答案。
【解决方案3】:

转到项目的属性,然后在“构建事件”选项卡中的“构建后”事件区域中写入您的命令。那里的命令就像(或作为)一个 Cmd 批处理文件一样执行。

另外:那里有一些“makros”可用,这可能有助于参考项目文件夹等。检查一下。

而且,要添加到 Jason 的评论中,您还可以将批处理文件本身称为构建后命令。

(关于构建后事件的一个警告:它们在构建之后执行。但如果您有 CSC 目标,它们将在构建之后编译在构建后事件之后。如果您想例如复制这些 CSC 目标的输出文件,您需要在 post-compile 事件中执行此操作。)

【讨论】:

  • +1。您将需要一个可以调用的 zip 实用程序,例如 7zip,然后只需将 7zip 的命令行添加到构建后脚本。您可以在 dos 框中单独解决此问题,然后在其工作后将最终命令复制到您的构建后事件中。
  • @JasonWilliams - Visual Studio 中是否没有默认的压缩功能?让所有开发人员都有一个 7zip 或 winzip 并且它的路径在正确的文件夹中是不可扩展的。
  • @Chandra 不,不是内置于 vs。但是 7zip 是一个单独的 exe 文件,因此您可以轻松地将其签入源代码控制并编写您的后期构建以使用该特定位置来保证每个开发人员拥有正确版本的工具来获得有效且一致的构建。
  • @bschandramohan 如果您使用 PowerShell,Compress-Archive 命令为您提供压缩功能。可以从构建事件启动 PowerShell 脚本。
【解决方案4】:

这对我有用:

if $(ConfigurationName) == Debug (powershell -Command "Get-ChildItem -Path '$(TargetDir)publish' -Recurse|Compress-Archive -DestinationPath '$(SolutionDir)PublishOutput\$(ProjectName)-$(ConfigurationName).zip' -Force")

【讨论】:

    【解决方案5】:
    1. 右击项目=>选择属性

    2. 点击构建事件

    3. 在构建后事件命令行中添加以下代码

      if exist $(AssemblyName).zip (  Del $(AssemblyName).zip)
      powershell.exe -command Compress-Archive -Path $(AssemblyName).dll, *dll -DestinationPath $(AssemblyName).zip
      
    4. 它将在“bin/release”文件夹中生成所有.dll的zip文件

    【讨论】:

      猜你喜欢
      • 2023-03-24
      • 2016-02-14
      • 2013-07-02
      • 2018-04-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-24
      相关资源
      最近更新 更多