使用IAddInPostDeploymentAction类的VSTO加载项的发布后操作?

时间:2017-02-28 09:52:13

标签: visual-studio vsto

我有一个与Excel模板(.xlt)应用程序相关联的文档级自定义。该解决方案包括一个postAction类,可以在excel用户模板(Application.TemplatesPath)的默认位置删除模板的副本。

在发布后,需要完成manual process才能完成这项工作,我已经在PowerShell脚本中实现了自动化。

发布解决方案后......

enter image description here

我想运行脚本来集成postAction并重新签名清单。

有没有办法做到这一点?

1 个答案:

答案 0 :(得分:2)

我最终想通了。

首先,我必须了解MSBuild周围的配置信息......

配置信息

  1. .csproj文件将驱动MSBuild的配置XML拉到一起。
  2. 这包括名为Targets的东西,它们是可执行的构建块
  3. Targets 按解析顺序执行。实际上它们根本没有被执行,除非它们以某种方式绑定到MSBuild的预定义目标。
  4. Targets使用AfterTargetsBeforeTargetsDependsOnTargets可选属性与构建过程相关联。
  5. 有大量可用的预定义值,包括目标环境变量以及密钥文件名和路径,它们正在渗出配置信息。
  6. csproj文件包含Import元素,可从系统.target.props文件中引入大量预定义元素和元数据。
  7. 您可以创建自己的.target文件并导入它们。它们与导入文件具有相同的执行上下文。
  8. 有一个特殊的Targets文件负责VSTO构建和发布过程:$(VSToolsPath)\OfficeTools\Microsoft.VisualStudio.Tools.Office.targets,您可以在其中看到发布Targets
  9. 我需要的TargetBeforePublish。如果我将构建输出调到“详细”,我可以看到在此之后发生的唯一事情是分发文件从临时,构建位置移动到发布文件夹。在此过程中,更新清单以反映重新签名之前路径的更改。所以我通过它的Target属性链接了我自定义的发布后AfterTargets,并利用了项目目录结构中临时构建位置的便利。
  10. 在我在发布文件夹位置操作的后期操作的命令行版本中,因此我调整它以查找临时位置中的文件。
  11. 发布版本的最后步骤

    要浏览一下,我在.csproj文件的末尾添加了这个标记(在Project标记内)。

      <Target Name="AfterPublish">
        <Message Text="After Publish &gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;" />
      </Target>
      <Target Name="DisplayMessages" AfterTargets="PublishOnly">
        <Message Text="After PublishOnly in project.csproj&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;" />
      </Target>
    

    这是构建输出的结束......

    1>Task "SignFile"
    1>Done executing task "SignFile".
    
    1>Done building target "CreateBootstrapper" in project "WeekEndingTabs.csproj".
    
    1>Target "AfterPublish" in project "<MSBuildProjectFullPath>\project.csproj" (target "PublishOnly" depends on it):
    1>Task "Message"
    1>  After Publish >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
    1>Done executing task "Message".
    1>Done building target "AfterPublish" in project "project.csproj".
    
    1>Target "PublishOnly" in file "<path to Microsoft.VisualStudio.Tools.Office.targets>" from project "path to project.csproj" (entry point):
    1>Done building target "PublishOnly" in project "project.csproj".
    
    1>Target "DisplayMessages" in project "path to project.csproj" (entry point):
    1>Task "Message"
    1>  After PublishOnly >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
    1>Done executing task "Message".
    1>Done building target "DisplayMessages" in project "project.csproj".
    1>
    1>Build succeeded.
    

    自定义任务(伪造PowerShell脚本)

    为了调用我的发布后脚本,我首先创建了一个名为postAction.targets的自定义.targets文件并将其放入其中...

    <?xml version="1.0" encoding="Windows-1252"?>
    
    <Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    
      <Target Name="EstablishLogDir" Condition="!Exists('$(MSBuildProjectDirectory)\Logs')">
        <MakeDir Directories=".\Logs"/>
      </Target>
    
      <Target Name="AddPostAction" AfterTargets="PublishOnly" DependsOnTargets="EstablishLogDir">
        <PropertyGroup>
          <PowerShellExe Condition=" '$(PowerShellExe)'=='' ">%WINDIR%\System32\WindowsPowerShell\v1.0\powershell.exe</PowerShellExe>
          <ScriptLocation Condition=" '$(ScriptLocation)'=='' ">C:\Users\Admin\Documents\GitHub\powershell-scripts\postAction-MSBuild.ps1</ScriptLocation>
          <Switches>-NonInteractive -executionpolicy Unrestricted</Switches>
          <PostAction>FileCopyPDA.FileCopyPDA</PostAction>
          <Arguments>&quot;&amp; { &amp;&apos;$(ScriptLocation)&apos; &apos;$(PostAction)&apos; $(Configuration)} &quot;</Arguments>
          <LogFile >PostAction.log</LogFile>
          <LogFile Condition="Exists('$(MSBuildProjectDirectory)\Logs')">.\Logs\$(LogFile)</LogFile>
        </PropertyGroup>
        <Exec Command="$(PowerShellExe) $(Switches) -command $(Arguments) &gt; $(LogFile)" />
      </Target>
    
    </Project>
    

    (我把它管道到项目子目录中的日志文件中)

    然后我在.csproj文件中添加了一个import元素

      <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
      <Import Project="$(VSToolsPath)\OfficeTools\Microsoft.VisualStudio.Tools.Office.targets" Condition="'$(VSToolsPath)' != ''" />
      <Import Project=".\OfficeTools\PostAction.targets" />
    

    我把它放在与其他导入元素相同的位置,如果我最后只是粘贴它就不起作用。

    就是这样。现在,我的发布后脚本在每个Publish构建结束时运行,postsAction部分被添加到当前版本的应用程序清单中,并且使用正确的证书重新签署部署清单。