2012-02-01 186 views
14

是否可以強制nuGet包覆蓋現有文件?我需要在3個類似的項目中應用補丁(文件,DLL,資源)的一種很好的方式,並且通過這可能是一個很好的解決方案。nuget覆蓋文件

回答

12

它可以使用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

5

今天不支持覆蓋內容文件。

+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

1

儘管您顯然無法爲該軟件包的所有安裝指定此選項(根據其他答案),但實際上可以將其指定爲單個安裝。安裝軟件包:

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