Unlike table row based validations, MSI validation occurs after all changes have been completed and looks at the database's consistency as a whole (not individual records in relative isolation).
It can report where guidelines have not been followed as well as many types of problems which are known to cause issues for MSI installation or uninstallation.
MAKEMSI uses "MSIVAL2" for its automated validation step but these other tools also perform MSI validation:
The validation step can take some time, if you are confident that it won't pick up problems then from experience I know that you can kick off an install of an MSI while it is being validated to save time.
Assuming MAKEMSI is correctly configured to run "MSIVAL2" (see "Installing MAKEMSI") and that there are no problems with the MSI you should see something similar to the following lines near the end of your build:
(@889)INFO: Validating the MSI (please wait)... (@889)INFO: Using: "C:\Program Files\MSIVAL2\darice.cub" (@889)INFO: Filtering validation results... (@889)INFO: ==================== (@889)INFO: === VALIDATED OK === (@889)INFO: ====================
Not all generated "warning" (or even in some instances "error") messages will make sense in all cases (and some are basically wrong) so there is a need to filter the results. If after filtering there are no messages containing the words "ERROR" or "WARNING" the validation has succeeded. See the "ICE Messages" section for some details above some specific messages and their resolution.
I do not recommend the release of any MSI that has not been validated, also do not simply ignore validation messages, filter out any "expected messages" (ones you have decided you can safely ignore) to end up with an "OK" result! If you do this you will not miss a "real" issue hidden amoungst the ones you are used to ignoring!
There is a basic set of validations provided by the "MAKEMSI.FLT" file (installed by MAKEMSI) and the the "MsiValFilter" command provides an another alternative method for specifying filter lines.
To create your own validations (perhaps to check against company standards) have a look at the "ICE Validations" section.
Also have a look at the "Row Validation" section, this can pick up a lot of errors at the time they are made rather than looking for them after the complete MSI is built (which could be a slow process for a large MSI).
Keep in mind when validating databases (particularly when from other sources) that the "_Validation" table in the database is used a lot as a source of "rules".
If you get a validation message you believe is wrong you may wish to check this table to see if the relevant entries are correct.
|MAIN MAKEMSI VALIDATION OPTIONS|
#define? VALID_MISVAL2_EXECUTED_CMD validate-execute.cmd #define? VALID_MISVAL2_EXECUTED_CMD_FILTER validate-filter.cmd #define? VALID_MISVAL2_OUTPUT_CMD msival2-redirected.txt #define? VALID_MISVAL2_OUTPUT_ALL all-unicode.txt #define? VALID_MISVAL2_OUTPUT_ALL_ANSI all-ansi.txt #define? VALID_MISVAL2_OUTPUT_FILTER FilterCommands.flt.txt #define? VALID_MISVAL2_OUTPUT_FILTERED FilteredLog.TXT #define? VALID_MISVAL2_OUTPUT_FILTERS_USED FiltersUsed.TXT #define? VALID_FILTER_FILE MakeMsi.FLT #define? VALID_FILTER_BEFORE_FILE_INCLUSION #define? VALID_FILTER_AFTER_FILE_INCLUSION #define? VALID_DIE_ON_VALIDATION_ERRORS_OR_WARNINGS Y #define? VALID_HTMLRPT_IGNORE_FILTER_TRUE <$HTML_SYMBOL_TICK> #define? VALID_HTMLRPT_IGNORE_FILTER_FALSE <b><$HTML_SYMBOL_CROSS></b> #define? VALID_HTMLRPT_NO_MATCHES_TEXT <span STYLE="color:grey;font-size:5pt" title="No ICE messages matching this filter were found"><b><center>✗</center></b></span> #define? VALID_HTMLRPT_COMMENT_DEFAULT <span STYLE="color:grey;font-size:xx-small">*** NO REASON PROVIDED FOR THIS FILTER ***</span> ;--- If HTML put into MSI we won't yet have the info (what do we want to see) --- #define? VALID_HTMLRPT_VAL_NOT_DONE_YET_TEXT <small>MSI Validation hasn't occurred yet!</small> #define? VALID_HTMLRPT_PLACEHOLDER_S <PlaceHolderFilter. #define? VALID_HTMLRPT_PLACEHOLDER_E <?Space>/><$VALID_HTMLRPT_VAL_NOT_DONE_YET_TEXT $$Sqx2> #define? VALID_HTMLRPT_PLACEHOLDER_SUMMARY <PlaceHolderSummary><$VALID_HTMLRPT_VAL_NOT_DONE_YET_TEXT $$Sqx2></PlaceHolderSummary> #define? VALID_HTMLRPT_PLACEHOLDER_ERRORS <PlaceHolderErrors />