Asp.net 如果msdeploy没有';是否不存在,但不删除远程目录的任何内容?
我有一个具有以下包/发布Web设置的应用程序设置:Asp.net 如果msdeploy没有';是否不存在,但不删除远程目录的任何内容?,asp.net,.net,msdeploy,Asp.net,.net,Msdeploy,我有一个具有以下包/发布Web设置的应用程序设置: 仅运行此应用程序所需的文件 (未选中)排除生成的调试符号 (选中)从App_数据文件夹中排除文件 (选中)包括在“打包/发布SQL”选项卡中配置的所有数据库-注意,我没有配置任何数据库 (未选中)包括在IIS Express中配置的IIS设置 在这个项目中,我有一个App_数据文件夹设置,主要用于处理应用程序日志 我希望看到(和期望看到)的行为如下: 初始部署到全新服务器时,将复制应用程序,并创建一个App_数据文件夹,并为该应用程序分配写
- 仅运行此应用程序所需的文件
- (未选中)排除生成的调试符号
- (选中)从App_数据文件夹中排除文件
- (选中)包括在“打包/发布SQL”选项卡中配置的所有数据库-注意,我没有配置任何数据库
- (未选中)包括在IIS Express中配置的IIS设置
在这种情况下,如何让msdeploy创建应用程序数据并分配初始部署的权限?如果没有要复制的文件,Web部署将不会创建文件夹。在您的场景中,一种解决方法是不要使用从App_数据文件夹中排除文件复选框,在App_数据中放置一个虚拟文件(例如没有任何内容的.txt文件),并为App_数据文件夹中的任何其他文件(例如.sdf文件)指定文件排除规则 关于排除单个文件(可以使用通配符),请参阅MSDN上部署常见问题解答中的第一个问题: 关于使用虚拟文件方法创建文件夹,请参见本教程中的确保部署Elmah文件夹: 从头开始时部署应用程序数据 @tdykstra得到了。为了获取App_数据(并自动设置ACL),我执行了以下操作:
<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>