是否可以强制nuGet包覆盖现有文件?我需要一个很好的方法来应用3个类似项目的补丁(文件,DLL,资源),这可能是一个很好的解决方案。
答案 0 :(得分:12)
可以使用powershell和包依赖项来完成...
我有一个为ASP.NET MVC创建的NuGet包,它包含我想要添加到标准Mvc项目的所有文件(DisplayTemplates,EditorTemplate,Extensions,BaseController等)。我们称之为“Company.WebMvc”
我创建了另一个名为“Company.WebMvc-Prep”的NuGet包,它有一个Install.ps1脚本,可以删除标准Mvc项目中我不想要的任何内容。以下是删除现有Scripts文件的代码示例...
param($installPath, $toolsPath, $package, $project)
#Remove Script Files
$scripts = $project.ProjectItems | Where-Object { $_.Name -eq "Scripts" }
if ($scripts) {
$scripts.ProjectItems | ForEach-Object { $_.Delete() }
}
然后我将“Company.WebMvc-Prep”设为“Company.WebMvc”的依赖项。为什么?因为在NuGet添加内容文件夹中的文件后运行Install.ps1(通常)。我需要它先删除文件然后添加新文件。所以当你打电话......
Install-Package Company.WebMvc
首先安装Company.WebMvc-Prep,因为它是依赖项(运行Install.ps1)
然后安装了Company.WebMvc,用于添加您的内容。
它的长短是......你可以通过NuGet包覆盖项目中的现有内容。
P.S。请记住,您也可以使用部分类来隔离NuGet包代码和项目特定代码。
答案 1 :(得分:5)
目前不支持覆盖内容文件。
答案 2 :(得分:4)
正如David Fowler在本次讨论中所说的那样 http://nuget.codeplex.com/discussions/252305 您可以将文件部署在临时文件夹中,然后使用PowerShell脚本在原始位置覆盖它们。
答案 3 :(得分:1)
虽然您显然无法为软件包的所有安装指定此项(根据其他答案),但实际上可以为单个安装指定它。使用以下命令安装软件包:
Install-Package com.company.mypackage -FileConflictAction Overwrite
这将自动覆盖安装过程中发生冲突的所有文件。