是否有一种方法可以告诉nuGet仅当文件不在项目中时才将文件安装到项目中?

是否有一种方法可以告诉nuGet仅当文件不在项目中时才将文件安装到项目中?,nuget,nuget-spec,Nuget,Nuget Spec,是否有一种方法可以配置nuGet包,以便仅当项目中不存在文件时,才在项目中安装该文件 具体来说,我的nuGet包包含一个自定义配置文件。安装后,用户将对文件进行修改。问题是,当用户安装新版本的my nuGet软件包时,配置文件会被替换,从而丢失更改。我想防止出现这种情况。可能是一个老问题,但不管怎么说,我也遇到了这个问题: 这可以通过使用命令行手动更新包来完成,如图所示: 更新包[-Id][-IgnoreDependencies][-ProjectName][-Version][-Source]

是否有一种方法可以配置nuGet包,以便仅当项目中不存在文件时,才在项目中安装该文件


具体来说,我的nuGet包包含一个自定义配置文件。安装后,用户将对文件进行修改。问题是,当用户安装新版本的my nuGet软件包时,配置文件会被替换,从而丢失更改。我想防止出现这种情况。

可能是一个老问题,但不管怎么说,我也遇到了这个问题:

这可以通过使用命令行手动更新包来完成,如图所示:

更新包[-Id][-IgnoreDependencies][-ProjectName][-Version][-Source][-Safe][-IncludePrerelease][重新安装][-FileConflictAction][-WhatIf]
您需要使用的参数是
-FileConflictAction
,必须将其设置为
忽略


<>编辑:问题是,这对于一个特定的文件不起作用,所以您可能需要考虑重命名包中包含的配置文件。

假设您正在使用VisualStudio,如果缺少它,需要部署Log4NET.CONFIG。
  • 使用*.nuspec文件在文件夹下创建“工具”文件夹
  • 添加到nuspec文件:

         <file src="tools/**/*.*" target="\" /> 
      </files>
    </package>
    
使用(例如)创建包:


如果要查看生成的包,请将其重命名为*.zip。然后,您可以使用任何存档管理器查看其中的内容。

什么是$filesToMove?
     <file src="tools/**/*.*" target="\" /> 
  </files>
</package>
param($installPath, $toolsPath, $package, $project)

$log4netInProjectFolder = $project.ProjectItems | Where-Object { $_.Properties.Item("Filename").Value -eq "log4net.config" }

if ($log4netInProjectFolder -eq $null)
{
    Write-Host "File with path $deployTarget doesn't exist, deploying default log4net.config"

    foreach($item in $filesToMove) 
    {
        Write-Host "Moving " $item.Properties.Item("FullPath").Value
        (Get-Interface $project.ProjectItems "EnvDTE.ProjectItems").AddFromFileCopy($item.Properties.Item("FullPath").Value)
        (Get-Interface $item "EnvDTE.ProjectItem").Delete()
    }   
 }
 else
{
    Write-Host "File $deployTarget already exists, preserving existing file."
}
nuget pack PackageWithMyLogConfig.nuspec -Version 1.0.0