.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的可能重复 我尝试了<Content Include="AppData\**" LinkBase="AppData" />
,但没有成功。
试试:<ItemGroup> <Content Include="AppData\**"> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> </Content> </ItemGroup>
@Bardr 它有效,但仅适用于包含文件/子文件夹的文件夹。我如何也可以复制空文件夹?
我不知道这是否可能,但有解决方法:<Target Name="CreateAppDataFolder" AfterTargets="AfterPublish"> <MakeDir Directories="$(PublishDir)AppData" Condition="!Exists('$(PublishDir)AppData')" /> </Target>
这将在发布后创建 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" 添加到您可以在其中放置一个占位符文件(或使用您现有的文件)。然后将文件添加到项目并设置文件属性:复制到输出目录:如果较新则复制或始终复制。
其他方式:添加构建后步骤命令,创建目录。
【讨论】:
【参考方案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)