[英]How to only add a file if it doesn't already exist using Nuget and the nuspec file
创建nuget包并设置nuspec文件时,有没有办法仅在不存在的情况下添加该文件?
我不希望每次更新都替换文件。
我已经看到了这个答案 ,但是它似乎并不完整。
假设我希望一个名为“ example.css”的文件包含在一个新项目中,但是仅在首次安装时,我该如何实现?
在我的nuspec文件中,我将显示以下行:
<file src="css\example.css" target="content/css" />
但是它会覆盖那里的所有内容。
如何仅使用Nuget和nuspec文件添加文件(如果尚不存在)
自昨天以来,我一直在为这个问题苦难。 首先,我的想法与您问题中提供的链接中的可接受答案相同,使用Tools
文件夹中的install.ps1
,其功能是,如果example.css
文件已经存在,则nuget update不会覆盖它。 因此,我尝试创建此install.ps1
,但失败了。
那是因为:
install.ps1
。 详细原因1:
根据文档在安装和删除NuGetpackage期间运行PowerShell脚本 :
在项目中安装软件包时,将运行
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,在执行install.ps1
之前将替换example.css
:
当我们更新nuget软件包时,nuget将更新该软件包并首先覆盖内容,然后执行文件install.ps1
。 因此,似乎我们不能使用文件install.ps1
来防止NuGet覆盖文件example.css
文件。
详细原因2:
如果你留意上面的动画升级过程中,你会发现,升级包时,会的NuGet 首先删除软件包,包括内容,然后重新安装新版本的包。 因此,当我们更新软件包时,nuget会首先删除该软件包及其内容,条件判断文件存在的结果始终为负。 NuGet会将新版本nuget包中的.css文件添加到项目中。
如果您必须防止nuget覆盖此文件,则可以使用新的nuget包中的此文件,以解决此问题。升级原始程序包时,新的nuget程序包。
希望这可以帮助。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.