【问题标题】:Specifying folders not to sync in Web Deploy在 Web Deploy 中指定不同步的文件夹
【发布时间】:2013-08-17 04:52:07
【问题描述】:

我使用以下脚本将我的 ASP.NET MVC 应用程序部署到我们的 Web 服务器:

C:\Windows\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe MySolution.sln^
/p:Configuration=TeamCity-Test^
/p:OutputPath=bin^
/p:DeployOnBuild=True^
/p:DeployTarget=MSDeployPublish^
/p:MsDeployServiceUrl=https://mywebserver.com:8172/msdeploy.axd^
/p:username=MyDomain\MyUser^
/p:password=MyPassword^
/p:AllowUntrustedCertificate=True^
/p:DeployIisAppPath=mywebsitename.com^
/p:MSDeployPublishMethod=WMSVC

现在我需要指定不同步 /uploads 文件夹。我可以在这个脚本中指定吗?谢谢!

澄清: 我的项目中有 Uploads 文件夹。我想让 Web Deploy 创建文件夹。我不希望它从我的网络服务器中删除文件夹/子文件夹/文件,因为它包含用户上传的内容。

说明 #2: 我刚刚找到了SkipExtraFilesOnServer=True 选项。但是,我不希望这是全球性的。我想将其设置为单个文件夹。

【问题讨论】:

    标签: asp.net msbuild webdeploy


    【解决方案1】:

    更新: 显然,您真正想要的是阻止 web 部署删除目标服务器上的现有目录,但仍然创建文件夹以防万一它不存在。您可以按以下方式完成此操作:

    • 在项目文件旁边创建 YourWebProjectName.wpp.targets 文件,其中包含以下内容:

      <?xml version="1.0" encoding="utf-8"?>
      <Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
          <ItemGroup>
            <MsDeploySkipRules Include="SkipELMAHFolderFiles">
            <SkipAction></SkipAction>
            <ObjectName>filePath</ObjectName>
            <AbsolutePath>$(_DestinationContentPath)\\NameOfYourFolder\\.*</AbsolutePath>
            <Apply>Destination</Apply>
            <XPath></XPath>
          </MsDeploySkipRules>
      
          <MsDeploySkipRules Include="SkipELMAHFolderChildFolders">
            <SkipAction></SkipAction>
            <ObjectName>dirPath</ObjectName>
            <AbsolutePath>$(_DestinationContentPath)\\NameOfYourFolder\\.*\\*</AbsolutePath>
            <Apply>Destination</Apply>
            <XPath></XPath>
          </MsDeploySkipRules>
        </ItemGroup>
      </Project>
      

    相应地更改NameOfYourFolderYourWebProjectName。这假设您将它放在根目录中,我相信,如果不是这种情况,您可以使用相对路径。

    • 第一个 MsDeploySkipRules 条目告诉 webdeploy 不要删除 Name_OfYourFolder 中的任何文件。
    • 第二个 MsDeploySkipRules 告诉 webdeploy 不要删除 Name_OfYourFolder 中的任何子文件夹。

    此外,如果目标服务器上不存在该文件夹,则要创建该文件夹,您必须执行以下操作:

    • 将文件夹包含到项目中
    • 在其中添加一个虚拟 DeployemntPlaceholder.txt 文件并将其也包含到项目中

    DeployemntPlaceholder.txt 需要告诉 MSBUild 将该文件夹添加到包中:忽略空文件夹。

    我已经测试了这种方法,当您按照您展示的方式运行发布时,它可以正常工作。我使用this answer 来获得正确的msbuild 项目语法。我相信,这是一种自定义标志的 MSBuild 方式,由 MSBuild 部署管道传递给 webdeploy。

    如果您直接运行 MSDeploy,则可以按以下方式使用跳过参数:

    -skip:objectname='filePath',absolutepath='logs\\.*\\someNameToExclude\.txt'
    

    更新 2

    您可能还希望在您的 \Uploads 文件夹上设置 ACL 写入权限 - 有一个完整的指南来执行此操作:Setting Folder Permissions On Web Publish

    考虑到原始问题“指定文件夹在 Web Deploy 中不同步”,最简单的方法如下:

    您可以创建发布配置文件并添加以下行:

    <PropertyGroup>
      <ExcludeFilesFromDeployment>
        File1.aspx;File2.aspx
      </ExcludeFilesFromDeployment>
      <ExcludeFoldersFromDeployment>
        Folder1;Folder2
      </ExcludeFoldersFromDeployment>
    </PropertyGroup> 
    

    我已经测试了这种使用发布配置文件排除文件的方法。一个简单的指南是 here(滚动到 编辑 .pubxml 文件以排除 robots.txt 部分)。

    您也可以在 .wpp.targets 文件中执行此操作或编辑您的 csproj。在Web Deployment FAQ for Visual Studio and ASP.NET查看更多信息

    【讨论】:

    • 抱歉,我应该澄清一下:我希望 Web Deploy 创建文件夹,因为它存在于我的解决方案中。我只是不希望它删除任何文件/子文件夹。这是一个包含用户上传内容的文件夹,我不想丢失它。
    • @MikeCole ,你的项目中包含目录中的文件吗?
    • @MikeCole ,我相信由于 YourWebProjectName.wpp.targets 文件中缺少项目节点,您会收到 The project file could not be loaded. There are multiple root elements 错误。我已经更新了答案(看起来 &lt;project&gt; 节点由于降价格式错误而未显示)。
    • 我认为,您应该有 2 个跳过规则:一个用于文件,1 个用于文件夹(请参阅答案中的代码)。如果您的文件夹位于根目录中:对于文件:'$(_DestinationContentPath)\\TestFolder\\.*' 对于文件夹:$(_DestinationContentPath)\\TestFolder\\.*\*
    • 要删除dummy 文件,请查看CreateEmptyFolders 目标:stackoverflow.com/a/23812739/114029
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多