How to only add a file if it doesn't already exist using Nuget and the nuspec file

时间:2018-09-18 20:09:15

标签: .net visual-studio nuget nuget-package

When creating a nuget package and setting up the nuspec file, is there a way to only add the file if it does not already exist?

I don't want the file to be replaced on every update.

I have seen this answer, but it doesn't seem to be complete.

Let's say I want a file called "example.css" to be included in a new project, but only on first install, how can i achieve that?

In my nuspec file i will have this line:

<file src="css\example.css" target="content/css" />

But it overwrites anything that is there.

1 个答案:

答案 0 :(得分:0)

  

如何仅使用Nuget和nuspec文件添加文件(如果尚不存在)

自昨天以来,我一直在为这个问题苦难。首先,我的想法与您问题中提供的链接中的可接受答案相同,使用install.ps1文件夹中的Tools,其功能是如果已经存在example.css文件,则进行nuget更新不会覆盖它。因此,我尝试创建此install.ps1,但失败了。

那是因为:

  1. 文件install.ps1在包安装到 项目。
  2. 更新软件包将卸载包括内容的旧版本软件包。

详细原因如下:

根据文档Run PowerShell script during NuGetpackage installation and removal

  

Install.ps1在项目中安装包时运行。

我们可以获得隐藏的信息,文件Install.ps1在安装软件包后运行。

为了进行验证,我使用.nuspec创建了一个测试样本nuget包:

<?xml version="1.0"?>
<package >
  <metadata>
    <id>MyTestPackage</id>
    <version>1.0.0</version>
    <authors>Tester</authors>
    <owners>Tester</owners>
    <requireLicenseAcceptance>false</requireLicenseAcceptance>
    <description>Package description</description>
    <releaseNotes>Summary of changes made in this release of the package.</releaseNotes>
    <copyright>Copyright 2018</copyright>
    <tags>Tag1 Tag2</tags>
  </metadata>
  <files>
    <file src="bin\Debug\MyTestPackage.dll" target="lib\net462" />
    <file src="css\example.css" target="content\css\example.css" />
    <file src="Tools\install.ps1" target="Tools\install.ps1" />
  </files>
</package>

install.ps1的内容:

Start-Sleep -Seconds 20
write-host "Hello world!"
Start-Sleep -Seconds 5

然后我将MyTestPackage.nupkg添加到测试项目中,发现在执行install.ps1之前,内容已添加到项目中

然后我在example.css文件中创建了具有不同内容的2.0.0版本(仅供测试),然后将软件包从1.0.0更新为2.0.0,example.css将在执行install.ps1之前替换:

enter image description here

当我们更新nuget软件包时,nuget将更新该软件包并首先覆盖内容,然后执行文件install.ps1。因此,看来我们无法使用文件install.ps1来阻止NuGet覆盖文件example.css文件。

详细原因2:

如果您注意上面动画中的升级过程,您会发现在升级软件包时,nuget会首先删除包含内容的软件包,然后先重新安装新版本的软件包。因此,当我们更新软件包时,nuget会首先删除该软件包及其内容,条件判断文件存在的结果始终为负。 NuGet会将新版本nuget包中的.css文件添加到项目中。

如果您必须防止nuget覆盖该文件,那么,作为解决此问题的方法,您可以将此文件添加到新的nuget程序包中,而不会升级原始包时,新nuget包中的内容将被覆盖。

希望这会有所帮助。