Warm tip: This article is reproduced from serverfault.com, please click

visual studio-仅在不存在的情况下将文件包含在Build的NuGet包中

(visual studio - Include File in NuGet package on Build, only if it does not exist)

发布于 2020-12-02 10:32:53

不久前我问了这个问题:

在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该文件夹中会复制一堆包含NuSet包中的PageSettings默认JSON文件。笔记; 这些文件最初在Visual Studio中显示为链接文件。在构建项目之前,它们实际上不会复制到目录中。

但是,这些PageSettings文件的目的是为我的NuGet程序包的用户提供默认的PageSettings,或者,如果你愿意,例如。安装后,用户可以并且应该更改这些.JSON文件,因此,现在,当他们重建项目时,或者如果他们安装的NuGet软件包有可用更新,则这些JSON文件不应该更新/安装。

Questioner
Jamie Hartnoll
Viewed
11
Perry Qian-MSFT 2020-12-03 10:57:03

当然。我的回答有些缺陷。为防止覆盖现有文件和已更改的文件,建议你xcopy与一起使用/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缓存。