.NET Core 在发布中包含文件夹

Posted

技术标签:

【中文标题】.NET Core 在发布中包含文件夹【英文标题】:.NET Core include folder in publish 【发布时间】:2019-07-12 18:00:02 【问题描述】:

我的 .NET Core 2.1 项目具有以下文件夹结构:

我如何在发布解决方案时包含文件夹 AppData 及其所有子文件夹和文件?

我尝试将此添加到 .csproj 文件中,但没有成功:

<ItemGroup>
    <Folder Include="AppData\*" />
</ItemGroup>

编辑

我也试过了,但没用:

<ItemGroup>
    <Content Include="AppData\**" LinkBase="AppData" />
</ItemGroup>

【问题讨论】:

dotnet core publish: include/exclude dir in output的可能重复 我尝试了&lt;Content Include="AppData\**" LinkBase="AppData" /&gt;,但没有成功。 试试:&lt;ItemGroup&gt; &lt;Content Include="AppData\**"&gt; &lt;CopyToOutputDirectory&gt;PreserveNewest&lt;/CopyToOutputDirectory&gt; &lt;/Content&gt; &lt;/ItemGroup&gt; @Bardr 它有效,但仅适用于包含文件/子文件夹的文件夹。我如何也可以复制空文件夹? 我不知道这是否可能,但有解决方法:&lt;Target Name="CreateAppDataFolder" AfterTargets="AfterPublish"&gt; &lt;MakeDir Directories="$(PublishDir)AppData" Condition="!Exists('$(PublishDir)AppData')" /&gt; &lt;/Target&gt; 这将在发布后创建 AppData 文件夹,如果它不存在。只有在发布时它为空时才会存在。 【参考方案1】:

添加这个:

<ItemGroup> 
  <Content Include="AppData\**"> 
    <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> 
  </Content> 
</ItemGroup>

如果AppData 文件夹不为空,则将其复制到您的.csproj 文件夹。对于空的AppData 文件夹,您可以使用此解决方法:

<Target Name="CreateAppDataFolder" AfterTargets="AfterPublish">
  <MakeDir Directories="$(PublishDir)AppData" Condition="!Exists('$(PublishDir)AppData')" /> 
</Target>

这将在发布后创建AppData 文件夹,如果它尚未包含在输出中。这意味着只有在发布时它为空时才会创建 AppData 文件夹。

【讨论】:

这是我更喜欢的实现,因为它不依赖于创建占位符文件。使用占位符文件方法,在某个地方,有人可能想知道为什么文件在那里并询问它的作用。 @Bardr 在构建中包含它之后(当 oublish 时)我们将如何检索文件夹内的文件?我尝试了很多方法,但我不断收到找不到文件夹的错误...在构建操作中,我将文件设置为内​​容【参考方案2】:

有一个简单实用的解决方案:

  <ItemGroup>
    <Content Include="AppData\**" CopyToPublishDirectory="PreserveNewest"/>
  </ItemGroup>

您可以在这里找到更多技巧: https://docs.microsoft.com/en-us/dotnet/core/tools/project-json-to-csproj

【讨论】:

如果您想指定一个文件夹来将文件放入发布目录中,也可以将 LinkBase="MyDirectory" 添加到 元素中。【参考方案3】:

您可以在其中放置一个占位符文件(或使用您现有的文件)。然后将文件添加到项目并设置文件属性:复制到输出目录:如果较新则复制或始终复制。

其他方式:添加构建后步骤命令,创建目录。

【讨论】:

【参考方案4】:

以上解决方案都不适合我。因此,我采用了与“React 项目模板”相同的方法,并将此代码添加到我的 .csproj 文件中:

  <Target Name="PublishFrontend" AfterTargets="ComputeFilesToPublish">
    <ItemGroup>
      <DistFiles Include="ClientApp\build\**" />
      <ResolvedFileToPublish Include="@(DistFiles->'%(FullPath)')" Exclude="@(ResolvedFileToPublish)">
        <RelativePath>%(DistFiles.Identity)</RelativePath>
        <CopyToPublishDirectory>PreserveNewest</CopyToPublishDirectory>
        <ExcludeFromSingleFile>true</ExcludeFromSingleFile>
      </ResolvedFileToPublish>
    </ItemGroup>
  </Target>

【讨论】:

在 Azure DevOps 中运行构建时,这对我仍然不起作用。此解决方案是否仅适用于本地发布? 我没有在 Azure 中构建,但它适用于我的 CI。我使用 AppVeyor。【参考方案5】:

第一个解决方案,如果运行 dotnet build 或 dotnet publish 将在 bin 中添加文件夹。

<ItemGroup>
  <None Update="AppData\**"  CopyToOutputDirectory="PreserveNewest"  />
</ItemGroup>

第二种解决方案,如果运行 dotnet publish 会在 bin 中添加文件夹。

<ItemGroup>
  <Content Include="AppData\**" CopyToPublishDirectory="PreserveNewest"/>
</ItemGroup>

【讨论】:

以上是关于.NET Core 在发布中包含文件夹的主要内容,如果未能解决你的问题,请参考以下文章

如何在 .NET Core 应用程序 docker 映像中包含依赖项?

使用 ASP.NET Core 在 POST 请求的标头中包含身份验证

在 .NET Core Docker 映像中包含共享 C 库 (.SO)

如何在 ASP.NET Core 中使用区域

如何在 ASP.NET Core 3.1 的另一个应用程序中包含用户管理器

我如何在 ASP.Net Core 2.1 mvc 应用程序中包含 System.Identitymodel 4.0