我有一个与Excel模板(.xlt)应用程序相关联的文档级自定义。该解决方案包括一个postAction类,可以在excel用户模板(Application.TemplatesPath
)的默认位置删除模板的副本。
在发布后,需要完成manual process才能完成这项工作,我已经在PowerShell脚本中实现了自动化。
发布解决方案后......
我想运行脚本来集成postAction并重新签名清单。
有没有办法做到这一点?
答案 0 :(得分:2)
我最终想通了。
首先,我必须了解MSBuild周围的配置信息......
Targets
的东西,它们是可执行的构建块Targets
不按解析顺序执行。实际上它们根本没有被执行,除非它们以某种方式绑定到MSBuild的预定义目标。Targets
使用AfterTargets
,BeforeTargets
和DependsOnTargets
可选属性与构建过程相关联。Import
元素,可从系统.target
和.props
文件中引入大量预定义元素和元数据。.target
文件并导入它们。它们与导入文件具有相同的执行上下文。Targets
文件负责VSTO构建和发布过程:$(VSToolsPath)\OfficeTools\Microsoft.VisualStudio.Tools.Office.targets
,您可以在其中看到发布Targets
。Target
是BeforePublish
。如果我将构建输出调到“详细”,我可以看到在此之后发生的唯一事情是分发文件从临时,构建位置移动到发布文件夹。在此过程中,更新清单以反映重新签名之前路径的更改。所以我通过它的Target
属性链接了我自定义的发布后AfterTargets
,并利用了项目目录结构中临时构建位置的便利。要浏览一下,我在.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.
为了调用我的发布后脚本,我首先创建了一个名为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元素
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<Import Project="$(VSToolsPath)\OfficeTools\Microsoft.VisualStudio.Tools.Office.targets" Condition="'$(VSToolsPath)' != ''" />
<Import Project=".\OfficeTools\PostAction.targets" />
我把它放在与其他导入元素相同的位置,如果我最后只是粘贴它就不起作用。
就是这样。现在,我的发布后脚本在每个Publish构建结束时运行,postsAction部分被添加到当前版本的应用程序清单中,并且使用正确的证书重新签署部署清单。