2012-02-01 58 views
14

Có thể buộc các gói NuGet ghi đè lên các tệp hiện có không? Tôi cần một cách tốt đẹp của việc áp dụng các bản vá lỗi (tập tin, dll, tài nguyên) trên 3 dự án tương tự và thông qua đó điều này có thể là một giải pháp tốt đẹp.nuget ghi đè lên các tệp

Trả lời

12

Nó có thể được thực hiện với PowerShell và một gói phụ thuộc ...

Tôi có một gói NuGet rằng tôi có thể tạo cho ASP.NET MVC nó có tất cả các tập tin mà tôi muốn thêm vào dự án MVC chuẩn (DisplayTemplates, EditorTemplate, Tiện ích mở rộng, BaseController, v.v.). Giả sử nó được gọi là "Company.WebMvc"

Tôi đã tạo một gói NuGet khác có tên "Company.WebMvc-Prep" Có tập lệnh Install.ps1 xóa mọi thứ tôi không muốn khỏi dự án Mvc chuẩn. Dưới đây là ví dụ về mã xóa các tệp Tập lệnh hiện có ...

param($installPath, $toolsPath, $package, $project) 

#Remove Script Files 

$scripts = $project.ProjectItems | Where-Object { $_.Name -eq "Scripts" } 

if ($scripts) { 

    $scripts.ProjectItems | ForEach-Object { $_.Delete() } 

} 

Sau đó, tôi làm cho "Company.WebMvc-Prep" là sự phụ thuộc của "Company.WebMvc". Tại sao? vì Install.ps1 (bình thường) được chạy sau khi NuGet thêm các tệp từ thư mục nội dung. Tôi cần nó để xóa các tập tin đầu tiên sau đó thêm những cái mới. Vì vậy, khi bạn gọi ...

Install-Package Company.WebMvc

Company.WebMvc-Prep được cài đặt đầu tiên vì nó là một sự phụ thuộc (chạy Install.ps1)

Sau đó Company.WebMvc được cài đặt thêm nội dung của bạn.

Dài và ngắn gọn là ... Bạn Có thể ghi đè lên nội dung hiện có trên dự án của bạn thông qua gói NuGet.

P.S. Hãy nhớ rằng bạn cũng có thể bạn một phần các lớp để cô lập mã gói NuGet so với mã cụ thể của dự án.

+0

Rất cám ơn vì điều này. Đó chính xác là những gì tôi đang tìm kiếm.Đã không nghĩ về con đường phụ thuộc. Điều này cũng đảm bảo rằng tôi tuyên bố rõ ràng những tệp nào cần xóa và cập nhật, ít bị lỗi hơn. – keeney

+0

Tôi đã thử loại giải pháp này, tuy nhiên trong trường hợp của tôi, mỗi khi một phiên bản mới của gói được cài đặt, tôi muốn xóa các tệp cũ và đặt các tệp mới tại chỗ. Điều này đòi hỏi tôi phải cập nhật phiên bản gói Prep mỗi khi gói chính được cập nhật ... Tôi đã tự hỏi nếu tôi có thể tránh điều này. – rekna

5

Ghi đè tệp nội dung không được hỗ trợ ngay hôm nay.

+0

Bất kỳ ý tưởng nào nếu/khi nào? Chúng tôi muốn sử dụng nuget để hỗ trợ việc phân phối/đồng bộ hóa cấu hình được chia sẻ (bên thứ ba) mà chúng tôi phụ thuộc vào. Nó sẽ là trơn nếu có một thuộc tính ghi đè như vậy = "true", hoặc một cái gì đó tương tự. Bằng cách này chúng tôi có thể đặc biệt về những tập tin mà chúng tôi cho phép để được ghi đè (hành vi mặc định là như bây giờ.) Nếu đã có một vấn đề codeplex cho điều này tôi đã bỏ lỡ nó. –

+0

Nếu không có bạn nên thêm – davidfowl

+1

http://nuget.codeplex.com/workitem/278 - dường như được dự kiến ​​cho vNext (2.3) :) –

4

Như David Fowler đề xuất trong cuộc thảo luận này http://nuget.codeplex.com/discussions/252305 bạn có thể triển khai tệp trong thư mục tạm thời và sau đó ghi đè lên vị trí ban đầu bằng cách sử dụng tập lệnh PowerShell.

1

Mặc dù bạn dường như không thể chỉ định điều này cho tất cả các lượt cài đặt của gói (theo các câu trả lời khác), nhưng thực sự có thể chỉ định nó cho một lần cài đặt. Cài đặt gói với:

Install-Package com.company.mypackage -FileConflictAction Overwrite 

Thao tác này sẽ tự động ghi đè tất cả các tệp xung đột trong quá trình cài đặt.

+0

Cảm ơn ý tưởng, nhưng nó không hiệu quả với tôi. Theo [doc chính thức] (https://docs.microsoft.com/en-us/nuget/tools/ps-ref-update-package) -FileConflictAction sẽ được áp dụng cho các tệp được tham chiếu trong dự án. Thật không may đó không phải là trường hợp của tôi. –

Các vấn đề liên quan