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.
答案 0 :(得分:0)
如何仅使用Nuget和nuspec文件添加文件(如果尚不存在)
自昨天以来,我一直在为这个问题苦难。首先,我的想法与您问题中提供的链接中的可接受答案相同,使用install.ps1
文件夹中的Tools
,其功能是如果已经存在example.css
文件,则进行nuget更新不会覆盖它。因此,我尝试创建此install.ps1
,但失败了。
那是因为:
install.ps1
在包安装到
项目。详细原因如下:
根据文档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
之前替换:
当我们更新nuget软件包时,nuget将更新该软件包并首先覆盖内容,然后执行文件install.ps1
。因此,看来我们无法使用文件install.ps1
来阻止NuGet覆盖文件example.css
文件。
详细原因2:
如果您注意上面动画中的升级过程,您会发现在升级软件包时,nuget会首先删除包含内容的软件包,然后先重新安装新版本的软件包。因此,当我们更新软件包时,nuget会首先删除该软件包及其内容,条件判断文件存在的结果始终为负。 NuGet会将新版本nuget包中的.css文件添加到项目中。
如果您必须防止nuget覆盖该文件,那么,作为解决此问题的方法,您可以将此文件添加到新的nuget程序包中,而不会升级原始包时,新nuget包中的内容将被覆盖。
希望这会有所帮助。