从网站中排除在Visual Studio中发布的文件


79

在Visual Studio 2005中发布网站时,可以排除文件夹或文件吗?我想在解决方案资源管理器中保留各种资源,例如用于各种环境的备用配置文件,但是我真的不想将它们发布到服务器。有什么方法可以排除它们吗?当使用其他项目类型(例如.dll程序集)时,我可以将文件的Build Action属性设置为“ None”,并将其Copy to Output Directory属性设置为“ Do not copy”。我在网站中找不到文件的任何类似设置。

如果IDE不提供此功能,那么有没有人能很好地处理此类文件?


3
在这里,你可以找到一个很简单的解决办法:stackoverflow.com/questions/1288858/...
德米特里·梅尔尼克

Answers:


32

如果您可以基于扩展名识别文件,则可以使用web.config中buildproviders标记进行配置。添加扩展并将其映射到ForceCopyBuildProvider。例如,要配置.xml文件以使用发布操作进行复制,您可以执行以下操作:

<configuration>...
    <system.web>...
        <compilation>...
            <buildProviders>
                <remove extension=".xml" />
                <add extension=".xml" type="System.Web.Compilation.ForceCopyBuildProvider" />
            </buildProviders>

为了防止给定文件被复制,您可以做相同的事情,但是使用System.Web.Compilation.IgnoreFileBuildProvider作为类型。


超酷。wpp.targets文件中的建议ExcludeFromPackageFiles运气不好。后者相当无用,因为它似乎不支持文件夹深度超过一级的通配符。感谢
DvS

127

通过在项目文件中添加ExcludeFilesFromDeploymentExcludeFoldersFromDeployment元素来排除文件和文件夹(.csproj,.vbproj等)。您将需要在文本编辑器中或在Visual Studio中通过卸载项目然后对其进行编辑来编辑文件。

PropertyGroup如下所示,将标签添加到适当位置(调试,发布等)中的任意位置:

<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' "> 
  ... 
  <ExcludeFilesFromDeployment>File1.aspx;Folder2\File2.aspx</ExcludeFilesFromDeployment> 
  <ExcludeFilesFromDeployment>**\.svn\**\*.*</ExcludeFilesFromDeployment>
  <ExcludeFoldersFromDeployment>Folder1;Folder2\Folder2a</ExcludeFoldersFromDeployment> 
</PropertyGroup>

支持通配符。

解释上面的例子:

  • 第一个ExcludeFilesFromDeployment排除File1.aspx(在项目的根目录中)和Folder2\File2.aspxFolder2在项目的根目录中)
  • 第二个ExcludeFilesFromDeployment不包括任何命名的文件夹.svn及其子文件夹中的所有文件
  • ExcludeFoldersFromDeployment名为排除的文件夹Folder1(在项目的根目录)和Folder2\Folder2aFolder2在项目的根目录)

有关更多信息,请参见MSDN博客文章Web部署:通过Web应用程序的项目文件排除文件和文件夹。


1
有没有办法使用通配符?
roydukkey 2014年

4
这比我接受的答案好得多,因为我想在发布期间排除Web.config文件!
Michael Eakins 2014年

6
在“网站”类型的项目上,此代码段被添加到〜/ App_Data / PublishProfiles /中的* .pubxml文件中。
laylarenee 2014年

4
在Web应用程序中,您可以将这些元素添加到您发布的配置文件@〜\ Properties \ PublishProfiles
ExecutionOrder

6
有什么方法可以通过UI进行操作,而不是直接编辑项目文件吗?
Kurren 2015年

35

令人惊讶的是,Visual Studio 2012的答案不在这里:

  • 带有绿色复选标记的答案不是答案。

  • 最高的“更新”答案引用了2010年的文章,并说您必须编辑csproj项目文件,该文件现在不正确。我向我的Visual Studio 2012 csproj文件中添加了ExcludeFoldersFromDeployment XML元素,但它什么也没做,该元素被认为是无效的,这是因为ExcludeFoldersFromDeployment已被移动到看起来像的.pubxml文件中。

对于Web应用程序和网站,您可以编辑.pubxml文件!

您可以按照我的回答或尝试稍后找到的本指南:http : //www.leniel.net/2014/05/using-msdeploy-publish-profile-pubxml-to-create-an-empty-folder-structure-使用msdeployskiprules.html#sthash.MSsQD8U1.dpbs进行iis和跳过删除

是的,您不仅可以对网站项目执行此操作,还可以对网站执行此操作。我花了很长时间在Internet上寻找Visual Studio网站(NOT网站项目)这种难以捉摸的排除功能,并且之前得出结论认为这是不可能的,但看起来是这样的:

在Web应用程序项目的〜/ Properties / PublishProfiles和网站的〜/ App_Data / PublishProfiles中的[mypublishwebsitename] .pubxml文件中,只需添加:

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

作为<PropertyGroup>.pubxml文件中主要元素的子元素。除非您要键入特定的构建类型(例如发布或调试),否则无需添加新元素。

