.net - 如果文件尚不存在,如何使用 Nuget 和 nuspec 文件添加文件
问题描述
在创建 nuget 包并设置 nuspec 文件时,有没有办法仅在文件不存在时才添加该文件?
我不希望在每次更新时都替换文件。
我已经看到了这个答案,但它似乎并不完整。
假设我想要一个名为“example.css”的文件包含在一个新项目中,但仅在第一次安装时,我该如何实现?
在我的 nuspec 文件中,我将有这一行:
<file src="css\example.css" target="content/css" />
但它会覆盖那里的任何东西。
解决方案
如果文件尚不存在,如何使用 Nuget 和 nuspec 文件添加文件
从昨天开始,我一直在为这个问题而痛苦。首先,我的想法与您问题中提供的链接中接受的答案相同,在具有如果文件已存在的功能install.ps1
的文件夹中使用,则nuget update 不会覆盖它。所以我试图创建这个,但我失败了。Tools
example.css
install.ps1
那是因为:
- 该文件在包安装到项目后
install.ps1
运行。 - 更新包将卸载旧版本包,包括内容。
详述原因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 包。
希望这可以帮助。
推荐阅读
- node.js - 应该以什么格式创建获取 POST 请求以访问 Imagga API?
- javascript - 剑道网格内联编辑提交功能
- c# - 枚举可以作为成员持有类吗?
- c++ - Flex/Bison Markdown 转 HTML 程序
- firebase - 使用 Firebase 规则自动删除节点
- android - Google 地方信息 Android
- stripe-payments - 如何将 Stripe-terminal-physical-device BBPOS-Chipper 2x 连接到 Android 应用程序以开始使用终端功能
- html - 我怎样才能给这些卡片元素相同的大小?
- asp.net - Request.Cookies(name) 和 Request.Cookies.Get(name) 有什么区别吗?
- c# - File.Exists 在许多异步任务之一中返回 false