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

问题描述 投票:72回答:10

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

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

visual-studio visual-studio-2005 web-publishing
10个回答
29
投票

如果您可以根据扩展名识别文件,则可以使用buildproviders tag in the web.config进行配置。添加扩展并将其映射到ForceCopyBuildProvider。例如,要配置要使用发布操作复制的.xml文件,请执行以下操作:

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

要保持给定文件不被复制,您可以执行相同的操作,但使用System.Web.Compilation.IgnoreFileBuildProvider作为类型。


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工具或下面的等效工具。


112
投票

通过将ExcludeFilesFromDeploymentExcludeFoldersFromDeployment元素添加到项目文件(.csproj,.vbproj等)来排除文件和文件夹。将它们添加到适当的PropertyGroup(Debug,Release等)中的任何位置,如下所示:

<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 Deployment: Excluding Files and Folders via the Web Application’s Project File


32
投票

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

  • 绿色复选标记的答案不是答案。
  • 最高的“upped”答案引用了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 for Web Application Projects和〜/ App_Data / PublishProfiles for Websites中找到,只需添加:

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

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

可是等等!!!

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

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

MsDeploy跳过救援规则:

首先,Web Publish使用除MSBuild之外的其他东西来发布(称为Task IO或类似的东西)但它有一个bug并且不会识别跳过规则,所以你必须添加到你的.pubxml:

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

我会将<WebPublishMethod>保留在自己的<PropertyGroup>中,你会认为你的.pubxml中只能有一个<PropertyGroup>元素,但是直到我将<WebPublishMethod>移动到它自己的<PropertyGroup>元素时我的Skip Rules才被调用。是的,很疯狂,但是您需要为Web Publish执行所有这些以排除并且不删除服务器上的文件夹/文件的事实是疯了。

现在我的.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规则中逃避.


11
投票

我努力解决同样的问题,并最终取消了将网站转换为Web应用程序的触发器。一旦我这样做了,我就获得了所有IDE的好处,例如构建操作,并且编译速度更快(不再需要验证网站......)。

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

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

希望这可以帮助。


6
投票

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

1)构建动作:无

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

最初我尝试单独设置“复制到输出目录”属性,但是当“构建操作”设置为默认值“内容”时,该属性不起作用。当我将Build Action设置为None时,我发布时不再将文本文件复制到目标文件夹。

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


5
投票

我想你这里只有两个选择:

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

我以前经历过这个,并且无法想出任何非常优雅的东西。


1
投票

如果您的项目是作为“Web应用程序”创建的,则您正在查看的功能存在。网站“项目”只是一组被认为是1:1的文件,其中包含部署到Web服务器的文件。

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


1
投票

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

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

在tag<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


0
投票

在Visual Studio 2017(在我的例子中为15.9.3)中.csproj-File的操作确实很好用!无需修改pubxml。

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.