nushell/wix/main.wxs
Woohyun Lim e48b94965b
Change install context of windows terminal profile to per-user (#9322)
# Description

Change installation context of the windows terminal profile to
`per-user` from `per-system`.

This change is made because installation validation fails in winget ci
while executing custom action to replace the installation path of
`nu.exe` and `nu.ico` in the windows terminal profile file.

Refer discussions in #5812 and
https://github.com/microsoft/winget-pkgs/pull/106977

- Installation path of the windows terminal profile is changed as below:
- from: `C:\ProgramData\Microsoft\Windows Terminal\Fragments\nu\nu.json`
- to: `C:\Users\<user>\AppData\Local\Microsoft\Windows
Terminal\Fragments\nu\nu.json`
- Custom action to replace the installation path of `nu.exe` and
`nu.ico` in the json file will be executed without privilege escalation

This change is expected to eliminate the validation failure in winget ci
(need to wait until next release to be sure about it), however, it
creates some inconsistency in installation context.

- The windows terminal profile is installed in `per-user` context, other
files / PATH env variable are installed in `per-system` context.
- Building the installer shows a warning about this: `warning LGHT1076 :
ICE91: The file 'WindowsTerminalProfileFile' will be installed to the
per user directory 'WindowsTerminalProfileAppFolder' that doesn't vary
based on ALLUSERS value. This file won't be copied to each user's
profile even if a per machine installation is desired.`
which means: WT profile will be installed only for the user that
executed the installer and it won't be installed for other users in the
system. However, the installer is configured to use `per-system`
context, therefore, other files (such as nushell binary `nu.exe`) will
be installed for all users.

It might be better if we provide options for installation context
(`per-user` or `per-system`) as requested in #5927 in the future, if
that doesn't cause problems in winget ci.

# User-Facing Changes

- Installation path of windows terminal profile will be changed as
above.
- Windows Terminal profile will be installed only for the user that
installed nushell as stated above. The profile should be manually added
for other users if needed.

# Tests + Formatting

No test is added since this change is related to installation process in
Windows and does not contain source code changes.

Following checks are done manually.

### Environment

- OS: Windows 11 Pro 22H2
- Built the installer by referring `.github/workflows/release-pkg.nu`
script

### Checks

- Install: WT profile should be created in
`C:\Users\<user>\AppData\Local\Microsoft\Windows
Terminal\Fragments\nu\nu.json` and it should contain correct path for
`nu.exe` and `nu.ico`.
  - [x] Install (WT profile feature enabled)
- [x] Install (WT profile enabled) -> Manually remove the WT profile
file -> Re-run the installer and Repair

- Uninstall: WT profile should be removed.
  - [x] Install (WT profile enabled) -> Uninstall
- [x] Install (WT profile enabled) -> Re-run the installer and Modify
(WT profile disabled)

# After Submitting

No relevant documentation to update.
2023-06-01 08:51:55 -05:00

445 lines
21 KiB
XML

<?xml version='1.0' encoding='windows-1252'?>
<!--
Copyright (C) 2017 Christopher R. Field.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<!--
Please do not remove these pre-processor If-Else blocks. These are used with
the `cargo wix` subcommand to automatically determine the installation
destination for 32-bit versus 64-bit installers. Removal of these lines will
cause installation errors.
-->
<?if $(var.Platform) = x64 ?>
<?define Win64 = "yes" ?>
<?define PlatformProgramFilesFolder = "ProgramFiles64Folder" ?>
<?else ?>
<?define Win64 = "no" ?>
<?define PlatformProgramFilesFolder = "ProgramFilesFolder" ?>
<?endif ?>
<Wix xmlns='http://schemas.microsoft.com/wix/2006/wi'>
<Product
Id='*'
Name='nu'
UpgradeCode='82D756D2-19FA-4F09-B10F-64942E89F364'
Manufacturer='The Nushell Project Developers'
Language='1033'
Codepage='1252'
Version='$(var.Version)'>
<Package Id='*'
Keywords='Installer'
Description='A new type of shell'
Manufacturer='The Nushell Project Developers'
InstallerVersion='450'
Languages='1033'
Compressed='yes'
InstallScope='perMachine'
SummaryCodepage='1252'
Platform='$(var.Platform)'/>
<MajorUpgrade
Schedule='afterInstallInitialize'
DowngradeErrorMessage='A newer version of [ProductName] is already installed. Setup will now exit.'/>
<Media Id='1' Cabinet='media1.cab' EmbedCab='yes' DiskPrompt='CD-ROM #1'/>
<Property Id='DiskPrompt' Value='nu Installation'/>
<Directory Id='TARGETDIR' Name='SourceDir'>
<Directory Id='$(var.PlatformProgramFilesFolder)' Name='PFiles'>
<Directory Id='APPLICATIONFOLDER' Name='nu'>
<!--
Disabling the license sidecar file in the installer is a two step process:
1. Comment out or remove the `Component` tag along with its contents.
2. Comment out or remove the `ComponentRef` tag with the "License" Id
attribute value further down in this file.
-->
<Component Id='License' Guid='*' Win64='$(var.Win64)'>
<File Id='LicenseFile'
Name='License.rtf'
DiskId='1'
Source='wix\License.rtf'
KeyPath='yes'/>
</Component>
<Component Id='icon0' Guid='*' Win64='$(var.Win64)'>
<File
Id='icon0'
Name='nu.ico'
DiskId='1'
Source='assets/nu_logo.ico'
KeyPath='yes'/>
</Component>
<Directory Id='Bin' Name='bin'>
<Component Id='Path' Guid='285921EA-6DC0-4632-B12C-D7D737F30686' Win64='$(var.Win64)' KeyPath='yes'>
<Environment
Id='PATH'
Name='PATH'
Value='[Bin]'
Permanent='no'
Part='last'
Action='set'
System='yes'/>
</Component>
<Component Id='binary0' Guid='*' Win64='$(var.Win64)'>
<File
Id='exe0'
Name='nu.exe'
DiskId='1'
Source='target\$(var.Profile)\nu.exe'
KeyPath='yes'/>
</Component>
<!-- <Component Id='binary1' Guid='*' Win64='$(var.Win64)'>
<File
Id='exe1'
Name='nu_plugin_binaryview.exe'
DiskId='1'
Source='target\$(var.Profile)\nu_plugin_binaryview.exe'
KeyPath='yes'/>
</Component> -->
<Component Id='binary2' Guid='*' Win64='$(var.Win64)'>
<File
Id='exe2'
Name='nu_plugin_inc.exe'
DiskId='1'
Source='target\$(var.Profile)\nu_plugin_inc.exe'
KeyPath='yes'/>
</Component>
<!-- <Component Id='binary3' Guid='*' Win64='$(var.Win64)'>
<File
Id='exe3'
Name='nu_plugin_start.exe'
DiskId='1'
Source='target\$(var.Profile)\nu_plugin_start.exe'
KeyPath='yes'/>
</Component>
<Component Id='binary4' Guid='*' Win64='$(var.Win64)'>
<File
Id='exe4'
Name='nu_plugin_textview.exe'
DiskId='1'
Source='target\$(var.Profile)\nu_plugin_textview.exe'
KeyPath='yes'/>
</Component>
<Component Id='binary5' Guid='*' Win64='$(var.Win64)'>
<File
Id='exe5'
Name='nu_plugin_tree.exe'
DiskId='1'
Source='target\$(var.Profile)\nu_plugin_tree.exe'
KeyPath='yes'/>
</Component> -->
<!-- Downloaded from here https://github.com/jftuga/less-Windows/releases/download/less-v562.0/less.exe -->
<Component Id='binary6' Guid='*' Win64='$(var.Win64)'>
<File
Id='exe6'
Name='less.exe'
DiskId='1'
Source='output\less.exe'
KeyPath='yes'/>
</Component>
<!-- <Component Id='binary7' Guid='*' Win64='$(var.Win64)'>
<File
Id='exe7'
Name='nu_plugin_match.exe'
DiskId='1'
Source='target\$(var.Profile)\nu_plugin_match.exe'
KeyPath='yes'/>
</Component> -->
<Component Id='binary8' Guid='*' Win64='$(var.Win64)'>
<File
Id='exe8'
Name='README.txt'
DiskId='1'
Source='output\README.txt'
KeyPath='yes'/>
</Component>
<Component Id='binary9' Guid='*' Win64='$(var.Win64)'>
<File
Id='exe9'
Name='LICENSE'
DiskId='1'
Source='output\LICENSE'
KeyPath='yes'/>
</Component>
<Component Id='binary10' Guid='*' Win64='$(var.Win64)'>
<File
Id='exe10'
Name='LICENSE-for-less.txt'
DiskId='1'
Source='output\LICENSE-for-less.txt'
KeyPath='yes'/>
</Component>
<!-- <Component Id='binary11' Guid='*' Win64='$(var.Win64)'>
<File
Id='exe11'
Name='nu_plugin_s3.exe'
DiskId='1'
Source='target\$(var.Profile)\nu_plugin_s3.exe'
KeyPath='yes'/>
</Component>
<Component Id='binary12' Guid='*' Win64='$(var.Win64)'>
<File
Id='exe12'
Name='nu_plugin_chart_bar.exe'
DiskId='1'
Source='target\$(var.Profile)\nu_plugin_chart_bar.exe'
KeyPath='yes'/>
</Component>
<Component Id='binary13' Guid='*' Win64='$(var.Win64)'>
<File
Id='exe13'
Name='nu_plugin_chart_line.exe'
DiskId='1'
Source='target\$(var.Profile)\nu_plugin_chart_line.exe'
KeyPath='yes'/>
</Component> -->
<Component Id='binary14' Guid='*' Win64='$(var.Win64)'>
<File
Id='exe14'
Name='nu_plugin_query.exe'
DiskId='1'
Source='target\$(var.Profile)\nu_plugin_query.exe'
KeyPath='yes'/>
</Component>
<!-- <Component Id='binary15' Guid='*' Win64='$(var.Win64)'>
<File
Id='exe15'
Name='nu_plugin_from_bson.exe'
DiskId='1'
Source='target\$(var.Profile)\nu_plugin_from_bson.exe'
KeyPath='yes'/>
</Component>
<Component Id='binary16' Guid='*' Win64='$(var.Win64)'>
<File
Id='exe16'
Name='nu_plugin_to_bson.exe'
DiskId='1'
Source='target\$(var.Profile)\nu_plugin_to_bson.exe'
KeyPath='yes'/>
</Component>
<Component Id='binary17' Guid='*' Win64='$(var.Win64)'>
<File
Id='exe17'
Name='nu_plugin_from_sqlite.exe'
DiskId='1'
Source='target\$(var.Profile)\nu_plugin_from_sqlite.exe'
KeyPath='yes'/>
</Component>
<Component Id='binary18' Guid='*' Win64='$(var.Win64)'>
<File
Id='exe18'
Name='nu_plugin_to_sqlite.exe'
DiskId='1'
Source='target\$(var.Profile)\nu_plugin_to_sqlite.exe'
KeyPath='yes'/>
</Component>
<Component Id='binary19' Guid='*' Win64='$(var.Win64)'>
<File
Id='exe19'
Name='nu_plugin_selector.exe'
DiskId='1'
Source='target\$(var.Profile)\nu_plugin_selector.exe'
KeyPath='yes'/>
</Component>
<Component Id='binary20' Guid='*' Win64='$(var.Win64)'>
<File
Id='exe20'
Name='nu_plugin_query_json.exe'
DiskId='1'
Source='target\$(var.Profile)\nu_plugin_query_json.exe'
KeyPath='yes'/>
</Component>
<Component Id='binary21' Guid='*' Win64='$(var.Win64)'>
<File
Id='exe21'
Name='nu_plugin_example.exe'
DiskId='1'
Source='target\$(var.Profile)\nu_plugin_example.exe'
KeyPath='yes'/>
</Component> -->
<Component Id='binary22' Guid='*' Win64='$(var.Win64)'>
<File
Id='exe22'
Name='nu_plugin_gstat.exe'
DiskId='1'
Source='target\$(var.Profile)\nu_plugin_gstat.exe'
KeyPath='yes'/>
</Component>
</Directory>
</Directory>
</Directory>
<Directory Id='LocalAppDataFolder'>
<Directory Id='AppDataMicrosoftFolder' Name='Microsoft'>
<Directory Id='AppDataWindowsTerminalFolder' Name='Windows Terminal'>
<Directory Id='WindowsTerminalProfileFolder' Name='Fragments'>
<Directory Id='WindowsTerminalProfileAppFolder' Name='nu'>
<Component Id='WindowsTerminalProfile' Guid='957239F4-7B87-4399-9F91-7DF2ABE5ED8B' Win64='$(var.Win64)'>
<File
Id='WindowsTerminalProfileFile'
Name='nu.json'
DiskId='1'
Source='wix\windows-terminal-profile.json'
System='no'/>
<RegistryKey Root='HKCU' Key='Software\nu'>
<RegistryValue Name='WindowsTerminalProfile' Value='1' Type='integer' KeyPath='yes'/>
</RegistryKey>
<RemoveFolder Id='RemoveWindowsTerminalProfileFolder1' Directory='WindowsTerminalProfileAppFolder' On='uninstall'/>
<RemoveFolder Id='RemoveWindowsTerminalProfileFolder2' Directory='WindowsTerminalProfileFolder' On='uninstall'/>
<RemoveFolder Id='RemoveWindowsTerminalProfileFolder3' Directory='AppDataWindowsTerminalFolder' On='uninstall'/>
<RemoveFolder Id='RemoveWindowsTerminalProfileFolder4' Directory='AppDataMicrosoftFolder' On='uninstall'/>
</Component>
</Directory>
</Directory>
</Directory>
</Directory>
</Directory>
</Directory>
<Feature
Id='Binaries'
Title='Application'
Description='Installs all binaries and the license.'
Level='1'
ConfigurableDirectory='APPLICATIONFOLDER'
AllowAdvertise='no'
Display='expand'
Absent='disallow'>
<!--
Comment out or remove the following `ComponentRef` tag to remove
the license sidecar file from the installer.
-->
<ComponentRef Id='License'/>
<ComponentRef Id='icon0'/>
<ComponentRef Id='binary0'/>
<!-- <ComponentRef Id='binary1'/> -->
<ComponentRef Id='binary2'/>
<!-- <ComponentRef Id='binary3'/>
<ComponentRef Id='binary4'/>
<ComponentRef Id='binary5'/> -->
<ComponentRef Id='binary6'/>
<!-- <ComponentRef Id='binary7'/> -->
<ComponentRef Id='binary8'/>
<ComponentRef Id='binary9'/>
<ComponentRef Id='binary10'/>
<!-- <ComponentRef Id='binary11'/>
<ComponentRef Id='binary12'/>
<ComponentRef Id='binary13'/> -->
<ComponentRef Id='binary14'/>
<!-- <ComponentRef Id='binary15'/>
<ComponentRef Id='binary16'/>
<ComponentRef Id='binary17'/>
<ComponentRef Id='binary18'/>
<ComponentRef Id='binary19'/>
<ComponentRef Id='binary20'/>
<ComponentRef Id='binary21'/> -->
<ComponentRef Id='binary22'/>
<Feature
Id='Environment'
Title='PATH Environment Variable'
Description='Add the install location of the [ProductName] executable to the PATH system environment variable. This allows the [ProductName] executable to be called from any location.'
Level='1'
Absent='allow'>
<ComponentRef Id='Path'/>
</Feature>
<Feature
Id='WindowsTerminalProfile'
Title='Windows Terminal Profile'
Description='Add [ProductName] profile to Windows Terminal.'
Level='1'
Absent='allow'>
<ComponentRef Id='WindowsTerminalProfile'/>
</Feature>
</Feature>
<SetProperty Id='ARPINSTALLLOCATION' Value='[APPLICATIONFOLDER]' After='CostFinalize'/>
<Icon Id='ProductICO' SourceFile='assets/nu_logo.ico'/>
<Property Id='ARPPRODUCTICON' Value='ProductICO' />
<Property Id='ARPHELPLINK' Value='https://www.nushell.sh/book/'/>
<SetProperty
Id="ReplacePathsInWindowsTerminalProfile"
Sequence="execute"
Value="&quot;[#exe0]&quot; -c &quot;open `[#WindowsTerminalProfileFile]` | update profiles.commandline `[#exe0]` | update profiles.icon `[#icon0]` | save -f `[#WindowsTerminalProfileFile]`&quot;"
After='CostFinalize'/>
<CustomAction
Id="ReplacePathsInWindowsTerminalProfile"
BinaryKey="WixCA"
DllEntry="CAQuietExec"
Execute="deferred"
Return="check"
Impersonate="yes"/>
<InstallExecuteSequence>
<Custom Action='ReplacePathsInWindowsTerminalProfile' Before='InstallFinalize'>
<!-- Run the custom action if the feature is enabled -->
<![CDATA[&WindowsTerminalProfile=3 OR (!WindowsTerminalProfile=3 AND REINSTALL<>"")]]>
</Custom>
</InstallExecuteSequence>
<UI>
<UIRef Id='WixUI_FeatureTree'/>
<!--
Disabling the EULA dialog in the installer is a two step process:
1. Uncomment the following two `Publish` tags
2. Comment out or remove the `<WiXVariable Id='WixUILicenseRtf'...` tag further down
-->
<!--<Publish Dialog='WelcomeDlg' Control='Next' Event='NewDialog' Value='CustomizeDlg' Order='99'>1</Publish>-->
<!--<Publish Dialog='CustomizeDlg' Control='Back' Event='NewDialog' Value='WelcomeDlg' Order='99'>1</Publish>-->
</UI>
<!--
Disabling the EULA dialog in the installer requires commenting out
or removing the following `WixVariable` tag
-->
<WixVariable Id='WixUILicenseRtf' Value='wix\License.rtf'/>
<!--
Uncomment the next `WixVariable` tag to customize the installer's
Graphical User Interface (GUI) and add a custom banner image across
the top of each screen. See the WiX Toolset documentation for details
about customization.
The banner BMP dimensions are 493 x 58 pixels.
-->
<!--<WixVariable Id='WixUIBannerBmp' Value='wix\Banner.bmp'/>-->
<!--
Uncomment the next `WixVariable` tag to customize the installer's
Graphical User Interface (GUI) and add a custom image to the first
dialog, or screen. See the WiX Toolset documentation for details about
customization.
The dialog BMP dimensions are 493 x 312 pixels.
-->
<!--<WixVariable Id='WixUIDialogBmp' Value='wix\Dialog.bmp'/>-->
</Product>
</Wix>