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

hcp*_*hcp 44 c# asp.net asp.net-core visual-studio-2017

存在aspdotnet1.0包含/排除部分之前的project.json文件

{
  "exclude": [
    "node_modules",
    "bower_components"
  ],
  "publishExclude": [
    "**.xproj",
    "**.user",
    "**.vspscc"
  ]
}
Run Code Online (Sandbox Code Playgroud)

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

Set*_*Set 77

从文档:如果您希望指定,例如,某些文件要与您的应用程序一起发布,您仍然可以使用已知的机制csproj(例如,<Content>元素).

元素的CopyToPublishDirectory属性决定了是否将文件复制到发布目录,并且可以具有以下值之一:ItemGroup

  • 总是,
  • PreserveNewest
  • 决不

请注意,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>
Run Code Online (Sandbox Code Playgroud)

如果您对project.json -.csproj迁移使用CopyToPublishDirectory属性迁移发布选项的方式感兴趣,可以查看dotnet cli repo中的MigratePublishOptionsRule类.

  • 此答案适用于 Visual Studio 2017 15.3 之前的项目。最新项目请参考@Wagner-Pereira (4认同)

Wag*_*ira 25

在Visual Studio 2017 15.3之后

编辑.csproj文件以手动排除文件/文件夹的发布

<ItemGroup>
  <Content Remove="src\**" />
  <Content Remove="node_modules\**" />
</ItemGroup>
Run Code Online (Sandbox Code Playgroud)

参考:https://www.danielcrabtree.com/blog/273/fixing-the-duplicate-content-error-after-upgrading-visual-studio-2017

  • 这是现在有效的解决方案。15.3之后,CopyToPublishDirectory或CopyToOutputDirectory不再起作用 (2认同)

Cra*_*son 19

在.csprojVisual Studio 15.3和更高版本中,这使文件在Visual Studio中可见(而“ Content Remove”则不可见),并阻止了文件的发布。

<ItemGroup>
    <Content Update="appsettings*.json" CopyToPublishDirectory="Never" />
</ItemGroup>
Run Code Online (Sandbox Code Playgroud)

  • 我也同意。这也适用于 VS 2019,版本 16.0.0(刚刚测试) (3认同)
  • 为我工作。参考这里:https://docs.microsoft.com/en-us/aspnet/core/host-and-deploy/visual-studio-publish-profiles?view=aspnetcore-2.2#exclude-files (3认同)
  • 这是一个比公认答案更好的解决方案!注意Update属性,以便您可以将其应用于默认情况下已包含在项目中的文件,因为它们位于根文件夹下 (2认同)
  • 我可以确认这个解决方案在 Visual Studio 2022 / .Net Core 6 上对我有用 (2认同)

Ran*_*den 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>
Run Code Online (Sandbox Code Playgroud)

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


Gyö*_*ssy 11

随着Visual Studio的2017年(在15.6.5测试),你可以在该文件上右键单击解决方案资源管理器,并设置生成操作到无.

它将.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>
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助.


Moh*_*ood 11

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

<ItemGroup>
  <Content Update="wwwroot\dummy\**\*">
    <CopyToPublishDirectory>Never</CopyToPublishDirectory>
  </Content>
</ItemGroup>
Run Code Online (Sandbox Code Playgroud)

注意:要求是将 wwwroot 及其子文件夹包含在项目中,但在发布时排除。


Ger*_*one 8

@Craig Wilson 的解决方案非常适合与 Visual Studio 2022 和 Core 6 一起发布

以下是当您在系统级别设置环境变量(如 ASPNETCORE_ENVIRONMENT=QA)时排除除 appsettings.json 和 appsetting.QA.json 之外的所有 appsettings 的示例

在 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>   
Run Code Online (Sandbox Code Playgroud)

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