(MSDeploy) 将文件夹内容部署到远程 IIS 服务器

43

如何将一个文件夹(包含纯HTML文件)发布到远程IIS6/7服务器上的特定Web应用程序?

以下命令不会出错,但也不会将任何文件发布到远程服务器:

 msdeploy.exe -verb:sync -source:dirPath="c:\myHtmlFiles" -dest:auto,ComputerName="http://deploy.mycompany.co.uk/msdeploy?site=TestSite",includeAcls="false",username="administrator",password="myPassword" -enableRule:DoNotDeleteRule -disableLink:AppPoolExtension -disableLink:ContentExtension -allowUntrusted

注意:

  • WebDeploy已正确安装在目标服务器上,并且可以与使用msbuild脚本创建的.NET项目包愉快地工作。
  • 'http://deploy.mycompany.co.uk/msdeploy'是正确的监听端点。
  • ?site=TestSite查询字符串建议在其他地方,但不起作用。
  • 'TestSite' Web应用程序存在于目标服务器上。
  • 参数文件和-setParam不起作用,并会生成与源不支持参数'IIS Web Application Name'相关的错误,如果您尝试设置、声明或提供它。
1个回答

88
我刚写了一篇博客来回答这个问题,链接是http://sedodream.com/2012/08/20/WebDeployMSDeployHowToSyncAFolder.aspx。从你的问题看来,你似乎对 MSDeploy 很熟悉,所以答案可能有点冗长,但我希望那些对 MSDeploy 知识较少的人也能理解。下面是我的回答。
Web Deploy(又称 MSDeploy)使用提供程序模型,内置了许多提供程序。举个例子,同步 IIS Web 应用程序时,您将使用 iisApp;同步 MSDeploy 包时,您将使用 package;同步 Web 服务器时,您将使用 webServer 等等。如果要将本地文件夹同步到远程 IIS 路径,则可以使用contentPath提供程序。您还可以使用此提供程序将一个网站的文件夹同步到另一个网站。
我们在这种情况下想要做的一般思路是将您的PC文件夹同步到IIS网站上。msdeploy.exe的调用可能有点冗长,因此让我们逐步构建命令。我们将使用以下模板。
msdeploy.exe -verb:sync -source:contentPath="" -dest:contentPath=""

我们使用同步动词来描述我们要做的事情,然后使用 contentPath 提供程序作为源和目标。现在让我们填写这些值应该是什么。对于源值,您需要传递到要同步的文件夹的完整路径。在我的情况下,文件位于 C:\temp\files-to-pub。对于 dest 值,您将以 IIS 路径的形式给出文件夹的路径。在我的情况下,我要同步到的网站名为 sayedupdemo,所以我想要同步的 IIS 路径是 'sayedupdemo/files-to-pub'。现在我们得到了这个结果。
msdeploy.exe –verb:sync -source:contentPath="C:\temp\files-to-pub" -dest:contentPath='sayedupdemo/files-to-pub'

对于dest值,我们没有给出任何参数来指示这些命令应该发送到哪个服务器。我们需要添加这些参数。通常需要传递的参数是:
  • ComputerName - 这是处理发布操作的URL或计算机名称
  • Username - 用户名
  • Password - 密码
  • AuthType - 要使用的authType。可以是NTLM或Basic。对于WMSvc,通常是Basic,对于远程代理服务,通常是NTLM

在我的情况下,我正在发布到Windows Azure Web Site。因此,我将使用以下值:

所有这些值都可以在 .publishSettings 文件中找到(可从 WindowsAzure.com 的 Web Site 仪表板下载)。对于 计算机名称 值,您需要添加站点的名称以获取完整的 URL。在上面的示例中,我手动添加了 ?site=sayedupdemo,这与 Azure 门户中显示的名称相同。因此,现在我们拥有的命令是。

