首页 > 解决方案 > 如果文件尚不存在,如何使用 Nuget 和 nuspec 文件添加文件

问题描述

在创建 nuget 包并设置 nuspec 文件时,有没有办法仅在文件不存在时才添加该文件?

我不希望在每次更新时都替换文件。

我已经看到了这个答案,但它似乎并不完整。

假设我想要一个名为“example.css”的文件包含在一个新项目中,但仅在第一次安装时,我该如何实现?

在我的 nuspec 文件中,我将有这一行:

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

但它会覆盖那里的任何东西。

标签: .netvisual-studionugetnuget-package

解决方案


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

从昨天开始,我一直在为这个问题而痛苦。首先,我的想法与您问题中提供的链接中接受的答案相同,在具有如果文件已存在的功能install.ps1的文件夹中使用,则nuget update 不会覆盖它。所以我试图创建这个,但我失败了。Toolsexample.cssinstall.ps1

那是因为:

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

详述原因1:

根据文档在 NuGetpackage 安装和删除期间运行 PowerShell 脚本

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

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

为了验证它,我创建了一个测试示例 nuget 包.nuspec

<?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被执行了。

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

在此处输入图像描述

当我们更新 nuget 包时,nuget 会先更新包并覆盖内容,然后执行文件install.ps1。所以看来我们无法使用该文件install.ps1来防止 NuGet 覆盖该文件example.css文件。

详述原因2:

如果你注意上面动画中的升级过程,你会发现在升级包的时候,nuget会先删除包含内容的包然后重新安装新版本的包。所以,nuget在我们更新包的时候会先删除包及其内容,条件判断文件存在的结果总是否定的。NuGet 会将新版本 nuget 包中的 .css 文件添加到项目中。

如果您必须防止 nuget 覆盖此/那些文件,作为此问题的解决方法,您可以在新的 nuget 包中包含此/那些文件,此/那些文件不会在升级原始包时的新 nuget 包。

希望这可以帮助。


推荐阅读