2009-10-14 31 views
5

Tôi đã làm rối cài đặt WiX trên nhiều máy chủ để nó không còn xóa các tệp hoặc thành phần (hoặc thậm chí các tính năng khác) trong khi gỡ cài đặt. Nhật ký MSI cho thấy rằng BeforelyPinned = 1 trên tất cả các thành phần sẽ không gỡ cài đặt.Xóa thành phần GUID = "" được cài đặt với WiX

Tôi không có bất kỳ điều gì lạ mắt đang diễn ra như sử dụng tính năng SharedDll hoặc thậm chí là các thành phần được chia sẻ giữa các trình cài đặt khác nhau.

Tôi nghĩ rằng tôi đã theo dõi nó xuống một bản sửa đổi cụ thể của mã WiX của tôi. Tôi đã làm một vài điều ngu ngốc. Tôi (vô ý) đã tạo thành phần không được quản lý với một tờ trống rỗng Guid

<Component Id="file.ext" Guid=""> 
    <File .../> 
<Component> 

và tôi cũng thay đổi vị trí tệp của thành phần khác và Id (nhưng không phải là Hướng dẫn). Tất cả các thành phần có trong các bản sửa đổi trước đó đều hiển thị PreviouslyPinned = 1 và sẽ không gỡ cài đặt và các thành phần mới được thêm sau khi cài đặt/gỡ cài đặt bản sửa đổi chính xác.

Làm cách nào để trình cài đặt của tôi trở lại bình thường và xóa các thành phần được ghim trước đây?

Trả lời

5

Trình cài đặt Windows thực sự hỗ trợ khái niệm một GUID trống GUID. Nó có nghĩa là "cài đặt, nhưng không đăng ký thành phần": http://msdn.microsoft.com/en-us/library/aa368007(VS.85).aspx (mục ComponentId giải thích những gì xảy ra với một GUID rỗng).

Tôi vừa thử nghiệm với WIX và nó dường như tôn trọng một mục GUID trống (nghĩa là không có guid được tạo tự động). Ghi tỷ lệ 1: quy tắc 1 giữa đường dẫn tuyệt đối/lối chínhGUID:

  • Nếu bạn thay đổi GUID, một đường dẫn tuyệt đối mới nên được sử dụng cho đường dẫn chính thành phần.
  • Nếu bạn thay đổi đường dẫn tuyệt đối (ví dụ bằng cách đổi tên một tệp hoặc di chuyển nó), bạn nên thay đổi GUID.

Tóm lại, tham chiếu GUID đếm đường dẫn khóa cài đặt của thành phần chứ không phải tệp - có thể di chuyển, nhưng tệp có nhận dạng mới qua GUID mới (nghĩ về hai tệp có cùng tên trong các thư mục khác nhau - chúng là các tệp khác nhau, các định danh khác nhau).

Dọn dẹp sai số tham chiếu GUID có thể hơi lộn xộn một chút. Tôi thấy rằng nếu tôi có thể thay đổi tên tập tin có hiệu quả loại bỏ vấn đề. Tôi cũng tạo ra một hướng dẫn mới và do đó phá vỡ liên kết đến số lượng ref của guid cũ. Bạn cũng có thể đổi tên thư mục cài đặt (điều này lý tưởng có nghĩa là tất cả các GUID thành phần cũng phải được thay đổi). Khái niệm bảng RemoveFile có thể được sử dụng để xóa các tệp khi cài đặt và/hoặc gỡ cài đặt chưa được đăng ký làm thành phần (ví dụ: các tệp được tạo).

+0

Những gì tôi nghe bạn nói là, kể từ khi một GUID trống thậm chí không đăng ký một thành phần, nó sẽ không có hiệu lực trên các thành phần khác. Có đúng không? –

+0

