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

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

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

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

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

编辑

我也试过了,但没用:

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

【问题讨论】:

  • 我尝试了&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 文件夹,如果它不存在。只有在发布时它为空时才会存在。

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


【解决方案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>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多