首页 > 解决方案 > 在构建时在 NuGet 包中包含文件,仅当它不存在时

问题描述

前段时间我问了这个问题:

在 NuGet 包中包含一个文件夹并将其作为文件 .netcore/Razor 安装到项目中

答案让我大部分时间都想去,但问题是在我的项目中重建或更新 NuGet 包现在覆盖用户可编辑的文件。

我觉得答案在 .props 文件中的某个地方,但我不确定如何实现它:

<Project>
  <Target Name="CopyFiles" BeforeTargets="Build" >
   <ItemGroup>
      <File  Include="$(MSBuildThisFileDirectory)..\Pagesettings\*.*"></File>
   </ItemGroup>
    <Copy SourceFiles="@(File)" DestinationFolder="$(ProjectDir)Pagesettings"></Copy>
  </Target>
</Project>

Target标签有一个可选属性Condition。我猜这可以以某种方式使用......?

所以,为了澄清我的问题:

从上面链接的原始问题中,我有一个 NuGet 包,下载该包时会创建一个名为 的文件夹PageSettings,其中会复制一堆包含来自我的 NuGet 包的 PageSettings的默认JSON 文件。笔记; 这些文件最初在 Visual Studio 中显示为链接文件。在构建项目之前,它们实际上不会被复制到目录中。

但是,这些 PageSettings 文件的目的是作为我的 NuGet 包用户的 PageSettings 的默认值,或者如果您喜欢示例。安装后,用户可以并且应该更改这些 .JSON 文件,因此现在当他们的项目被重建时,或者如果他们安装的 NuGet 包有更新,这些 JSON 文件不应该更新/安装。

标签: visual-studionugetnuget-package

解决方案


当然。我的回答确实有一些缺陷。为防止覆盖现有文件和已更改的文件,建议您使用xcopywith /d。它不会覆盖现有文件。

相反,在test.props文件中使用它:

<Project>
  <Target Name="CopyFiles" BeforeTargets="Build">
    <ItemGroup>     
      <File Include="$(MSBuildThisFileDirectory)..\Pagesettings\*.*"></File>          
    </ItemGroup>
      <Exec Command="xcopy /s/d/y @(File) $(ProjectDir)Pagesettings\"></Exec>
      
      
      <!--<Copy SourceFiles="@(File)" DestinationFolder="$(PorojectDir)Pagesettings" Condition="!Exists('$(PorojectDir)Pagesettings\*.*')"></Copy>-->
  </Target>
</Project>

然后,重新打包您的 nuget 项目。在使用这个新的之前,请先清理 nuget 缓存。


推荐阅读