2008-12-10 37 views
5

Tôi có một ứng dụng có nhiều tệp chứa thông số cấu hình và dữ liệu khác thay đổi khi người dùng sử dụng ứng dụng. Những tệp này có thể thay đổi với các phiên bản mới hơn của phần mềm của tôi, nhưng người dùng cũng có thể sửa đổi chúng (hoặc chúng có thể được thay đổi bởi chính ứng dụng). Về cơ bản, tôi đang tìm một giải pháp để ngăn chặn những thay đổi của người dùng đối với những tệp này bị ghi đè nhưng cũng là một cách để cài đặt các tệp được cập nhật tiềm năng khi người dùng nâng cấp phần mềm của tôi.Quản lý tập tin cấu hình với WiX

Với RPM trên * NIX bạn có thể sử dụng hàm% config để xác định tệp dưới dạng tệp cấu hình và RPM sau đó đổi tên tệp hiện có (nếu có) và cài đặt tệp mới trên bản nâng cấp (có thể không lý tưởng, nhưng tôi có thể sống với một cái gì đó như thế này cho WiX).

Tôi muốn cài đặt tệp cấu hình của mình vào thư mục con hoặc thậm chí một tên khác (ví dụ: default.cfg) và sau đó sử dụng phần tử <CopyFile> trong WiX để sao chép tệp vào vị trí chính xác của chúng. Bằng cách này, các tệp mặc định sẽ bị xóa khi cài đặt và ghi đè lên bản nâng cấp, nhưng các tệp người dùng thực tế sẽ giữ nguyên. Thật không may với <CopyFile>, Windows Installer vẫn muốn quản lý (và loại bỏ) tệp đích.

Tôi cũng đã xem xét sử dụng hành động QtExec trong WixUtilExtension để cơ bản làm "sao chép default.cfg reallocation.cfg" nhưng điều này sẽ không hoàn toàn hoạt động và nó là một chút của một hack.

Cách chính xác để xử lý điều này là gì?

Trả lời

2

Tôi nghĩ rằng không có cách "sạch" để làm điều này, bởi vì một dự án msi phải có khả năng tự gỡ cài đặt hoàn toàn theo thiết kế. Tôi nghĩ rằng cách tốt nhất để giải quyết điều này, là bằng cách sử dụng một hành động tùy chỉnh mà thực hiện một tập tin thực thi và đặt logic cập nhật configfile của bạn trong tập tin thực thi đó. Các hành động tùy chỉnh trông như thế này (chỉ có phần liên quan):

<Directory Id="MYDIR" Name="MyDir"> 
    <Component Id="update.cmd" Guid="YOUR-GUID"> 
     <File Id="update.cmd" Name="update.cmd" KeyPath="yes" 
       Source="source\update.cmd" /> 
    </Component> 
</Directory> 

<CustomAction Id='RunUpdate' Directory='MYDIR' 
     ExeCommand='[SystemFolder]cmd.exe /c update.cmd' Return='ignore'/> 

<InstallExecuteSequence> 
    <Custom Action='RunUpdate' After='InstallFinalize'>NOT Installed</Custom> 
</InstallExecuteSequence> 
4

Khuyến cáo của tôi thường là phải có người sử dụng có thể chỉnh sửa nội dung trong một file riêng biệt và quản lý mà qua ứng dụng thay vì cài đặt. Điều đó cũng có nghĩa là tệp riêng biệt là "nội dung của người dùng" và phải được bỏ ra khỏi quá trình cài đặt.

Tôi đã tìm cách cố gắng di chuyển dữ liệu người dùng một cách rõ ràng là khó đoán. Cố gắng để làm điều đó tại thời gian thiết lập khi bạn cần phải suy nghĩ thông qua cài đặt, gỡ bỏ cài đặt, sửa chữa, vá và rollback cho tất cả những trường hợp chỉ làm cho nó tồi tệ hơn.

Ví dụ: hành vi RPM thực hiện "sửa chữa" là gì. Sao chép dữ liệu người dùng ra khỏi đường và thay thế bằng một tệp tốt? Điều đó có thể đúng 60% - 80% thời gian. Và gỡ cài đặt, tệp có nên bị xóa không? Đó là khó khăn nếu người dùng sẽ chỉ nâng cấp lên phiên bản tiếp theo.

Một lần nữa, tốt hơn để cho phép họ quyết định phải làm gì với các chỉnh sửa của họ đối với cấu hình. IMHO.

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