C# 如何获得VisualStudio发布中使用的相同发布命令

C# 如何获得VisualStudio发布中使用的相同发布命令,c#,visual-studio,msbuild,msdeploy,C#,Visual Studio,Msbuild,Msdeploy,我正在使用MSDeploy.exe发布我的Web应用程序: msdeploy.exe -verb:sync -source:package=mypackage.zip -dest:auto,computerName=MyServer -allowUntrusted 这将使我的包与目标服务器同步,并在此过程中删除所有不需要的文件。 有时资源(例如:MyResource.dll)被IIS工作进程锁定,它不允许执行删除操作,因此部署失败,出现错误: 对路径“C:\MyResource.dll”的访

我正在使用MSDeploy.exe发布我的Web应用程序:

msdeploy.exe 
-verb:sync
-source:package=mypackage.zip
-dest:auto,computerName=MyServer
-allowUntrusted
这将使我的包与目标服务器同步,并在此过程中删除所有不需要的文件。 有时资源(例如:MyResource.dll)被IIS工作进程锁定,它不允许执行删除操作,因此部署失败,出现错误:

对路径“C:\MyResource.dll”的访问被拒绝

但是,如果我从VisualStudio中使用发布功能,我的网站将毫无问题地发布到服务器上。锁定的文件仍保留在文件夹中,错误将被忽略

我想VS可能会使用这个开关:

-enableRule:DoNotDeleteRule

但我不是很确定

我的问题是:-

  • 我们可以通过输出窗口或日志文件获取VS使用的发布命令吗
  • 有没有办法停止远程服务器上的应用程序池?(这将有助于释放锁定的资源) *IISRESET不适合,因为我不想为了部署一个webapp而关闭所有网站
  • 我也试过:

    psexec.exe-s\\MyServer appcmd.exe停止apppool/apppool.name=MyAppPool

    它在命令行中运行良好,但当我将其放入用于构建自动化的脚本中时,它返回了错误:

    The handle is invalid.
    Couldn't access MyServer.
    
    (我的头撞在墙上)

    2)在部署期间使用appoffline规则停止应用程序:

    msdeploy.exe -verb:sync -source:package=mypackage.zip -dest:auto,computername=<publishUrl> -enableRule:AppOffline 
    
    msdeploy.exe-verb:sync-source:package=mypackage.zip-dest:auto,computername=-enableRule:AppOffline
    
    这将把app_offline.htm放入您的web应用程序根目录中,以进行同步操作(强制IIS卸载应用程序,并仅向所有请求提供此静态文件,直到文件被删除为止-下面是一个很好的解释)

    有关详细信息,请参阅和。 如果需要,您可以使用更灵活的方法(例如,在运行包同步之前,使用单独的webdeploy命令复制app_offline.htm)


    1) 您是否已尝试将msbuild verbosity设置为diagnostic?

    以回答我自己的问题:

    1)我们可以通过输出窗口或日志文件获取VS使用的发布命令吗?

    是的,我们可以将命令输出到输出窗口。
    只需将名为
    .wpp.targets
    的文件添加到项目目录的根目录中即可。并编辑如下内容:

    <?xml version="1.0" encoding="utf-8"?>
    <Project ToolsVersion="4.0" DefaultTargets="Build"
             xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
      <PropertyGroup>
        <UseMsdeployExe>true</UseMsdeployExe>
      </PropertyGroup>
    </Project>
    
    
    真的
    
    现在您可以使用VisualStudio发布,并且可以在输出窗口中看到MSDeploy命令

    查看易卜拉欣·哈希米博客了解更多信息


    2)有没有办法停止远程服务器上的应用程序池?

    我使用MSDeploy命令的-preSync-postSync启动/停止/回收远程应用程序池

    MSDeploy.exe 
    -source:package="mypackage.zip"
    -dest:auto,ComputerName=MyServer,IncludeAcls=False
    -verb:sync
    -disableLink:AppPoolExtension
    -disableLink:ContentExtension
    -disableLink:CertificateExtension
    -allowUntrusted
    -preSync:runCommand="C:\Windows\System32\inetsrv\appcmd stop apppool <AppPoolName>"
    -postSync:runCommand="C:\Windows\System32\inetsrv\appcmd start apppool <AppPoolName>"
    
    MSDeploy.exe
    -来源:package=“mypackage.zip”
    -dest:auto,ComputerName=MyServer,IncludeAcls=False
    -动词:sync
    -disableLink:AppPoolExtension
    -disableLink:ContentExtension
    -disableLink:CertificateExtension
    -allowUntrusted
    -preSync:runCommand=“C:\Windows\System32\inetsrv\appcmd stop apppool”
    -postSync:runCommand=“C:\Windows\System32\inetsrv\appcmd start-apppool”
    

    希望这有帮助=)

    我尝试了appoffline方法,它关闭了网站,但没有回收池。在执行手动回收apppool之前,资源仍处于锁定状态。我已按照您的步骤发布Blazor Web程序集应用程序,并且输出中没有“msbuild.exe”。