ASP.NET Core:发布时排除或包含文件

85

project.json文件之前有包含/排除部分,其中包括aspdotnet1.0

{
  "exclude": [
    "node_modules",
    "bower_components"
  ],
  "publishExclude": [
    "**.xproj",
    "**.user",
    "**.vspscc"
  ]
}

在ASP.NET Core 1.1中,这个部分在哪里(没有project.json)?是否有类似的部分在.csproj文件或.pubxml中?

13个回答

139
文档中可以了解到:如果您想指定一些文件与您的应用程序一起发布,仍然可以使用csproj中的已知机制(例如<Content>元素)来实现。
对于ItemGroup元素,存在一个CopyToPublishDirectory属性,用于确定是否将文件复制到发布目录,并可以具有以下值之一:
  • Always
  • PreserveNewest
  • Never
请注意,输出文件夹还有类似的CopyToOutputDirectory属性。
示例(来自此处):
<ItemGroup>

  <None Include="notes.txt" CopyToOutputDirectory="Always" />
  <!-- CopyToOutputDirectory = { Always, PreserveNewest, Never } -->

  <Content Include="files\**\*" CopyToPublishDirectory="PreserveNewest" />
  <None Include="publishnotes.txt" CopyToPublishDirectory="Always" />
  <!-- CopyToPublishDirectory = { Always, PreserveNewest, Never } -->
</ItemGroup>
如果你对如何将 project.json 迁移至 .csproj 使用 CopyToPublishDirectory 属性以迁移发布选项感兴趣的话,可以查看 dotnet cli 存储库中的 MigratePublishOptionsRule 类。

MigratePublishOptionsRule链接已失效。 - Tagc
6
这个答案是针对 Visual Studio 2017 15.3 之前的项目。最新项目请参考 @Wagner-Pereira。 - Ben Anderson
1
我有以下代码:<ItemGroup> <None Update="readme.html"> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> <CopyToPublishDirectory>PreserveNewest</CopyToPublishDirectory> </None> <None Update="readme.md"> <CopyToOutputDirectory>Never</CopyToOutputDirectory> </None> </ItemGroup> 我希望在发布时能够复制 readme.html,但实际上并没有成功。 - Chris Ward
这项工作使用 .Net 6 CLI。 - vcRobe

83
在Visual Studio版本15.3及更高版本的.csproj文件中,这将使文件在Visual Studio中可见(而"Content Remove"则不会),并防止文件被发布。
<ItemGroup>
    <Content Update="appsettings*.json" CopyToPublishDirectory="Never" />
</ItemGroup>

要排除文件夹的内容,您需要编写以下代码:
<!-- Excluding the ClientApp folder. -->
<Content Update="ClientApp\**" CopyToPublishDirectory="Never" />

6
这个解决方案比被接受的答案好得多!请注意更新属性,这样您就可以将其应用于已经包含在项目中的文件,因为它们位于根文件夹下。 - HH321
3
我也同意。这在VS 2019的版本16.0.0中也适用(刚测试过)。 - ArieKanarie
3
明白了,我会尽力进行翻译。以下是需要翻译的内容:Works for me. Reference here: https://learn.microsoft.com/en-us/aspnet/core/host-and-deploy/visual-studio-publish-profiles?view=aspnetcore-2.2#exclude-files - ahong
1
确认这仍然有效。尝试了上面的所有方法都不起作用,但这个方法可以。 - scubaFun
2
我可以确认这个解决方案在Visual Studio 2022 / .Net Core 6上对我有效。 - Gerardo Verrone
显示剩余2条评论

41

5
这是目前可行的解决方案。在15.3版本之后,CopyToPublishDirectory或CopyToOutputDirectory完全没有起作用。 - Bluesight
不幸的是,这也会从VS解决方案资源管理器中删除您的模块,并且您将失去工具支持。CopyToPublishDirectory在我的17.5版本中运行良好。 - Oliver Schimmer
这是我们唯一能让它在VS 2022中工作的方法。不确定是否有其他发布设置可以使旧方式工作。我们最终使用属性面板更新了所有文件,将其更改为“无->不复制”,并使用查找替换csproj文件中的“<None Remove”更改为“<Content Remove”。 - SM3RKY
这是唯一适用于Rider的解决方案。 - haey3
在 Rider 中,使用 Remove 属性也会隐藏解决方案资源管理器中的文件。将 Remove 替换为 Update,并设置 CopyToPublishDirectory="Never",可以解决这个问题,并保留文件在解决方案资源管理器中的可见性。 - haey3
这种方法不会排除通过引用 NuGet 包包含的文件,其中包含了不需要的文件。 - undefined

23

使用 Visual Studio 2017(在15.6.5版本中测试),您可以右键单击Solution Explorer中的文件,并将Build Action设置为None

这将会更新您的 .csproj 文件,就像这样:

<ItemGroup>
  <Content Remove="appsettings.Development.json" />
  <Content Remove="appsettings.json" />
  <Content Remove="npm-shrinkwrap.json" />
  <Content Remove="package.json" />
  <Content Remove="tsconfig.json" />
</ItemGroup>

<ItemGroup>
  <None Include="appsettings.Development.json" />
  <None Include="appsettings.json" />
  <None Include="npm-shrinkwrap.json" />
  <None Include="package.json" />
  <None Include="tsconfig.json" />
</ItemGroup>
希望这能有所帮助。

1
刚找到与您的答案相同的解决方案后才看到它^^。因此,我只是添加了这些信息:这个解决方案也适用于vs2019(并且是我认为防止文件被发布的最佳和最简单的方法)。 - ggo

18

