2009-04-22 35 views
5

Tôi đang cài đặt một ứng dụng lớn và một phần là công cụ viết tùy chỉnh có tên "DbUpdateManager" để thực thi khối lượng lớn các tập lệnh SQL dựa vào cơ sở dữ liệu đích của chúng tôi.WiX - cố gắng tìm ra các chuỗi cài đặt

Ngay bây giờ, cài đặt WiX 2.x hoạt động - nhưng nó có một lỗ hổng: trong khi cài đặt, tôi cũng cài đặt một vài dịch vụ Windows, có thể được tùy chọn bắt đầu ngay lập tức. Tuy nhiên, những người đó sẽ thất bại, nếu DbUpdateManager chưa được chạy.

Vì vậy, những gì tôi đang cố gắng để thực hiện điều này là:

  1. Install DbUpdateManager và dịch vụ của tôi từ MSI tôi
  2. Run DbUpdateManager TRƯỚC bất kỳ dịch vụ khởi động

My nguồn WiX hiện tại trông giống như sau:

<Directory Id='INSTALLDIR' Name='DbUpdMgr' LongName='DbUpdateManager' > 
    <!-- DbUpdateManager component with the necessary files --> 
    <Component Id='DbUpdateManagerComponent' Guid='...' DiskId='1'> 
    <File Id='DbUpdateManagerFile' LongName='DbUpdateManager.Wizard.exe' 
      Name='DbUmWz.exe' src='DbUpdateManager.Wizard.exe' KeyPath='no' /> 
    </Component> 

    <!-- Component to install one of my Windows services --> 
    <Component Id='InstallServiceComponent' Guid='...' DiskId='1'> 
    <File Id='InstallServiceFile' LongName='MyService.exe' 
      Name='MyServic.exe' src='MyService.exe' KeyPath='yes'/> 
    <ServiceInstall Id='InstallMyService' Name='MyService' 
        Description='My Service' ErrorControl='normal' 
        Start='auto' Type='ownProcess' Vital='yes' /> 
    <ServiceControl Id='UninstallMyService' Name='MyService' 
        Remove='uninstall' Wait='yes' /> 
    </Component> 

    <!-- Feature for the DbUpdateManager referencing the above component -->  
    <Feature Id='DbUpdateManager' ConfigurableDirectory='INSTALLDIR' 
      AllowAdvertise='no' Description='DbUpdateManager' Level='1' 
      Title='Database Update Manager'> 
    <ComponentRef Id='DbUpdateManagerComponent'/> 
    </Feature> 

    <!-- Custom action for running DbUpdateManager -->  
    <CustomAction Id='RunDbUpdateManagerAction' FileKey='DbUpdateManagerFile' 
       ExeCommand='' Return='asyncWait' /> 

    <!-- Calling the custom action in the install sequence -->  
    <InstallExecuteSequence> 
     <RemoveExistingProducts After='InstallInitialize' /> 
     <Custom Action='RunDbUpdateManagerAction' 
       After='InstallFinalize'>&amp;DbUpdateManager=3</Custom> 

Tôi thừa hưởng WIX này, và nó hoạt động - nhưng như tôi đã nói - DbUpdateManager được gọi là quá muộn trong quá trình (chỉ "After = InstallFinalize") và do đó các dịch vụ sẽ không khởi động đúng lúc đầu tiên (chạy tốt lần thứ hai khi bạn khởi động lại chúng theo cách thủ công sau khi DbUpdateManager đã chạy).

Tôi chọc xung quanh tài liệu MSI một chút và tìm thấy một bước đẹp gọi là "StartServices", do linh cảm của tôi là chỉ cần thay đổi gọi tôi hành động tùy chỉnh như sau:

<InstallExecuteSequence> 
      <Custom Action='RunDbUpdateManagerAction' 
        Before='StartServices'>&amp;DbUpdateManager=3</Custom> 

Thật không may, trong trường hợp này, không có gì xảy ra - DbUpdateManager KHÔNG BAO GIỜ được gọi là ....

