有没有办法告诉nuGet将文件安装到项目中,只有文件不在项目中?

时间:2014-11-13 19:55:53

标签: nuget nuget-spec

是否有办法配置nuGet包,以便在项目内部安装文件,只有在项目中尚不存在该文件?

具体来说,我的nuGet包中包含一个自定义配置文件。安装后,用户将对文件进行修改。问题是当用户安装我的nuGet包的新版本时,配置文件被替换 - 因此,丢失他们的更改。我想阻止这一点。

2 个答案:

答案 0 :(得分:4)

假设您使用的是Visual Studio,如果缺少log4net.config,则需要部署它。

  • 创建"工具"带有* .nuspec文件的文件夹下的文件夹
  • 添加到nuspec文件:

         <file src="tools/**/*.*" target="\" /> 
      </files>
    </package>
    

它会将tools文件夹中的文件包含到包

  • 将文件install.ps1放在tools文件夹中,其代码类似于:

    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

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

答案 1 :(得分:0)

可能是一个老问题,但无论如何它仍然存在,因为我也有这个问题:

这可以通过使用命令行手动更新软件包来完成,如in the PowerShell reference所示:

Update-Package [-Id] <string> [-IgnoreDependencies] [-ProjectName <string>] [-Version <string>] [-Source <string>] [-Safe] [-IncludePrerelease] [-Reinstall] [-FileConflictAction] [-WhatIf]    

您需要使用的参数是-FileConflictAction,您必须将其设置为Ignore

编辑:问题是,这不仅适用于一个特定文件,因此您可能必须考虑重命名包中包含的配置文件。