对于Visual Studio 2019,我使用以下代码成功地将名为“dummy”的wwwroot子文件夹(包括其所有子文件夹)从发布输出中排除:

<ItemGroup>
  <Content Update="wwwroot\dummy\**\*">
    <CopyToPublishDirectory>Never</CopyToPublishDirectory>
  </Content>
</ItemGroup>
注意:要求将wwwroot及其子文件夹包含在项目中,但在发布时排除掉。

12

要在发布时排除文件,请编辑您的发布文件,例如FolderProfile.pubxml,并添加下面显示的适当的 XML 元素来包含/排除文件和文件夹。

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" 
         xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <PropertyGroup>
    <WebPublishMethod>FileSystem</WebPublishMethod>
    <PublishProvider>FileSystem</PublishProvider>
    <LastUsedBuildConfiguration>Release</LastUsedBuildConfiguration>
    <LastUsedPlatform>Any CPU</LastUsedPlatform>
    <SiteUrlToLaunchAfterPublish />
    <LaunchSiteAfterPublish>True</LaunchSiteAfterPublish>
    <ExcludeApp_Data>False</ExcludeApp_Data>
    <PublishFramework />
    <ProjectGuid>afa9f185-7ce0-4935-9da1-ab676229d68a</ProjectGuid>
    <publishUrl>bin\Release\PublishOutput</publishUrl>
    <DeleteExistingFiles>False</DeleteExistingFiles>
  </PropertyGroup>
  <ItemGroup>

    <!-- CopyToPublishDirectory = { Always, PreserveNewest, Never } -->

    <!-- Copying a file located outside of the project into the published site's wwwroot folder. -->
    <ResolvedFileToPublish Include="..\ReadMe2.md">
      <RelativePath>wwwroot\ReadMe2.md</RelativePath>
      <CopyToPublishDirectory>PreserveNewest</CopyToPublishDirectory>
    </ResolvedFileToPublish>

    <!-- Excluding the wwwroot\Content folder. -->
    <Content Update="wwwroot\Content\**\*" CopyToPublishDirectory="Never" />

    <!-- Excluding the Views\Home\About2.cshtml file. -->
    <Content Update="Views\Home\About2.cshtml" CopyToPublishDirectory="Never" />
  </ItemGroup>
</Project>

另请参阅:Visual Studio 发布配置文件 - 选择性文件包含


1
这种方法不会排除通过引用 NuGet 包包含的文件,其中包含了不需要的文件。 - undefined

8

使用@Craig Wilson提供的方法可以很好地在Visual Studio 2022和Core 6中发布。

以下是一个示例,当您在系统级别设置环境变量ASPNETCORE_ENVIRONMENT=QA时,可以排除所有appsettings,除了appsettings.json和appsetting.QA.json。

在Windows中,您还可以在运行dotnet pubish命令的同一powershell中设置环境变量。

$env:ASPNETCORE_ENVIRONMENT = 'QA'

当您关闭该powershell时,该变量将被删除。

    <!-- Publish Settings -->
    <ItemGroup>
        <Content Update="appsettings.*.json">
        <CopyToPublishDirectory>Never</CopyToPublishDirectory>
        </Content>  
        <Content Update="appsettings.$(ASPNETCORE_ENVIRONMENT).json">
        <CopyToPublishDirectory>Always</CopyToPublishDirectory>
        </Content>  
        <Content Update="appsettings.$(ASPNETCORE_ENVIRONMENT).json">
        <CopyToPublishDirectory>Always</CopyToPublishDirectory>
        </Content>      
    </ItemGroup>   

请注意,在 Visual Studio 2022 中,默认情况下包含所有文件,您只需要使用“更新”即可。


1
这种方法不会排除通过引用NuGet包包含的文件,其中包含了不需要的文件。 - undefined

4
在我的情况下,我需要在本地调试时使用local.settings.json文件,但是我不想在发布或部署时将它包含在我的WebDeploy压缩文件中。
  <ItemGroup>
    <Content Include="..\local.settings.json" Link="local.settings.json" Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    </Content>
    <Content Include="..\local.settings.json" Link="local.settings.json" Condition="'$(Configuration)|$(Platform)'=='Release|AnyCPU'">
      <CopyToOutputDirectory>Never</CopyToOutputDirectory>
    </Content>
  </ItemGroup>

**


为什么要添加第二个释放条件?难道“从不”不是默认行为吗? - Itamaram

3
我注意到我的文件夹中只有几个文件没有被发布- 我尝试右键单击项目中的文件夹,看是否可以选择一个选项将该文件夹包含在部署中- 但那里没有这个选项,但我发现如果我选择文件夹内的文件,并标记它们为在部署时复制,它将复制这些文件并在此过程中创建它们的文件夹。

如果您的文件夹中有文件,则此方法会有所帮助,但如果您的文件夹是空的,则没有用。


这真的帮了我很多。 - tala9999

2

编辑.csproj文件以手动排除文件/文件夹不被发布。

您也可以参考此链接

有关Web部署,请参见https://blogs.msdn.microsoft.com/webdev/2010/04/22/web-deployment-excluding-files-and-folders-via-the-web-applications-project-file/

project.json现已被csproj取代。您可以在https://www.stevejgordon.co.uk/project-json-replaced-by-csproj上阅读更多相关信息。

有关升级现有的.NET Core 1.0项目或使用.NET Core 1.1的信息,可以阅读https://blogs.msdn.microsoft.com/dotnet/2016/11/16/announcing-net-core-1-1/


是的,我知道关于使用csproj而不是project.json,但包含/排除部分在哪里? - hcp
更新了我的回答。 - Shridhar R Kulkarni

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