2009-10-29 33 views
54

file WiX dường như luôn bao gồm dòng này:Trong các tệp WiX, Tên = "SourceDir" là gì?

<Directory Id="TARGETDIR" Name="SourceDir"> 

"SourceDir" là gì? Cái này được dùng để làm gì? Đó không phải là tên thư mục thực. Có một số loại giá trị phép thuật không?

+1

TARGETDIR là nơi bạn muốn cài đặt, SourceDir là đường dẫn đến nơi gói cài đặt bạn đang chạy nằm: http://msdn.microsoft.com/en-us/library/aa372452(VS.85). aspx –

Trả lời

79

Từ: http://robmensching.com/blog/posts/2010/1/26/StackOverflow-what-does-NameSourceDir-refer-to

Thành thực mà nói, đó là một cái gì đó mà chúng ta nên đã ẩn từ nhà phát triển nhưng không. Lấy làm tiếc. Sự thật của vấn đề là Windows Installer mong đợi cây Directory luôn được bắt nguồn trong một hàng Directory nơi khóa chính (Directory/@ Id) là "TARGETDIR" và cột DefaultDir (Directory/@ Name) là "SourceDir" .

Trong khi cài đặt, TARGETDIR sẽ mặc định là ổ đĩa lớn nhất trên máy. SourceDir sẽ được đặt thành vị trí nơi MSI đang được thực hiện. Bây giờ, SourceDir là khó khăn sau khi cài đặt ban đầu vì nó sẽ không được thiết lập trừ khi hành động ResolveSource được gọi. Tuy nhiên, bạn không muốn gọi một cách rõ ràng hành động ResolveSource vì nó có khả năng nhắc bạn cung cấp phương tiện nguồn gốc (ví dụ: hãy đưa đĩa CD vào, xin vui lòng).

Điều chúng ta nên làm trong bộ công cụ WiX là xóa cần phải chỉ định cặp TARGETDIR/SourceDir và nói "Bất kỳ phần tử Thư mục nào không có cha mẹ sẽ tự động được chuyển sang TARGETDIR vì đó là những gì MSI SDK nói. " Thay vào đó, bạn phải tự làm điều đó ... và một số nhà phát triển tự hỏi điều đó có nghĩa là gì.

20

Từ các tài liệu wix.chm, chủ đề "Làm thế nào để: Thêm một File Để cài đặt của bạn":

Yếu tố với TargetDir id là yêu cầu của Windows Installer và là gốc rễ của tất cả cấu trúc thư mục cho cài đặt của bạn

Theo tài liệu MSDN TARGETDIR

thư mục đích gốc cho việc cài đặt

Cũng theo MSDN, SourceDir

thư mục gốc có chứa tệp cab nguồn hoặc cây tập tin nguồn của gói cài đặt

Vì vậy, thuộc tính SourceDir trỏ đến thư mục thực: thư mục nơi tệp MSI của bạn nằm. Bạn có thể thấy điều này trong nhật ký trình cài đặt khi cài đặt với msiexec /lvx* installer.log installer.msi.

Tuy nhiên, vì lý do nào đó, SourceDir hoàn toàn bị bỏ qua khi giải quyết TARGETDIR. TARGETDIR phải được đặt một cách rõ ràng (ví dụ: trên dòng lệnh) hoặc người nào khác nó giải quyết ROOTDRIVE. Nếu ROOTDRIVE không được đặt rõ ràng thì đó là gốc của ổ đĩa có dung lượng trống lớn nhất.

Một thử nghiệm nhanh cho thấy cài đặt một thành phần vào TARGETDIR thực sự đặt các tệp ở gốc của ổ D: \ của tôi, thay vì thư mục nơi MSI ngồi.

+2

Cảm ơn thông tin. Tôi vẫn khá bối rối. Sự hiểu biết của tôi là thuộc tính Name phải là tên của một thư mục thực, mà "SourceDir" thì không. Nếu bạn rời khỏi nó, trình biên dịch phàn nàn với một lỗi dọc theo dòng "bạn phải đặt Tên thành SourceDir". –

+11

Ah! những bí ẩn của Wix! Khám phá tất cả những điều bất ngờ, mâu thuẫn và bắt tay bí mật là một cuộc phiêu lưu thực sự. – Cheeso

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