可是等等!!!

如果要使用“发布”配置中的以下设置从目标/目标服务器中删除文件:

在此处输入图片说明

然后,Web发布过程将在源/目标服务器上删除任何被排除的内容,例如您在<ExcludeFoldersFromDeployment>和中划定的项目<ExcludeFilesFromDeployment>

MsDeploy跳过规则可用于救援:

首先,Web Publish使用MSBuild之外的其他方式进行发布(称为Task IO或类似的方式),但是它存在错误并且无法识别跳过规则,因此必须将其添加到.pubxml中:

<PropertyGroup>
    <WebPublishMethod>MSDeploy</WebPublishMethod>
</PropertyGroup>

我会继续<WebPublishMethod>在它自己的<PropertyGroup>,你会觉得你可能只是有一个<PropertyGroup>在你的.pubxml但我跳过规则元素并没有被调用,直到我感动<WebPublishMethod>到自己的<PropertyGroup>元素。是的,很疯狂,但是实际上您需要为Web Publish排除所有资源,同时又不删除服务器上的文件夹/文件,这确实很疯狂。

现在,我的.pubxml中实际上是我的SkipRules,ExcludeFolders和ExcludeFiles声明:

<ExcludeFoldersFromDeployment>Config</ExcludeFoldersFromDeployment>
<ExcludeFoldersFromDeployment>Photos</ExcludeFoldersFromDeployment>
<ExcludeFoldersFromDeployment>Temp</ExcludeFoldersFromDeployment>
<ExcludeFilesFromDeployment>Web.config</ExcludeFilesFromDeployment>
 <AfterAddIisSettingAndFileContentsToSourceManifest>AddCustomSkipRules</AfterAddIisSettingAndFileContentsToSourceManifest>

现在,一个“跳过规则”(在您的.pubxml中<Target>是“子规则” <Project>):(您可以将<SkipAction>所有操作留空,以“跳过”,但是我没有对此进行测试并且不确定。

  <Target Name="AddCustomSkipRules">
    <Message Text="Adding Custom Skip Rules" />
    <ItemGroup>
      <MsDeploySkipRules Include="SkipConfigFolder">
        <SkipAction>Delete</SkipAction>
        <ObjectName>dirPath</ObjectName>
        <AbsolutePath>$(_DestinationContentPath)\\Config</AbsolutePath>
        <XPath>
        </XPath>
      </MsDeploySkipRules>
      <MsDeploySkipRules Include="SkipPhotosFolder">
        <SkipAction>Delete</SkipAction>
        <ObjectName>dirPath</ObjectName>
        <AbsolutePath>$(_DestinationContentPath)\\Photos</AbsolutePath>
        <XPath>
        </XPath>
      </MsDeploySkipRules>
      <MsDeploySkipRules Include="SkipWebConfig">
        <SkipAction>Delete</SkipAction>
        <ObjectName>filePath</ObjectName>
        <AbsolutePath>$(_DestinationContentPath)\\Web\.config</AbsolutePath>
        <XPath>
        </XPath>
      </MsDeploySkipRules>
      <MsDeploySkipRules Include="SkipWebConfig">
        <SkipAction>Delete</SkipAction>
        <ObjectName>dirPath</ObjectName>
        <AbsolutePath>$(_DestinationContentPath)\\Temp</AbsolutePath>
        <XPath>
        </XPath>
      </MsDeploySkipRules>
    </ItemGroup>
  </Target>

并且,请不要忘记.在filePath Skip规则中使用反斜杠转义。


11

我在同一个问题上苦苦挣扎,最终触发了将网站转换为Web应用程序的触发。完成此操作后,我获得了IDE的所有好处,例如构建操作,并且它编译起来更快,因此可以引导(不再需要验证网站...)。

步骤1:将“网站”转换为“网络应用程序”。为了转换它,我刚刚创建了一个新的“ Web应用程序”,吹走了它自动创建的所有文件,并复制并粘贴了我的网站。请注意,报告文件将需要将其“构建操作”设置为“内容”,而不是“无”。

步骤2:现在您可以设置任何文件的“ Build Action”属性。

希望这可以帮助。


7

在Visual Studio 2013中,我发现Keith的答案没有将ExcludeFoldersFromDeployment元素添加到项目文件中(我没有读过Brian Ogden的答案这样说)。但是,我发现在Visual Studio 2013中发布时可以通过仅在文本文件本身上设置以下属性来排除文本文件:

1)建立动作:无

2)复制到输出目录:不复制

最初,我尝试自行设置“复制到输出目录”属性,但是当“构建操作”设置为默认值“内容”时,此方法不起作用。然后,当我将“生成操作”设置为“无”时,发布时该文本文件不再复制到目标文件夹。

要在Visual Studio GUI中查看这些属性,请在“解决方案资源管理器”中右键单击要排除的文件,然后从上下文菜单中选择“属性”。


在发布到Azure的Visual Studio 2015中有效。
克里斯

