【问题标题】:ASP.NET Core: Exclude or include files on publishASP.NET Core:在发布时排除或包含文件
【发布时间】:2017-03-10 06:50:22
【问题描述】:

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

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

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

【问题讨论】:

    标签: c# asp.net asp.net-core visual-studio-2017


    【解决方案1】:

    来自documentation:例如,如果您希望指定一些文件与您的应用一起发布,您仍然可以使用csproj 中的已知机制(例如,<Content> 元素)。

    ItemGroupelements 有一个CopyToPublishDirectory 属性,用于确定是否将文件复制到发布目录,可以具有以下值之一:

    • 总是,
    • 保留最新
    • 从不

    注意,输出文件夹也有类似的CopyToOutputDirectory 属性。

    示例(来自here):

    <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 repo 中的 MigratePublishOptionsRule 类。

    【讨论】:

    • MigratePublishOptionsRule 链接已失效。
    • 此答案适用于 Visual Studio 2017 15.3 之前的项目。最新项目请参考@Wagner-Pereira
    • 我有 PreserveNewestPreserveNewest从不我希望在发布期间复制readme.html,但它没有这样做。
    【解决方案2】:

    在 Visual Studio 15.3 及更高版本的 .csproj 中,这使文件在 Visual Studio 中可见(而“内容删除”则不可见),并防止文件被发布。

    <ItemGroup>
        <Content Update="appsettings*.json" CopyToPublishDirectory="Never" />
    </ItemGroup>
    

    【讨论】:

    • 这是一个比公认答案更好的解决方案!请注意 Update 属性,以便您可以将其应用于默认情况下已包含在项目中的文件,因为它们位于根文件夹下
    • 我也同意。这也适用于 VS 2019 版本 16.0.0(刚刚测试)
    • 确认这仍然有效。尝试了上面的所有方法,但没有任何效果,但是这个成功了。
    【解决方案3】:

    Visual Studio 2017 15.3 之后

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

    <ItemGroup>
      <Content Remove="src\**" />
      <Content Remove="node_modules\**" />
    </ItemGroup>
    

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

    【讨论】:

    • 这是现在有效的解决方案。 CopyToPublishDirectory 或 CopyToOutputDirectory 在 15.3 之后根本不起作用
    【解决方案4】:

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

    它将像这样更新您的.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>
    

    希望这会有所帮助。

    【讨论】:

    • 在为 vs2019 找到相同的解决方案后才看到您的答案^^。所以我只添加此信息:此解决方案也适用于 vs2019(并且是防止文件被发布恕我直言的最佳和最简单的方法)。
    【解决方案5】:

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

    <ItemGroup>
      <Content Update="wwwroot\dummy\**\*">
        <CopyToPublishDirectory>Never</CopyToPublishDirectory>
      </Content>
    </ItemGroup>
    

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

    【讨论】:

      【解决方案6】:

      要在发布时排除文件,请编辑您的发布文件,例如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 publish profiles - Selective file inclusion

      【讨论】:

        【解决方案7】:

        在我的情况下,我在调试期间需要本地 local.settings.json,但我不希望它在发布构建或发布期间包含在我的 WebDeploy zip 文件中:

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

        **

        【讨论】:

        • 为什么要添加第二个释放条件? Never 不是默认行为吗?
        【解决方案8】:

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

        如果您的文件夹中有文件,这会有所帮助,但如果您的文件夹为空,则无济于事。

        【讨论】:

        • 这对我很有帮助。
        【解决方案9】:

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

        也可以参考this

        有关网络部署,请参阅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,但是包含/排除部分在哪里?
        • 更新了我的答案。
        【解决方案10】:

        在 Visual Studio 2019 中

        1. 右键单击文件 -> 属性
        2. 复制到输出目录-> 始终复制

        1. 保存解决方案并尝试发布

        【讨论】:

          【解决方案11】:

          Visual Studio 2019:

          1. 在“解决方案资源管理器”中转到文件的“属性”
          2. 将“复制到输出目录”属性更改为所需的值(“始终复制”、“不复制”、“如果更新则复制”)。

          【讨论】:

            【解决方案12】:

            在视觉工作室 2022 中: 卸载csproj,打开文件 要添加内容和子文件夹,请插入:

            <ItemGroup>
                    <None Update="StaticContent\**">
                        <CopyToOutputDirectory>Always</CopyToOutputDirectory>
                    </None>
                </ItemGroup>
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2019-07-12
              • 2017-01-05
              • 2020-09-06
              • 1970-01-01
              相关资源
              最近更新 更多