Post-使用 IAddInPostDeploymentAction class 发布 VSTO 加载项的操作?
Post-publish action for VSTO add-in with IAddInPostDeploymentAction class?
我有一个与 excel 模板 (.xlt) 应用程序关联的文档级自定义。该解决方案包括一个 post 操作 class,可将模板副本放置在 excel 用户模板 (Application.TemplatesPath
) 的默认位置。
有一个 manual process 需要完成,post 发布,以便完成这项工作,我已在 powershell 脚本中自动完成。
我发布解决方案后...
我想要 运行 脚本来集成 postAction 并重新签署清单。
有什么办法吗?
我终于想通了。
首先,我必须了解 MSBuild 周围的配置问题...
配置飞溅
- .csproj 文件汇集了驱动 MSBuild 的配置 XML。
- 这包括称为
Targets
的东西,它们是可执行的构建块
Targets
是 而不是 按照它们被解析的顺序执行。事实上,它们根本不会执行,除非它们以某种方式绑定到 MSBuild 的预定义目标。
Targets
使用它们的 AfterTargets
、BeforeTargets
和 DependsOnTargets
可选属性绑定到构建过程。
- 有大量可用的预定义值,包括目标环境变量和关键文件名和路径,它们从配置文件中渗出。
- csproj 文件有
Import
个元素,这些元素从系统 .target
和 .props
文件中引入了大量预定义元素和元数据。
- 您可以创建自己的
.target
文件并导入它们。它们与导入文件具有相同的执行上下文。
- 有一个特殊的
Targets
文件负责 VSTO 构建和发布过程:$(VSToolsPath)\OfficeTools\Microsoft.VisualStudio.Tools.Office.targets
您可以在其中看到发布 Targets
。
- 我需要的
Target
是BeforePublish
。如果我将构建输出调高到 "detailed",我可以看到在此之后唯一发生的事情是分发文件从临时构建位置移动到发布文件夹。在此过程中,清单会更新以反映在重新签名之前对路径的更改。所以我通过它的 AfterTargets
属性将我的自定义 post-publish Target
链接起来,并利用项目目录结构中临时构建位置的便利。
- 在我的 post-action 命令行版本中,我在发布文件夹位置操作,因此我调整它以在临时位置查找文件。
发布构建的最后步骤
为了四处看看,我在 .csproj 文件的末尾添加了这个标记(在 Project 标签内)。
<Target Name="AfterPublish">
<Message Text="After Publish >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>" />
</Target>
<Target Name="DisplayMessages" AfterTargets="PublishOnly">
<Message Text="After PublishOnly in project.csproj>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>" />
</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 脚本伪造)
为了调用我的 post-publish 脚本,我首先创建了一个名为 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>"& { &'$(ScriptLocation)' '$(PostAction)' $(Configuration)} "</Arguments>
<LogFile >PostAction.log</LogFile>
<LogFile Condition="Exists('$(MSBuildProjectDirectory)\Logs')">.\Logs$(LogFile)</LogFile>
</PropertyGroup>
<Exec Command="$(PowerShellExe) $(Switches) -command $(Arguments) > $(LogFile)" />
</Target>
</Project>
(我将其通过管道传输到项目子目录中的日志文件)
然后我在 .csproj 文件中添加了一个导入元素
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<Import Project="$(VSToolsPath)\OfficeTools\Microsoft.VisualStudio.Tools.Office.targets" Condition="'$(VSToolsPath)' != ''" />
<Import Project=".\OfficeTools\PostAction.targets" />
我把它和其他 Import 元素放在同一个地方,如果我把它放在最后是行不通的。
就是这样。现在我的 post-publish 脚本在我执行的每个发布构建结束时运行,并且 postsAction 部分被添加到当前版本的应用程序清单中,并且它和部署清单重新签名正确的证书。
我有一个与 excel 模板 (.xlt) 应用程序关联的文档级自定义。该解决方案包括一个 post 操作 class,可将模板副本放置在 excel 用户模板 (Application.TemplatesPath
) 的默认位置。
有一个 manual process 需要完成,post 发布,以便完成这项工作,我已在 powershell 脚本中自动完成。
我发布解决方案后...
我想要 运行 脚本来集成 postAction 并重新签署清单。
有什么办法吗?
我终于想通了。
首先,我必须了解 MSBuild 周围的配置问题...
配置飞溅
- .csproj 文件汇集了驱动 MSBuild 的配置 XML。
- 这包括称为
Targets
的东西,它们是可执行的构建块 Targets
是 而不是 按照它们被解析的顺序执行。事实上,它们根本不会执行,除非它们以某种方式绑定到 MSBuild 的预定义目标。Targets
使用它们的AfterTargets
、BeforeTargets
和DependsOnTargets
可选属性绑定到构建过程。- 有大量可用的预定义值,包括目标环境变量和关键文件名和路径,它们从配置文件中渗出。
- csproj 文件有
Import
个元素,这些元素从系统.target
和.props
文件中引入了大量预定义元素和元数据。 - 您可以创建自己的
.target
文件并导入它们。它们与导入文件具有相同的执行上下文。 - 有一个特殊的
Targets
文件负责 VSTO 构建和发布过程:$(VSToolsPath)\OfficeTools\Microsoft.VisualStudio.Tools.Office.targets
您可以在其中看到发布Targets
。 - 我需要的
Target
是BeforePublish
。如果我将构建输出调高到 "detailed",我可以看到在此之后唯一发生的事情是分发文件从临时构建位置移动到发布文件夹。在此过程中,清单会更新以反映在重新签名之前对路径的更改。所以我通过它的AfterTargets
属性将我的自定义 post-publishTarget
链接起来,并利用项目目录结构中临时构建位置的便利。 - 在我的 post-action 命令行版本中,我在发布文件夹位置操作,因此我调整它以在临时位置查找文件。
发布构建的最后步骤
为了四处看看,我在 .csproj 文件的末尾添加了这个标记(在 Project 标签内)。
<Target Name="AfterPublish">
<Message Text="After Publish >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>" />
</Target>
<Target Name="DisplayMessages" AfterTargets="PublishOnly">
<Message Text="After PublishOnly in project.csproj>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>" />
</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 脚本伪造)
为了调用我的 post-publish 脚本,我首先创建了一个名为 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>"& { &'$(ScriptLocation)' '$(PostAction)' $(Configuration)} "</Arguments>
<LogFile >PostAction.log</LogFile>
<LogFile Condition="Exists('$(MSBuildProjectDirectory)\Logs')">.\Logs$(LogFile)</LogFile>
</PropertyGroup>
<Exec Command="$(PowerShellExe) $(Switches) -command $(Arguments) > $(LogFile)" />
</Target>
</Project>
(我将其通过管道传输到项目子目录中的日志文件)
然后我在 .csproj 文件中添加了一个导入元素
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<Import Project="$(VSToolsPath)\OfficeTools\Microsoft.VisualStudio.Tools.Office.targets" Condition="'$(VSToolsPath)' != ''" />
<Import Project=".\OfficeTools\PostAction.targets" />
我把它和其他 Import 元素放在同一个地方,如果我把它放在最后是行不通的。
就是这样。现在我的 post-publish 脚本在我执行的每个发布构建结束时运行,并且 postsAction 部分被添加到当前版本的应用程序清单中,并且它和部署清单重新签名正确的证书。