Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net 如果msdeploy没有';是否不存在,但不删除远程目录的任何内容?_Asp.net_.net_Msdeploy - Fatal编程技术网

Asp.net 如果msdeploy没有';是否不存在,但不删除远程目录的任何内容?

Asp.net 如果msdeploy没有';是否不存在,但不删除远程目录的任何内容?,asp.net,.net,msdeploy,Asp.net,.net,Msdeploy,我有一个具有以下包/发布Web设置的应用程序设置: 仅运行此应用程序所需的文件 (未选中)排除生成的调试符号 (选中)从App_数据文件夹中排除文件 (选中)包括在“打包/发布SQL”选项卡中配置的所有数据库-注意,我没有配置任何数据库 (未选中)包括在IIS Express中配置的IIS设置 在这个项目中,我有一个App_数据文件夹设置,主要用于处理应用程序日志 我希望看到(和期望看到)的行为如下: 初始部署到全新服务器时,将复制应用程序,并创建一个App_数据文件夹,并为该应用程序分配写

我有一个具有以下包/发布Web设置的应用程序设置:

  • 仅运行此应用程序所需的文件
  • (未选中)排除生成的调试符号
  • (选中)从App_数据文件夹中排除文件
  • (选中)包括在“打包/发布SQL”选项卡中配置的所有数据库-注意,我没有配置任何数据库
  • (未选中)包括在IIS Express中配置的IIS设置
在这个项目中,我有一个App_数据文件夹设置,主要用于处理应用程序日志

