2009-12-16 42 views
7

Phiên bản MyApp 1.0 chứa tệp foo.dll. Phiên bản của tệp này là phiên bản 10.5.567. Bây giờ MyApp là phiên bản 2.0 và phiên bản của foo.dll là 2.0.123. Phiên bản là LOWER so với phiên bản cũ. Nhà cung cấp đã viết dll này đã quyết định quay lại với số phiên bản tệp. Đây không phải là quyết định mà tôi có thể thay đổi.Cài đặt tệp bất kể số phiên bản với WiX

Làm thế nào để WiX luôn cài đặt tệp này?

Hành động RemoveExistingProducts được lên lịch sau hành động InstallFinalize và cũng không thể thay đổi.

InstallShield có cờ 'luôn ghi đè' nhưng tôi không nghĩ rằng tôi có thể bắt chước điều này mà không thay đổi hành vi của tất cả các tệp thông qua trình chuyển đổi trình biên dịch. Tôi không muốn cái này. Tôi chỉ muốn cập nhật tập tin này.

Tôi cũng đã cố gắng

<RemoveFile Id="foo.dll" On="install" Name="foo.dll" /> 

Nhưng điều này đã không làm việc một trong hai. Tôi sẽ nhận được 'Lỗi 2753 Tệp foo.dll không được đánh dấu để cài đặt' sau này.

Trả lời

3

Điều này là không dễ dàng vì nó trái với hành vi tiêu chuẩn của gói MSI. Khi biên dịch, bạn phải thiết lập các tùy chọn supress-file với -sf trong light.exe. Sau đó, không có tập tin-thông tin từ các tập tin của bạn đọc. Bạn có thể đặt DefaultVersion phiên bản này sẽ được sử dụng. Tôi cũng đã sử dụng RemoveFile trong một giải pháp, nhưng tôi có thể nói rằng nó hoạt động. Tôi đã thêm nó trong cùng một componente, nơi tôi thêm tập tin.

<Component> 
     <File DiskId="1" Id="fooDLL" Name="foo.dll" Vital="yes" 
     DefaultVersion="$(var.MAJORVERSION).$(var.MINORVERSION).$(var.BUILDVERSION)" 
     DefaultLanguage="0"></File> 
     <RemoveFile Id='RemoveOldDLL' On='install' Name='foo.dll'/> 
    </Componente> 

Đây không phải là cách sạch sẽ, nhưng để xóa phiên bản cũ phù hợp với tôi.

+0

Rất cố gắng, nhưng có thể. Xem trả lời của tôi trong chủ đề này cho một liên kết đến một danh sách các cách tiếp cận khác nhau. –

+0

Tôi đã thử sử dụng DefaultVersion để cài đặt tệp .MDE và nó hoạt động tốt khi tôi cài đặt bản vá, tệp được ghi đè chính xác. Vấn đề duy nhất là bản vá sẽ không gỡ cài đặt. Nhật ký cài đặt cho biết "Tệp mới được phiên bản - tệp hiện có không phiên bản" và gỡ cài đặt được gọi cho phương tiện gốc. Tôi vẫn chưa giải quyết được điều này nên mọi lời đề nghị sẽ được hoan nghênh. – Dave

1

tôi đã trả lời một câu hỏi tương tự một khi trở lại: Forcing an upgrade of a file that is modified during its initial installation

Tôi nghĩ rằng tôi sẽ sử dụng một tập tin đồng hành để giải quyết vấn đề này, nhưng bạn có thể nhận được lỗi xác nhận kể từ khi tập tin trong câu hỏi là một dll và do đó được coi là một thực thi. Tôi tin rằng nó vẫn sẽ hoạt động, và đáng tin cậy như vậy.

-1

Một điều có thể đáng thử là đặt sớm RemoveExistingProducts thực sự theo thứ tự. MSI nên loại bỏ chương trình cũ trước, sau đó cài đặt nâng cấp. Điều này sẽ giải quyết vấn đề của bạn. ví dụ.

<InstallExecuteSequence> 
    <RemoveExistingProducts After="CostFinalize" /> 
</InstallExecuteSequence> 
+0

Đáng buồn thay, nó phải xảy ra * trước * CostFinalize (vì CostFinalize là bước mà MSI đánh giá tệp nào cần cập nhật) - và theo như tôi có thể nói, RemoveExistingProducts không được phép được sắp xếp thứ tự sớm. Nếu bạn tìm thấy một cách xung quanh nó, tôi rất muốn nghe về nó mặc dù. :) – jalf

1

Chú

Force luôn ghi đè lên trong đầu ra Light.exe với "InstallShield lừa":

XPath = "/ wixOutput/table [@ name = 'File']/hàng/lĩnh vực [5] "InnerText =„ 65535.0.0.0 "

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