Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

In WiX files, what does Name="SourceDir" refer to?

WiX files always seem to include this line:

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

What is "SourceDir"? What is it used for? It's not a real directory name. Is it some kind of magical value?

like image 453
dan-gph Avatar asked Oct 29 '09 01:10

dan-gph


People also ask

What is WiX file?

Windows Installer XML Toolset (WiX, pronounced "wicks"), is a free software toolset that builds Windows Installer packages from XML. It consists of a command-line environment that developers may integrate into their build processes to build MSI and MSM packages.

What is Targetdir WiX?

As I discovered at this link, TARGETDIR is actually supposed to represent the root of the drive with the most free space available (assuming there's more than one). That's why WiX projects have directories nested under there for Program Files, etc.


2 Answers

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

Honestly, it's something that we should have hidden from the developer but didn't. Sorry. The truth of the matter is that the Windows Installer expects the Directory tree to always be rooted in a Directory row where the primary key (Directory/@Id) is "TARGETDIR" and the DefaultDir column (Directory/@Name) is "SourceDir".

During an install, TARGETDIR will default to the largest drive on the machine. SourceDir will be set to the location where the MSI is being executed. Now, SourceDir is tricky after the initial install because it won't be set unless the ResolveSource action is called. However, you don't want to explicitly call the ResolveSource action because it is likely to prompt you to provide the original source media (aka: insert the CD, please).

What we should have done in the WiX toolset is remove the need to specify the TARGETDIR/SourceDir pair and say "Any Directory element that has no parent will automatically be parented to TARGETDIR because that's what the MSI SDK says to do." Instead, you have to do it yourself... and some devs wonder what it all means.

like image 199
Rob Mensching Avatar answered Oct 20 '22 04:10

Rob Mensching


From the wix.chm documentation, topic "How To: Add a File To Your Installer":

The element with the id TARGETDIR is required by the Windows Installer and is the root of all directory structures for your installation

According to the MSDN documentation TARGETDIR is

the root destination directory for the installation

Also according to MSDN, SourceDir is

the root directory that contains the source cabinet file or the source file tree of the installation package

So the SourceDir property points to a real directory: the one where your MSI file sits. You can see this in the installer log when installing with msiexec /lvx* installer.log installer.msi.

However, for some reason SourceDir is completely ignored when resolving the TARGETDIR. The TARGETDIR must be either set explicitly (e.g. on the command line) or else it resolves to ROOTDRIVE. If ROOTDRIVE is not explicitly set then it is the root of the drive with the most free space.

A quick test shows that installing a component to TARGETDIR indeed puts the files at the root of my D:\ drive, instead of the folder where the MSI sits.

like image 21
Wim Coenen Avatar answered Oct 20 '22 03:10

Wim Coenen