我们如何获得VisualStudio Publish中使用的相同发布命令

Kag*_*awa 4 c# msbuild msdeploy visual-studio

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

msdeploy.exe 
-verb:sync
-source:package=mypackage.zip
-dest:auto,computerName=MyServer
-allowUntrusted
Run Code Online (Sandbox Code Playgroud)

这会将我的包同步到目标服务器,并在此过程中删除所有不需要的文件。有时资源(例如:MyResource.dll)被IIS工作进程锁定,并且不允许删除操作,因此部署失败并显示以下错误:

拒绝访问路径“ C:\ MyResource.dll”。

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

我认为VS可能使用此开关:

-enableRule:DoNotDeleteRule

但是我对此不太确定。

我的问题:

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

我也尝试过PSEXEC

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

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

The handle is invalid.
Couldn't access MyServer.
Run Code Online (Sandbox Code Playgroud)

(把我的头撞在墙上)

Kag*_*awa 5

要回答我自己的问题:

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

是的,我们可以将命令输出到输出窗口。
您需要做的只是简单地<YourProjectName>.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>
Run Code Online (Sandbox Code Playgroud)

现在,您可以使用Visual Studio进行发布,并且可以在输出窗口中看到MSDeploy命令。

有关更多信息,请在此处结帐Sayed Ibrahim Hashimi博客。


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

我设法使用MSDeploy命令的-preSync -postSync启动/停止/回收远程AppPool。

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>"
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助=)