MS Visual Studio:如何从发布中排除某些项目文件夹?

65

我有一些文件夹希望保留在项目中,但不想将其包含在发布版本中。

这是否可行?


1
看起来是可能的。请查看Web部署:通过Web应用程序的项目文件排除文件和文件夹 - Michael Minton
对于.NET Core,请参见ASP.NET Core发布排除文件夹(或.json文件) - Chris Halcrow
6个回答

35

如果是网站项目,您可以按照以下方式排除某些文件夹和/或文件(请参见元素ExcludeFoldersFromDeploymentExcludeFilesFromDeployment):

<?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>
        <WebPublishMethod>FileSystem</WebPublishMethod>
        <LastUsedBuildConfiguration>Release</LastUsedBuildConfiguration>
        <LastUsedPlatform>Any CPU</LastUsedPlatform>
        <SiteUrlToLaunchAfterPublish />
        <LaunchSiteAfterPublish>True</LaunchSiteAfterPublish>
        <ExcludeApp_Data>True</ExcludeApp_Data>
        <publishUrl>D:\YAZILIM\Adopen.2015\PreCompiledWeb</publishUrl>
        <DeleteExistingFiles>True</DeleteExistingFiles>
        <PrecompileBeforePublish>True</PrecompileBeforePublish>
        <EnableUpdateable>True</EnableUpdateable>
        <DebugSymbols>False</DebugSymbols>
        <WDPMergeOption>MergeAllOutputsToASingleAssembly</WDPMergeOption>
        <UseMerge>True</UseMerge>
        <SingleAssemblyName>AdoIntranet</SingleAssemblyName>
        <ExcludeFoldersFromDeployment>customobjects;uploads</ExcludeFoldersFromDeployment> 
        <ExcludeFilesFromDeployment>app.config</ExcludeFilesFromDeployment>
    </PropertyGroup>
</Project>

1
这是一个很好的解决方案。如果您需要将这些规则应用于所有发布配置文件,则另一个类似的解决方案是创建一个*<project name>.wpp.targets*文件。 - crush
3
@nasch发布的定义文件存储在.\App_Data\PublishProfiles目录下,扩展名为.pubxml。 - HGMamaci
1
@nasch:解决方案资源管理器 > 项目 > 属性 > 发布配置文件 > your.pubxml - juFo
1
我认为这应该被标记为答案,因为目前的答案对于排除整个文件夹而言并不有效,除非针对其中的每个文件以及新增的文件进行操作! - A77
@A77 谢谢,你是对的。但是它没有被听到 :-) - HGMamaci
显示剩余3条评论

33

Michael是完全正确的,通过编辑.csproj文件,您可以手动排除要发布的文件/文件夹。

如果您不想修改.csproj文件,一种更简单的方法是在VS解决方案资源管理器中选择文件,然后在属性面板中将生成操作从“内容”更改为“无”。

这样,您就不必卸载解决方案中的项目,加载.csproj并为每个新添加的不需要发布的文件添加一行,而是可以通过3次鼠标点击来实现相同的效果。

(假设您已在发布选项卡下设置了“仅发布运行此应用程序所需的文件”)


15
对于文件夹而言,看起来你推荐的简单方法行不通,因为属性面板上没有“生成操作”属性可以用于文件夹(至少在VS2010和VS2012中是这样)。如果要排除整个文件夹(而不仅是单个文件),你可以使用你所提到的Michael答案中的解决方案。 - RSW
4
@RSW,你是正确的。.cproj <ExcludeFoldersFromDeployment>选项会特别覆盖任何标记为“内容”的文件。但是,如果您在文件夹中没有将任何文件标记为“内容”,则该文件夹将不会被发布。我仍然更喜欢标记n个文件,然后用一个隐藏/容易忘记的.csproj单行指令来覆盖这些文件设置 - 但每个人都有自己的做法。 - jbokkers
2
“.cproj <ExcludeFoldersFromDeployment>”选项会特别覆盖任何标记为“content”的文件。这非常有趣和重要,我之前并没有意识到!对我来说,这是一个潜在的陷阱,无论哪种方式,如果我标记整个文件夹,我可能会无意中覆盖其中的某些内容。如果我单独处理文件,我(或其他人)可能会稍后添加一个文件并忘记将其排除。我想就像大多数双刃剑一样,最好充分了解其影响,以便您做出的任何选择都是明智的。 - RSW

10
你可以在Web.cspoj文件中进行“查找和替换”操作,以快速从发布/部署过程中排除特定文件夹。
就像这样;
<Content Include="Uploads/

<None Include="Uploads/

5
  • 卸载项目,
  • 右键编辑*.csproj文件,
  • 添加以下内容:
<ItemGroup>
<Content Update="Data\CernainFolder\*.*">
<CopyToPublishDirectory>Never</CopyToPublishDirectory>
</Content>
</ItemGroup>
  • 重新加载项目。

这应该可以很好地工作。


我使用Data\CertainFolder,因为它在“Data”文件夹中...你必须使用自己的文件夹路径。 - Zilpio

4

另一种方法是隐藏在Windows资源管理器中不需要发布的文件夹(虽然不是最佳解决方案,但如果您有大量仍需在开发环境中使用的图片,则此方法可行)。


4
如果你有一个网站项目,这是唯一的解决方案。 http://forums.asp.net/post/1997766.aspx - RobD
如果您有一个批处理文件用于发布,您可以在发布之前使用ATTRIB +H FolderName来设置该文件夹为隐藏状态,然后在发布后使用ATTRIB -H FolderName来将其设置回去。 - mrd3650

1
由于该问题标记为ASP,因此没有要混淆的.proj文件。使用VS2015,有另一个有用的文件:website.publishproj这篇关于排除文件和文件夹的Asp.Net文章提到了.wpp.targets文件。
所有这些文件都包含<ItemGroup>元素,可能会有像<ExcludeFromPackageFolders>的元素。由于这些似乎是有文档记录的功能,所以只需使用它们,不必感到有负罪感的黑客或“搅拌”。对我来说,使用该链接的简单说明和website.publishproj文件排除一个目录就可以完美解决问题!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接