msdeploy.exe 
    –verb:sync 
    -source:contentPath="C:\temp\files-to-pub" 
    -dest:contentPath='sayedupdemo/files-to-pub'
            ,ComputerName="https://waws-prod-blu-001.publish.azurewebsites.windows.net/msdeploy.axd?site=sayedupdemo"
            ,UserName='$sayedupdemo'
            ,Password='thisIsNotMyRealPassword'
            ,AuthType='Basic'

好的,我们快要完成了!在我的情况下,我想确保在此过程中不删除服务器上的任何文件。因此,我还将添加–enableRule:DoNotDeleteRule。因此,我们的命令现在是:

msdeploy.exe 
    –verb:sync 
    -source:contentPath="C:\temp\files-to-pub" 
    -dest:contentPath='sayedupdemo/files-to-pub'
            ,ComputerName="https://waws-prod-blu-001.publish.azurewebsites.windows.net/msdeploy.axd?site=sayedupdemo"
            ,UserName='$sayedupdemo'
            ,Password='thisIsNotMyRealPassword'
            ,AuthType='Basic' 
    -enableRule:DoNotDeleteRule 

在执行此命令之前,我会先使用–whatif参数来执行它。这将为我提供操作的摘要,而不会实际引起任何更改。当我执行此操作时,结果如下图所示。

msdeploy result

在我确认所有更改都是有意的之后,我删除了 -whatif 并执行了该命令。之后,本地文件被发布到远程服务器。现在,我已经同步了文件,每次发布后只会发布更改的文件。

如果您想学习如何同步单个文件,可以查看我的先前博客文章:如何在发布期间使您的 Web 应用程序脱机。

dest:auto

在您的情况下,我注意到您正在使用 dest:auto,您可以使用它,但必须将 IIS 应用程序名称作为参数传递,并替换文件夹的路径。以下是命令。

msdeploy.exe 
    -verb:sync
    -source:contentPath="C:\temp\files-to-pub" 
    -dest:auto
        ,ComputerName="https://waws-prod-blu-001.publish.azurewebsites.windows.net/msdeploy.axd?site=sayedupdemo"
        ,UserName='$sayedupdemo'
        ,Password='thisIsNotMyRealPassword'
        ,AuthType='Basic' 
-enableRule:DoNotDeleteRule 
-setParam:value='sayedupdemo',kind=ProviderPath,scope=contentPath,match='^C:\\temp\\files-to-pub$'

10
很想看到一个简明易懂的MSBuild和MSDeploy教程。虽然有很多信息可用,但对于新手来说很困难,不知道该如何分辨。没有人解释过有两种部署方式:MSRemoteAgentService和Web Management Service(WMSVC),以及为什么你可能想使用其中之一。据我所知,只有一种方法,我一直在混淆用于其中一种或另一种语法。 - The Muffin Man
1
非常有用的@Sayed。谢谢! - Alfredo Cavalcanti
@Sayed Ibrahim Hashimi: -source:contentPath="C:\temp\files-to-pub". 你如何获取该文件夹:它是在命令 MSBuild.exe D:\Web.csproj /T:Package /P:Configuration=Release 中创建的吗? - Nevin Raj Victor
Sayed,很抱歉从未回复你的消息,虽然我直到现在才看到了你的回复,但是多年来,我一直在寻找你发布的文章和回复,这些信息对我帮助很大。我非常感谢你间接地提供给我的所有帮助。 - Warren
此外,我最终通过在我的CI代码库中包含一个普通的.csproj文件,并使用通配符 Content 来包含它,即 <Content Include="**/*" />,并在构建过程中将该.csproj文件复制到 HTML 文件夹的根目录下并运行 WebDeploy 以实现我的目标。简单而有效。 - Warren
1
AuthType='Basic' 对于 iis 登录非常重要(不是 Windows 认证)。在我添加这个之前,我一直收到“ERROR_USER_UNAUTHORIZED”错误。 - Simon_Weaver

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接