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

时间:2014-07-18 16:16:52

标签: c# visual-studio msbuild msdeploy

我正在使用MSDeploy.exe发布我的webapp:

msdeploy.exe 
-verb:sync
-source:package=mypackage.zip
-dest:auto,computerName=MyServer
-allowUntrusted

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

  

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

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

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

  

-enableRule:DoNotDeleteRule

但我对此并不十分肯定。

我的问题: -

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

      

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

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

    The handle is invalid.
    Couldn't access MyServer.
    

    (撞在墙上)

2 个答案:

答案 0 :(得分:4)

回答我自己的问题:

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>

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

结帐Sayed Ibrahim Hashimi博客here了解更多信息。


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>"

希望这有助于=)

答案 1 :(得分:1)

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

msdeploy.exe -verb:sync -source:package=mypackage.zip -dest:auto,computername=<publishUrl> -enableRule:AppOffline 

这会将app_offline.htm放入您的网络应用根目录中,以实现同步操作的联系(这会强制IIS卸载应用程序并仅将此静态文件提供给所有请求,直到文件被删除 - 这是一个很好的解释http://weblogs.asp.net/scottgu/426755

请参阅http://www.iis.net/learn/publish/deploying-application-packages/taking-an-application-offline-before-publishing并了解详情。 如果需要,可以使用更灵活的方法(例如,在运行包的同步之前使用单独的webdeploy命令复制app_offline.htm)。

1)您是否尝试过将msbuild详细程度设置为诊断?