84

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

如果 IDE 不提供此功能,是否有人有处理此类文件的好技术?

4

11 回答 11

139

通过向项目文件(.csproj、.vbproj 等)添加元素来排除文件和文件夹ExcludeFilesFromDeploymentExcludeFoldersFromDeployment您将需要在文本编辑器中编辑该文件,或者在 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排除文件夹Folder1Folder2\Folder2aFolder2

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

于 2013-07-14T09:31:44.437 回答
38

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

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

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

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

您可以按照我的回答或尝试我稍后找到的本指南:http: //www.leniel.net/2014/05/using-msdeploy-publish-profile-pubxml-to-create-an-empty-folder-structure- on-iis-and-skip-deleting-it-with-msdeployskiprules.html#sthash.MSsQD8U1.dpbs

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

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

  <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>,你会认为你可以在你的 .pubxml 中只有一个元素,但是我的跳过规则直到我移动到它自己的元素<PropertyGroup>才被调用。是的,很疯狂,但是您需要为 Web Publish 执行所有这些操作以排除并且不删除服务器上的文件夹/文件这一事实很疯狂。<WebPublishMethod><PropertyGroup>

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

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

现在跳过规则(<Target>是您的.pubxml 中的一个子<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 规则。

于 2015-04-17T00:33:16.190 回答
33

如果您可以根据扩展名识别文件,则可以使用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 作为类型。

于 2009-03-16T15:35:46.173 回答
11

我在同样的问题上苦苦挣扎,最终触发了将网站转换为 Web 应用程序的操作。一旦我这样做了,我就获得了所有 IDE 的好处,例如构建操作,并且它编译速度更快(不再验证网站......)。

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

第 2 步:现在您可以设置任何文件的“构建操作”属性。

希望这可以帮助。

于 2011-04-12T14:13:54.563 回答
8

在 Visual Studio 2013 中,我找到了 Keith 的答案,将ExcludeFoldersFromDeployment元素添加到项目文件中,但没有奏效(我没有读过 Brian Ogden 的答案,其中提到了这一点)。但是,我发现我可以在 Visual Studio 2013 中发布时排除文本文件,只需在文本文件本身上设置以下属性:

1) 构建操作:无

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

最初我尝试自行设置 Copy to Output Directory 属性,但是当 Build Action 设置为默认值 Content 时,这不起作用。然后,当我将 Build Action 设置为 None 时,文本文件在我发布时不再复制到目标文件夹。

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

于 2015-07-28T21:51:46.963 回答
5

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

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

我以前经历过这个,无法想出任何真正优雅的东西。

于 2009-03-16T15:30:57.760 回答
3

对于 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

于 2018-06-09T17:19:45.260 回答
1

如果您的项目被创建为“Web 应用程序”,则您正在寻找的功能存在。网站“项目”只是文件的集合,这些文件被认为是与部署到 Web 服务器的 1:1 的文件

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

于 2009-03-16T15:28:45.440 回答
1

这只是此处其他有用答案的附录,以及我发现有用的东西......

使用 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>
于 2019-12-04T23:39:06.783 回答
0

在 Visual Studio 2017(在我的情况下为 15.9.3)中,.csproj-File 的操作确实可以正常工作!无需修改 pubxml。

然后,您可以使用 PropertyGroup 条件在 .csproj-File 中构造非常好的设置,例如:

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

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

于 2019-01-10T10:53:41.450 回答
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/en-us/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 工具或下面的等效工具。

于 2019-01-28T15:28:54.240 回答