有没有办法配置 nuGet 包,以便在项目中安装文件,前提是项目中不存在该文件?
具体来说,我的 nuGet 包包含一个自定义配置文件。安装后,用户将对文件进行修改。问题是当用户安装我的 nuGet 包的新版本时配置文件被替换 - 因此,丢失了他们的更改。我想防止这种情况。
有没有办法配置 nuGet 包,以便在项目中安装文件,前提是项目中不存在该文件?
具体来说,我的 nuGet 包包含一个自定义配置文件。安装后,用户将对文件进行修改。问题是当用户安装我的 nuGet 包的新版本时配置文件被替换 - 因此,丢失了他们的更改。我想防止这种情况。
假设您使用的是 Visual Studio,如果缺少 log4net.config,则需要部署它。
添加到 nuspec 文件:
<file src="tools/**/*.*" target="\" />
</files>
</package>
它将工具文件夹中的文件包含到包中
将文件 install.ps1 放置在工具文件夹中,其中包含类似于以下内容的代码:
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。然后,您可以使用任何存档管理器查看里面的内容。
可能是一个老问题,但无论如何,我也有这个问题:
这可以通过使用命令行手动更新包来完成,如PowerShell 参考中所示:
Update-Package [-Id] <string> [-IgnoreDependencies] [-ProjectName <string>] [-Version <string>] [-Source <string>] [-Safe] [-IncludePrerelease] [-Reinstall] [-FileConflictAction] [-WhatIf]
您需要使用的参数是-FileConflictAction
您必须设置为Ignore
.
编辑:问题是,这不适用于仅一个特定文件,因此您可能必须考虑重命名包中包含的配置文件。