2
问题是当您只需要排除某些目标环境(构建配置)的文件时。真痛苦
benmccallum'2

5

我认为您这里只有两个选择:

  • 使用“从项目中排除”功能。这不是理想的,因为该项目项将从任何集成的IDE源代码控制操作中排除。如果需要在“解决方案资源管理器”中查看文件,则需要在“解决方案”窗口中单击“显示所有文件”按钮,但这还会显示您不感兴趣的文件和文件夹。
  • 使用构建后事件脚本删除您不想发布的任何项目项(假设您要发布到本地文件夹然后上传到服务器)。

我之前已经经历过,无法提出任何真正优雅的方法。


2

对于Visual Studio 2017,WebApp Publish首先创建一个标准文件系统发布配置文件。转到App_Data \ PublishProfiles \文件夹,然后编辑[profilename] .pubxml文件。

<ExcludeFilesFromDeployment>[file1.ext];[file2.ext];[file(n).ext]</ExcludeFilesFromDeployment>

在标签下<PropertyGroup> 您只能指定一次此标签,否则它将仅接受最后一个的值。

例:

<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <PropertyGroup>
    <WebPublishMethod>FileSystem</WebPublishMethod>
    <LastUsedBuildConfiguration>Release</LastUsedBuildConfiguration>
    <LastUsedPlatform>Any CPU</LastUsedPlatform>
    <SiteUrlToLaunchAfterPublish />
    <LaunchSiteAfterPublish>True</LaunchSiteAfterPublish>
    <ExcludeApp_Data>True</ExcludeApp_Data>
    <publishUrl>C:\inetput\mysite</publishUrl>
    <DeleteExistingFiles>False</DeleteExistingFiles>
    <ExcludeFilesFromDeployment>web.config;mysite.sln;App_Code\DevClass.cs;</ExcludeFilesFromDeployment>
  </PropertyGroup>
</Project>

确保标记DeleteExistingFiles设置为False


Nico你是GP的人吗?为MCI工作?
Namphibian

1

如果您的项目被创建为“ Web应用程序”,则您正在查找的功能存在。网络站点“项目”仅仅是被认为是1个文件的集合:什么被部署到Web服务器1。

就功能而言,两者是相同的,但是Web应用程序将所有源代码编译为DLL,而不是将裸露的源代码文件复制到Web服务器并根据需要进行编译。


0

在Visual Studio 2017(在我的案例中为15.9.3)中,对.csproj文件的操作确实可以正常工作!无需修改pubxml。

然后,您可以使用PropertyGroup条件在.csproj文件中构造漂亮的设置,例如:

  <PropertyGroup Condition="$(Configuration.StartsWith('Pub_'))">
    <ExcludeFoldersFromDeployment>Samples</ExcludeFoldersFromDeployment>
  </PropertyGroup>

从所有以“ Pub_”开头的配置的部署中排除“ Samples”文件夹...


我确认这适用于Visual Studio 2017,而未应用“条件”属性。
Erdem KAYA

0

作为一个当代的答案,在带有.net核心站点的Visual Studio 2017中:

您可以像在csproj中那样从发布中排除,而CopyToPublishDirectory从不存在。

  <ItemGroup>
    <Content Update="appsettings.json">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
      <CopyToPublishDirectory>PreserveNewest</CopyToPublishDirectory>
    </Content>
    <Content Update="appsettings.Local.json">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
      <CopyToPublishDirectory>Never</CopyToPublishDirectory>
    </Content>
  </ItemGroup>

此处将对此进行详细讨论:https : //docs.microsoft.com/zh-cn/aspnet/core/host-and-deploy/visual-studio-publish-profiles?view=aspnetcore-2.2

<PropertyGroup>
    <ExcludeFilesFromDeployment>appsettings.Local.json</ExcludeFilesFromDeployment>
</PropertyGroup>

我猜较早的建议对我不起作用,因为Visual Studio现在在下面使用了不同的发布机制,我想是通过“ dotnet publish” cli工具或在下面使用的等效工具。


0

这只是这里其他有用答案的附录,我发现这很有用...

使用wpp.targets排除文件和文件夹

当您针对不同的环境进行多个部署时,只有一个通用文件可以在其中设置所有排除的文件和文件夹,这将很有帮助。您可以通过*.wpp.targets在项目的根目录中创建一个文件来完成此操作,如下例所示。

有关更多信息,请参见此Microsoft指南:

如何:在Visual Studio Web项目中的发布配置文件(.pubxml)文件和.wpp.targets文件中编辑部署设置

<?xml version="1.0" encoding="utf-8" ?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <PropertyGroup>
    <EnableMSDeployAppOffline>True</EnableMSDeployAppOffline>
    <ExcludeFilesFromDeployment>
      *.config;
      *.targets;
      *.default;
    </ExcludeFilesFromDeployment>
    <ExcludeFoldersFromDeployment>
      images;
      videos;
      uploads;
    </ExcludeFoldersFromDeployment>
  </PropertyGroup>
</Project>
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.