VS2017中MsBuild自定义Target在MSDeployPublish后不执行问题排查
我想要修改.csproj文件,实现从Visual Studio 2017向服务器发布后执行自定义Target。当前我的配置如下:
<PropertyGroup> <PostBuildEvent>copy $(ProjectDir)\lib\Oracle.ManagedDataAccess.dll $(ProjectDir)\bin</PostBuildEvent> </PropertyGroup> <PropertyGroup> <PreBuildEvent>copy $(ProjectDir)\lib\Oracle.ManagedDataAccess.dll $(ProjectDir)\bin</PreBuildEvent> </PropertyGroup> <ItemGroup> <OracleSourceFile Include="$(ProjectDir)\lib\Oracle.ManagedDataAccess.dll"/> <OracleDestinationFolder Include="$(ProjectDir)\bin"/> </ItemGroup> <Target Name="OracleTarget" AfterTargets="MSDeployPublish" > <Copy SourceFiles="@(OracleSourceFile)" DestinationFolder="@(OracleDestinationFolder)"> </Copy> </Target>
但这个配置没生效,发布输出里完全看不到OracleTarget执行的记录,请问我哪里操作有误?
嘿,我来帮你排查下问题。核心问题是你绑定的MSDeployPublish目标在VS2017的Web发布流程里并不是最终的完成节点,所以你的自定义Target根本没被触发。另外还有几个小细节可以调整,我一步步给你说:
1. 替换成正确的绑定目标
在VS2017的Web发布(MSDeploy)流程中,真正会在发布完成后触发的目标是**AfterPublish**。把你的Target节点修改成这样:
<Target Name="OracleTarget" AfterTargets="AfterPublish"> <Copy SourceFiles="@(OracleSourceFile)" DestinationFolder="@(OracleDestinationFolder)" /> </Target>
这样就能确保发布流程走完后,你的复制操作会被执行。
2. 检查目标路径是否符合需求
你现在的OracleDestinationFolder指向的是本地的$(ProjectDir)\bin——如果你的需求只是确保本地bin目录有这个DLL再发布,那没问题;但如果是要把这个DLL同步到服务器的目标目录,那本地Copy任务就没用了,得换成MSDeploy相关的任务,比如直接调用msdeploy.exe命令来推送文件,或者用MSDeployPublish任务配置远程路径。
3. 加日志输出方便调试
为了确认Target到底有没有触发,你可以在Target里加个Message任务,这样发布输出里就能看到明确的痕迹:
<Target Name="OracleTarget" AfterTargets="AfterPublish"> <Message Text="=== 开始执行OracleTarget复制操作 ===" Importance="high" /> <Copy SourceFiles="@(OracleSourceFile)" DestinationFolder="@(OracleDestinationFolder)" /> <Message Text="=== OracleTarget复制操作完成 ===" Importance="high" /> </Target>
要是发布输出里能看到这两行日志,说明Target已经触发了,问题可能出在复制路径上;要是看不到,那就是目标绑定的问题还没解决。
4. 确认项目类型和发布方式
如果你的项目不是Web项目(比如控制台、类库),发布流程的最终目标会不一样,这时候绑定AfterTargets="Publish"就可以。另外,如果你用的是文件系统发布而非MSDeploy,也要确认对应的目标节点是否正确。
最后给你一个调整后的完整配置片段参考:
<PropertyGroup> <PostBuildEvent>copy $(ProjectDir)\lib\Oracle.ManagedDataAccess.dll $(ProjectDir)\bin</PostBuildEvent> </PropertyGroup> <PropertyGroup> <PreBuildEvent>copy $(ProjectDir)\lib\Oracle.ManagedDataAccess.dll $(ProjectDir)\bin</PreBuildEvent> </PropertyGroup> <ItemGroup> <OracleSourceFile Include="$(ProjectDir)\lib\Oracle.ManagedDataAccess.dll"/> <!-- 要是需要推送到服务器,这里要改成对应的远程发布路径,或者用发布变量 --> <OracleDestinationFolder Include="$(ProjectDir)\bin"/> </ItemGroup> <Target Name="OracleTarget" AfterTargets="AfterPublish"> <Message Text="=== 执行OracleTarget:复制Oracle DLL到目标目录 ===" Importance="high" /> <Copy SourceFiles="@(OracleSourceFile)" DestinationFolder="@(OracleDestinationFolder)" /> </Target>
内容的提问来源于stack exchange,提问作者nes-p