我希望看到(和期望看到)的行为如下:

  • 初始部署到全新服务器时,将复制应用程序,并创建一个App_数据文件夹,并为该应用程序分配写入权限
  • 在后续部署中,App_数据文件夹将被忽略,因为它已存在,并且选中了“从App_数据文件夹中排除文件”
  • 但是,msdeploy似乎没有执行步骤1(如果手动创建文件夹,则步骤2可以)。除此之外,我在网上找不到任何文档来证实我所看到的行为


    在这种情况下,如何让msdeploy创建应用程序数据并分配初始部署的权限?

    如果没有要复制的文件,Web部署将不会创建文件夹。在您的场景中,一种解决方法是不要使用从App_数据文件夹中排除文件复选框,在App_数据中放置一个虚拟文件(例如没有任何内容的.txt文件),并为App_数据文件夹中的任何其他文件(例如.sdf文件)指定文件排除规则

    关于排除单个文件(可以使用通配符),请参阅MSDN上部署常见问题解答中的第一个问题:

    关于使用虚拟文件方法创建文件夹,请参见本教程中的确保部署Elmah文件夹

    从头开始时部署应用程序数据 @tdykstra得到了。为了获取App_数据(并自动设置ACL),我执行了以下操作:

  • 在App_数据中添加占位符文件
  • 将构建操作设置为占位符上的内容(我的占位符文件中包含文本,以便让绊倒的人知道它为什么在那里)
  • 未选中VS 2010中项目属性的“打包/发布Web”选项卡上的“从应用程序数据文件夹中排除文件”
  • 这将创建my App_数据文件夹并准备在服务器上使用。但是,每当我重新发布时,它将导致我的所有文件被删除。这是我上面问题中的问题2,与另一个SO/非常相似

    防止在后续发布事件中删除服务器上的数据 MsDeploy中有两种机制可能会混淆(至少我混淆了它们):

  • 排除文件
  • MsDeploy跳过规则
  • 这两者都可用于解决问题,具体取决于场景:

  • 如果您:
  • 提前知道App_数据中文件的名称(例如sqllite数据库)
  • 将文件包含在项目的App_数据文件夹中
  • “使用MsDeploy跳过规则”命令MsDeploy完全跳过服务器上该目录和该目录中文件的所有删除。这解决了所有情况下的问题,但涉及的问题更多 实现MsDeploy跳过规则 要实现跳过规则,您必须放弃VS2010中的右键单击、部署选项,改为右键单击、打包、进入命令行、重新整理批处理文件并运行命令行)。如果您愿意忍受这种体验(我愿意,因为我正在通过CI流程实现自动化),以下是详细信息:

  • 。请注意,AbsolutePath参数是一个正则表达式,因此您可以得到:

    <Target Name="AddCustomSkipRules">
        <ItemGroup>
          <MsDeploySkipRules Include="SkipDeleteAppData">
            <SkipAction>Delete</SkipAction>
            <ObjectName>filePath</ObjectName>
            <AbsolutePath>$(_Escaped_PackageTempDir)\\App_Data\\.*</AbsolutePath>
            <XPath>
            </XPath>
          </MsDeploySkipRules>
          <MsDeploySkipRules Include="SkipDeleteAppData">
            <SkipAction>Delete</SkipAction>
            <ObjectName>dirPath</ObjectName>
            <AbsolutePath>$(_Escaped_PackageTempDir)\\App_Data\\.*</AbsolutePath>
            <XPath>
            </XPath>
          </MsDeploySkipRules>
        </ItemGroup>
    </Target>
    

    运行后,可以调用deploy.cmd(不带/M选项),它将按预期工作。

    在Visual Studio中使用
    发布Web
    对话框时,我成功地使其工作。注意:它适用于任何文件夹,而不仅仅是
    App\u Data

    这是基本的
    .pubxml
    配置文件:

    <?xml version="1.0" encoding="utf-8"?>
    <!--
    This file is used by the publish/package process of your Web project. You can customize the behavior of this process
    by editing this MSBuild file. In order to learn more about this please visit http://go.microsoft.com/fwlink/?LinkID=208121. 
    -->
    <Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
      <PropertyGroup>
    <AfterAddIisSettingAndFileContentsToSourceManifest>AddCustomSkipRules</AfterAddIisSettingAndFileContentsToSourceManifest>
        <WebPublishMethod>MSDeploy</WebPublishMethod>
        <LastUsedBuildConfiguration>Local</LastUsedBuildConfiguration>
        <LastUsedPlatform>Any CPU</LastUsedPlatform>
        <SiteUrlToLaunchAfterPublish />
        <ExcludeApp_Data>False</ExcludeApp_Data>
        <MSDeployServiceURL>localhost</MSDeployServiceURL>
        <DeployIisAppPath>SuperCoolAwesomeAppName</DeployIisAppPath>
        <RemoteSitePhysicalPath />
        <SkipExtraFilesOnServer>False</SkipExtraFilesOnServer>
        <MSDeployPublishMethod>InProc</MSDeployPublishMethod>
        <EnableMSDeployBackup>False</EnableMSDeployBackup>
        <UserName />
        <_SavePWD>False</_SavePWD>
        <LaunchSiteAfterPublish>True</LaunchSiteAfterPublish>
      </PropertyGroup>
    
      <PropertyGroup>
        <UseMsDeployExe>true</UseMsDeployExe>
      </PropertyGroup>
    
      <Target Name="CreateEmptyFolders">
        <Message Text="Adding empty folders to Files" />
        <MakeDir Directories="$(_MSDeployDirPath_FullPath)\Files\Folder 1" />
        <MakeDir Directories="$(_MSDeployDirPath_FullPath)\Files\Folder 2" />
        <MakeDir Directories="$(_MSDeployDirPath_FullPath)\Files\Folder 3\Test"/>
      </Target>
    
      <Target Name="AddCustomSkipRules" DependsOnTargets="CreateEmptyFolders">
        <Message Text="Adding Custom Skip Rules" />
        <ItemGroup>
          <MsDeploySkipRules Include="SkipFilesInFilesFolder">
            <SkipAction>Delete</SkipAction>
            <ObjectName>filePath</ObjectName>
            <AbsolutePath>$(_DestinationContentPath)\\Files\\.*</AbsolutePath>
            <Apply>Destination</Apply>
          </MsDeploySkipRules>
    
          <MsDeploySkipRules Include="SkipFoldersInFilesFolders">
            <SkipAction></SkipAction>
            <ObjectName>dirPath</ObjectName>
            <AbsolutePath>$(_DestinationContentPath)\\Files\\.*\\*</AbsolutePath>
            <Apply>Destination</Apply>
          </MsDeploySkipRules>
    
        </ItemGroup>
      </Target>
    
    </Project>
    
    
    

    总结和简化Emil和Leniel的简明答案,如果您只想允许部署
    应用程序数据进行添加和更新,但阻止删除,请将其添加到您的
    .pubxml

    
    ...
    真的
    假的
    删除
    文件路径
    应用程序数据\\*
    删除
    肮脏的
    应用程序数据
    

    true
    确实是必需的,否则它会失败,抱怨
    无法识别的skip指令'skipaction'

    这似乎应该可以工作,但我已经花了一个小时来处理它,但没有成功。我可以完成第1部分,但是排除文件/目录不起作用,不管是否使用通配符。我正在通过CI服务器进行构建,所以这可能是问题所在。我将在接下来的一两天内对此进行更多的研究并报告。这种解决#2的方法存在一个缺陷-在我的场景中,我希望“排除”在构建时我不知道的文件(例如,在文件名中包含日期的滚动日志文件)。为此,需要另一种方法。我将添加一个答案来进一步阐述我的发现。您还可以使用通配符——因此,如果您的日志文件都具有相同的扩展名,则可以排除具有该扩展名的所有文件。这是正确的,但前提是您的项目文件实际知道日志文件。我在没有项目中包含的日志文件的情况下测试了它,但它无法工作:(除非设置了
    true
    ,否则使用VS2017和
    MsDeploySkipRules
    不会真正起作用。
    <?xml version="1.0" encoding="utf-8"?>
    <!--
    This file is used by the publish/package process of your Web project. You can customize the behavior of this process
    by editing this MSBuild file. In order to learn more about this please visit http://go.microsoft.com/fwlink/?LinkID=208121. 
    -->
    <Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
      <PropertyGroup>
    <AfterAddIisSettingAndFileContentsToSourceManifest>AddCustomSkipRules</AfterAddIisSettingAndFileContentsToSourceManifest>
        <WebPublishMethod>MSDeploy</WebPublishMethod>
        <LastUsedBuildConfiguration>Local</LastUsedBuildConfiguration>
        <LastUsedPlatform>Any CPU</LastUsedPlatform>
        <SiteUrlToLaunchAfterPublish />
        <ExcludeApp_Data>False</ExcludeApp_Data>
        <MSDeployServiceURL>localhost</MSDeployServiceURL>
        <DeployIisAppPath>SuperCoolAwesomeAppName</DeployIisAppPath>
        <RemoteSitePhysicalPath />
        <SkipExtraFilesOnServer>False</SkipExtraFilesOnServer>
        <MSDeployPublishMethod>InProc</MSDeployPublishMethod>
        <EnableMSDeployBackup>False</EnableMSDeployBackup>
        <UserName />
        <_SavePWD>False</_SavePWD>
        <LaunchSiteAfterPublish>True</LaunchSiteAfterPublish>
      </PropertyGroup>
    
      <PropertyGroup>
        <UseMsDeployExe>true</UseMsDeployExe>
      </PropertyGroup>
    
      <Target Name="CreateEmptyFolders">
        <Message Text="Adding empty folders to Files" />
        <MakeDir Directories="$(_MSDeployDirPath_FullPath)\Files\Folder 1" />
        <MakeDir Directories="$(_MSDeployDirPath_FullPath)\Files\Folder 2" />
        <MakeDir Directories="$(_MSDeployDirPath_FullPath)\Files\Folder 3\Test"/>
      </Target>
    
      <Target Name="AddCustomSkipRules" DependsOnTargets="CreateEmptyFolders">
        <Message Text="Adding Custom Skip Rules" />
        <ItemGroup>
          <MsDeploySkipRules Include="SkipFilesInFilesFolder">
            <SkipAction>Delete</SkipAction>
            <ObjectName>filePath</ObjectName>
            <AbsolutePath>$(_DestinationContentPath)\\Files\\.*</AbsolutePath>
            <Apply>Destination</Apply>
          </MsDeploySkipRules>
    
          <MsDeploySkipRules Include="SkipFoldersInFilesFolders">
            <SkipAction></SkipAction>
            <ObjectName>dirPath</ObjectName>
            <AbsolutePath>$(_DestinationContentPath)\\Files\\.*\\*</AbsolutePath>
            <Apply>Destination</Apply>
          </MsDeploySkipRules>
    
        </ItemGroup>
      </Target>
    
    </Project>