nuget覆盖文件

问题描述:

是否可以强制nuGet包覆盖现有文件?我需要在3个类似的项目中应用补丁(文件,DLL,资源)的一种很好的方式,并且通过这可能是一个很好的解决方案。nuget覆盖文件

它可以使用PowerShell和软件包的依赖关系来完成...

我有我的ASP.NET MVC创建NuGet包它有所有我想要添加到标准的MVC项目中的文件( DisplayTemplates,EditorTemplate,扩展,BaseController等)。假设它被称为“Company.WebMvc”

我创建了另一个名为“Company.WebMvc-Prep”的NuGet包,它具有Install.ps1脚本,可以从标准Mvc项目中删除任何不需要的内容。下面是删除现有脚本的代码示例文件...

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,准备”“Company.WebMvc”的依赖。为什么?因为在NuGet添加内容文件夹中的文件后,Install.ps1(通常)会运行。我需要它先删除文件然后添加新的文件。所以,当你打电话......

安装,包装Company.WebMvc

Company.WebMvc,准备第一次安装,因为它是一个依赖(运行Install.ps1)

然后安装Company.WebMvc它会添加您的内容。

总之和它是...你可以可以通过NuGet包覆盖项目上的现有内容。

P.S.请记住,您也可以使用部分类来分离NuGet包代码与项目特定代码。

+0

非常感谢。这正是我所期待的。没有想过依赖路线。这也确保我明确指出哪些文件需要删除和更新,哪些文件不太容易出错。 – keeney 2012-02-29 09:27:49

+0

我尝试过这种解决方案,但在我的情况下,每次安装新版本的软件包时,我都想删除旧文件并将新文件放在适当位置。这要求我每次更新主包时都要更新Prep版本...我想知道是否可以避免这种情况。 – rekna 2012-09-07 13:17:18

今天不支持覆盖内容文件。

+0

任何想法如果/何时?我们希望使用nuget来协助我们所依赖的共享(第三方)配置的分发/同步。如果有一个属性如overwrite =“true”,或者类似的东西,那将是光滑的。通过这种方式,我们可以特别关注哪些文件可以被覆盖(默认行为就像现在一样)。如果已经存在codeplex问题,我已经错过了它。 – 2013-03-21 20:56:50

+0

如果没有你应该添加一个 – davidfowl 2013-03-21 21:32:39

+1

http://nuget.codeplex.com/workitem/278-似乎是为vNext(2.3):) – 2013-03-21 22:51:27

正如David福勒建议在本次讨论 http://nuget.codeplex.com/discussions/252305 您可以在临时文件夹部署文件,然后通过使用PowerShell脚本在原来的位置覆盖它们。

尽管您显然无法为该软件包的所有安装指定此选项(根据其他答案),但实际上可以将其指定为单个安装。安装软件包:

Install-Package com.company.mypackage -FileConflictAction Overwrite 

这将自动覆盖所有在安装过程中发生冲突的文件。

+0

感谢您的想法,但它不适合我。根据[官方文档](https://docs.microsoft.com/en-us/nuget/tools/ps-ref-update-package)-FileConflictAction将应用于项目中引用的文件。不幸的是,这不是我的情况。 – 2018-02-06 08:42:10