Bất kỳ ý tưởng nào tại sao? Gỡ lỗi các công cụ MSI/WiX thực sự thực sự phức tạp, và tôi dường như không thể thấy rừng cho cây cối nữa ....

Cảm ơn! Marc

EDIT: Các "RunDbUpdateManagerAction" được đặt vào đúng vị trí trong bảng InstallExecuteSequence trong MSI của tôi - ngay SAU InstallServices và chỉ TRƯỚC StartServices - nhưng nó không hoạt động .... DbUpdateManager (một tiện ích Winforms) không hiển thị trong quá trình cài đặt :-(

EDIT 2: bây giờ hành động của tôi dường như được thực hiện và vào đúng thời điểm - không may, tôi không thấy trình hướng dẫn của tôi :-(Điều tôi thấy là mã lỗi "giá trị trả về 1631" có nghĩa là "Dịch vụ MSI không thể khởi động" - wtf ???

MSI (s) (2C: D8) [20: 53: 36: 383]: Thực hiện hành động: RunDbUpdateManagerAction Hành động 20:53:36: RunDbUpdateManagerAction. Hành động bắt đầu lúc 20:53:36: RunDbUpdateManagerAction. MSI (s) (2C: D8) [20: 53: 36: 383]: Thực hiện hành động: StartServices Hành động 20:53:36: StartServices. Các dịch vụ đang được bắt đầu Hành động bắt đầu lúc 20:53:36: StartServices. Hành động kết thúc lúc 20:53:36: RunDbUpdateManagerAction. Giá trị trả lại 1631.

+0

Là một tài liệu tham khảo, các InstallExecute chuỗi gợi ý: http://msdn.microsoft.com/en-us/library/aa372038(v=vs.85).aspx –

Trả lời

4

Hãy thử lấy một tập tin đăng nhập của Lắp đặt, và tìm kiếm thứ tự chuỗi trong đó và giá trị của điều kiện để thực hiện Custom Action

Sử dụng này trong dòng lệnh: msiexec/i [msiname]/l * v [filename]

EDIT: Sau khi đọc nhận xét của bạn có một cái nhìn tại trang này here bạn có thể cố gắng thêm không được cài đặt trong tình trạng

EDIT2: tôi thấy điều này page Tìm kiếm lỗi Số 1631 của bạn

+0

Điểm tuyệt vời - trong nhật ký, tôi tìm thấy "MSI (s) (A0: 94) [20: 06: 59: 961]: Bỏ qua hành động: RunDbUpdateManagerAction (điều kiện là sai) "- bây giờ tôi chỉ cần hiểu chính xác điều kiện đó là gì, tại sao nó sai, hoặc làm thế nào để thay đổi nó ........ –

+1

Điều kiện có vẻ không sao - hành động dường như bị loại khỏi việc đánh giá từ nhật ký - nhưng giao diện người dùng thuật sĩ không bao giờ xuất hiện và tôi nhận được lỗi "trả về giá trị 1631" trong nhật ký .... –

4

Bạn có thể mở .msi trong Orca và xem bảng InstallExecuteSequence để xem thứ gì đang thực sự xảy ra. Điều này có thể cho bạn ý tưởng tốt về những gì thực sự xảy ra khi nào.

+0

Cảm ơn - Tôi sẽ đưa cho đó là một thử! –

+0

Yup, trình tự là tốt; InstallServices là 5800, RunDbUpdateManagerAction là 5899, StartServices là 5900 - và vẫn không hoạt động .... –

+0

Có thể điều kiện của bạn không đúng. Điều gì & ở phía trước của DbUpdateManager = 3 có nghĩa là gì? –

6

Dường như CustomAction của bạn phụ thuộc vào 'DbUpdateManagerFile' đang được cài đặt. Điều đó có nghĩa là CustomAction của bạn cần được lên lịch sau InstallFiles sẽ thực thi. Hãy nhớ có hai đường dẫn đến InstallExecuteSequence. Đầu tiên, các hành động "ngay lập tức" (hoặc "được lên lịch" hoặc "tạo kịch bản") được thực hiện để xây dựng nhật ký giao dịch (aka: "script cài đặt"). Thứ hai, các hành động "trì hoãn" trong nhật ký giao dịch được thực thi.

Ngay bây giờ CustomAction của bạn là "ngay lập tức" (mặc định) để nó đang cố gắng chạy trước các tệp này thực sự được sao chép vào máy. Hành động InstallFiles nằm trong kịch bản trước CustomAction của bạn nhưng nó chưa được thực thi.

Vì vậy, bạn cần đánh dấu CustomAction của bạn là "hoãn lại" để làm cho nó chạy sau khi các tệp của bạn được cài đặt.

Lưu ý: có thể bạn không thể hiển thị giao diện người dùng từ một CA bị trì hoãn. Tôi đã không chắc chắn nếu công cụ này của bạn đã được dự kiến ​​sẽ hiển thị giao diện người dùng.

PS: xin lỗi nếu tôi không giải thích rõ điều đó, đã lâu rồi.

+0

Cảm ơn Rob - bạn đã giải thích rất rõ. Tình trạng khó xử của tôi là: công cụ * IS * một trình thủ thuật hiển thị giao diện người dùng - vì vậy đánh dấu nó là "trì hoãn" có thể sẽ không giúp ích :-(Ý tưởng khác của tôi là chỉ cần di chuyển bước "StartServices" sang phần sau trong quá trình, sau Trình quản lý cập nhật DB của tôi đã chạy - nhưng tôi có thể di chuyển StartServices qua "InstallFinalize" không? –

+0

Vâng, bây giờ tôi đã có hành động tùy chỉnh để hoạt động - nó được lên lịch "After = InstallFinalize" một lần nữa (có vẻ là cơ hội duy nhất khi tôi không Điều đó làm việc tốt - nhưng sau đó khi cố gắng thực hiện bước StartServices ngay cả sau đó, tôi nhận được: DEBUG: Lỗi 2762: Không thể lên lịch hoạt động. Hành động phải được lên lịch giữa InstallInitialize và InstallFinalize. Vì vậy, tôi doomed cách này hay cách khác - hoãn lại = không có giao diện người dùng, không hoãn lại -> không thể bắt đầu dịch vụ .... –

10

Vâng, cuối cùng tôi đã làm việc đó - với sự trợ giúp của mọi người đã trả lời và bằng cách tham khảo một số hướng dẫn về WiX và các trang trợ giúp trên mạng. Công cụ cài đặt MSI không dễ dàng tìm ra và tìm hiểu ......

Về cơ bản, tôi đã thay đổi hành động tùy chỉnh thành "hoãn lại" (như đề xuất của Rob) và tôi đã di chuyển điểm trong chuỗi nó được thực hiện cho "After = InstallFiles". Tôi cũng đã thay đổi điều kiện trong thẻ < Tùy chỉnh > thành "KHÔNG ĐƯỢC Cài đặt" có vẻ như chỉ hoạt động tốt trong kịch bản của tôi.

Trái ngược với nỗi sợ hãi của Rob, các Update Manager Db và giao diện của nó đưa ra khá độc đáo theo cách này, và quá trình cập nhật cơ sở dữ liệu của chúng tôi bây giờ được hoàn tất trước khi bất kỳ dịch vụ của chúng tôi (mà phụ thuộc vào cơ sở dữ liệu) bắt đầu.

Rất mong nhận được bản phát hành đầy đủ RTM của WiX 3.0 (và tương lai của nó)!

Nhờ tất cả mọi người - thật không may, tôi chỉ có thể chấp nhận một câu trả lời - tất cả đều xứng đáng với nó.

Marc

+0

Tôi sẽ +1 mọi người vui vẻ vì nó hoạt động ... – CheGueVerra

+1

lý do tại sao không chấp nhận người có đại diện thấp nhất , để cổ vũ anh ta/cô ấy? –

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