Có, nói chung GUID trống sẽ không có hiệu lực trên các thành phần khác kể từ MSI bỏ qua nó sau khi cài đặt các tập tin. Tuy nhiên, hiếm khi thực tế mà không có sửa đổi: tệp được GUID trống cài đặt sẽ không được gỡ cài đặt. Nếu đây là tệp được phiên bản và bạn không thay đổi vị trí cài đặt trước khi thêm lại một guid, về mặt lý thuyết có thể tệp hiện có có thể chặn cài đặt phiên bản tệp mới (nếu tệp hiện có là phiên bản cao hơn). Ngoài ra còn có một số trường hợp không chắc chắn khác nếu bạn sử dụng nâng cấp nhỏ, nhưng nếu bạn không sử dụng nó, tôi sẽ không đi vào nó. –

+0

Cảm ơn câu trả lời chi tiết của bạn! Cuối cùng để có được mọi thứ khác để unstall đúng cách (loại bỏ các tham chiếu PreviouslyPinned = 1 từ bản ghi MSI), tôi đã phải vào registry trên máy tính đó và loại bỏ tất cả các thành phần từ trình cài đặt của tôi dưới HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ Installer \ UserData \ \ Thành phần dựa trên mẹo tôi tìm thấy ở đây http://blogs.msdn.com/icumove/archive/2008/06/17/windows-installer-error-2908-with-sub-errors- 1402-and-1450.aspx –

0

Thay đổi id của thành phần và sử dụng GUID hợp lệ sẽ làm mọi việc đúng.

+0

Tôi đã hy vọng bằng cách "làm mọi thứ đúng" nghĩa là bạn cho phép tất cả các thành phần PreviouslyPinned = 1 để gỡ cài đặt. Điều đó không xảy ra khi tôi thay đổi điều này. –

+0

Câu trả lời này không có ý nghĩa trong ngữ cảnh này. Sử dụng các thành phần với GUID là cách thông thường, nhưng ở đây chủ đề là các thành phần không có GUID. – Philm

0

Câu trả lời ngắn gọn là:

Có, sử dụng thành phần MSI không có GUID là loại phương pháp sao chép theo lô. Sao chép và quên. Tất nhiên bạn phải thêm một điều duy nhất: Xóa tất cả các tệp trước mỗi lần cài đặt hoặc gỡ cài đặt (điều kiện "REINSTALL hoặc PATCH hoặc REMOVE") hoặc Nâng cấp chính. Nếu không có điều đó, nó không thực sự có ý nghĩa. Bạn có thể làm điều đó trong một hành động tùy chỉnh, ngay cả với CMD.exe/c RD/S/Q .... (Tất nhiên, mã tùy chỉnh thanh lịch hơn thế này)

Nếu bạn làm đúng, bạn có thể quản lý các thiết lập khá đơn giản mà không cần tất cả các bẫy, MSI thường có. Tất nhiên sẽ dễ dàng hơn nếu bạn loại bỏ đệ quy toàn bộ thư mục theo từng tập tin.

Chưa thử, nhưng tôi sẽ: Có các thành phần "động" không có GUID và các thành phần thông thường và sau đó cung cấp bản vá. Về mặt lý thuyết, điều này sẽ có tác dụng và đây sẽ là giải pháp tốt cho một số vấn đề về vá, kết quả là tập hợp các tập tin thay đổi cao giữa các bản vá.

0

1. Trên thực tế, các thành phần không có GUID là phương pháp "liên kết tệp động" thực sự thường bị một số công cụ hoặc người đánh giá sai.

"cách" khác: 2. Tạo GUIDs tự động chỉ là một bước tự động hóa (nhưng tất nhiên một phần của mỗi thiết lập tốt xây dựng cơ sở hạ tầng :-) Trong mắt tôi đây không phải là tự động, bởi vì nếu bạn làm cho nó tự động, bạn làm sai:

2a. Tạo GUIDs hoàn toàn ngẫu nhiên mỗi lần => thuật toán sai

2b. Tạo GUID chỉ lần đầu tiên thành phần được tạo và đã triển khai nhận dạng "diff" thông minh cho các tài nguyên mới được đóng gói trong một thành phần mới => Phương thức đồng bộ hóa cây-tệp chỉ hoạt động. Nhưng bạn có thể làm sai nhiều ở đây ... Nó dành cho các chuyên gia.

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