Fix Windows arm64 release binaries and winget related issues (#15690)

<!--
if this PR closes one or more issues, you can automatically link the PR
with
them by using one of the [*linking
keywords*](https://docs.github.com/en/issues/tracking-your-work-with-issues/linking-a-pull-request-to-an-issue#linking-a-pull-request-to-an-issue-using-a-keyword),
e.g.
- this PR should close #xxxx
- fixes #xxxx

you can also mention related issues, PRs or discussions!
-->

# Description
<!--
Thank you for improving Nushell. Please, check our [contributing
guide](../CONTRIBUTING.md) and talk to the core team before making major
changes.

Description of your pull request goes here. **Provide examples and/or
screenshots** if your changes affect the user experience.
-->
Publishing Nushell to winget has always been a challenge for us, and to
this day, many issues remain unresolved—and some seem almost impossible
to fix. The road to solving these problems may be winding and long, but
it's time for us to set out on this journey.

This PR try to fix the Windows arm64 release binaries and some `winget`
related issues:

- [x] Fixes https://github.com/nushell/nushell/issues/14815: build
Windows arm64 binaries by Windows arm64 runner
- [x] Upgrade WiX Toolset to latest 6.0 version: WiX 3 we used currently
doesn't support arm64 arch and [WiX v4 Security Fixes End Date is
2025/02/05](https://docs.firegiant.com/wix/)
- [x] Update the **nightly** workflow to make it work for all future
releases
- [x] Update the **release** workflow to make it work for all future
releases
- [x] Fixes https://github.com/nushell/nushell/issues/15698
- [x] Fixes https://github.com/nushell/nushell/issues/13719 so that
Nushell should be possible to be installed via winget with both user and
machine scope
- [x] Fixes https://github.com/nushell/nushell/issues/5927
- [x] Try to fix https://github.com/nushell/nushell/issues/14786
- [x] Fixes https://github.com/nushell/nushell/issues/9537

## Related but not planed issues:

- Related https://github.com/nushell/nushell/issues/13017
- Related https://github.com/nushell/nushell/issues/8053

# User-Facing Changes
<!-- List of all changes that impact the user experience here. This
helps us keep track of breaking changes. -->

- Nushell should be possible to be installed via winget with both user
and machine scope and The default should be user scope
  - User scope install by winget: `winget install Nushell.Nushell`
- User scope install by msiexec: `msiexec /i
nu-0.104.1-x86_64-pc-windows-msvc.msi /quiet /qn`
- Machine scope install by winget: `winget install Nushell.Nushell
--override 'ALLUSERS=1'`
- Machine scope install by msiexec: `msiexec /i
nu-0.104.1-x86_64-pc-windows-msvc.msi ALLUSERS=1`
- Note that `--scope` flag for `winget install` does not work use
`--override` instead
- Default user scope install dir:
`$'($nu.home-path)\AppData\Local\Programs\nu\'`
  - Default machine scope install dir: `C:\Program Files\nu\`
- When a standard user runs the installer and selects "Install for
everyone" (per-machine installation), Windows will automatically trigger
a UAC prompt, the user can enter admin credentials and the installation
will proceed with elevated privileges
- [hustcer/setup-nu](https://github.com/hustcer/setup-nu) should work
for `windows-11-arm` runners


# Tests + Formatting
<!--
Don't forget to add tests that cover your changes.

Make sure you've run and fixed any issues with these commands:

- `cargo fmt --all -- --check` to check standard code formatting (`cargo
fmt --all` applies these changes)
- `cargo clippy --workspace -- -D warnings -D clippy::unwrap_used` to
check that you're using the standard code style
- `cargo test --workspace` to check that all tests pass (on Windows make
sure to [enable developer
mode](https://learn.microsoft.com/en-us/windows/apps/get-started/developer-mode-features-and-debugging))
- `cargo run -- -c "use toolkit.nu; toolkit test stdlib"` to run the
tests for the standard library

> **Note**
> from `nushell` you can also use the `toolkit` as follows
> ```bash
> use toolkit.nu # or use an `env_change` hook to activate it
automatically
> toolkit check pr
> ```
-->

The latest MSI builds are available here:
https://github.com/nushell/nightly/releases/tag/v0.104.1
Actually all the nightly releases were built with latest changes
included: https://github.com/nushell/nightly/releases

`winget` and `msiexec` install tests goes here:
https://github.com/nushell/integrations/pull/49

https://github.com/nushell/integrations/actions/runs/14974621061
https://github.com/nushell/integrations/actions/runs/14974621054

### Test winget install locally:
- git clone git@github.com:nushell/integrations.git
- User scope install: `winget install -m
manifests\n\Nushell\Nushell\0.104.1\`
- Run: `use tests\common.nu *; check-user-install`
- Machine scope install: `winget install -m
manifests\n\Nushell\Nushell\0.104.1\ --override 'ALLUSERS=1'`
- Run: `use tests\common.nu *; check-local-machine-install`

# After Submitting
<!-- If your PR had any user-facing changes, update [the
documentation](https://github.com/nushell/nushell.github.io) after the
PR is merged, if necessary. This will help us keep the docs up to date.
-->

@fdncred I suggest releasing a patch version after merging this PR (only
the changes of this PR will be included) to ensure that the winget
release process works properly. This way, we can be more confident when
releasing version 0.105.0.

References:

-
https://learn.microsoft.com/en-us/windows/win32/msi/single-package-authoring
-
https://learn.microsoft.com/en-us/windows/package-manager/winget/source#add
-
https://github.com/microsoft/winget-pkgs/blob/master/doc/tools/SandboxTest.md
- https://docs.firegiant.com/quick-start/
-
https://docs.firegiant.com/wix3/tutorial/getting-started/putting-it-to-use/#_top
-
https://learn.microsoft.com/en-us/windows-server/administration/windows-commands/msiexec#set-public-properties
This commit is contained in:
Justin Ma 2025-05-22 19:15:52 +08:00 committed by GitHub
parent 6906a0ca50
commit 10be753ab7
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
8 changed files with 489 additions and 519 deletions

View File

@ -4,17 +4,18 @@
# 2. https://github.com/JasonEtco/create-an-issue
# 3. https://docs.github.com/en/actions/learn-github-actions/variables
# 4. https://github.com/actions/github-script
# 5. https://docs.github.com/en/actions/writing-workflows/workflow-syntax-for-github-actions#jobsjob_idneeds
#
name: Nightly Build
on:
workflow_dispatch:
push:
branches:
- nightly # Just for test purpose only with the nightly repo
# This schedule will run only from the default branch
schedule:
- cron: '15 0 * * *' # run at 00:15 AM UTC
workflow_dispatch:
defaults:
run:
@ -26,6 +27,11 @@ jobs:
runs-on: ubuntu-latest
# This job is required by the release job, so we should make it run both from Nushell repo and nightly repo
# if: github.repository == 'nushell/nightly'
# Map a step output to a job output
outputs:
skip: ${{ steps.vars.outputs.skip }}
build_date: ${{ steps.vars.outputs.build_date }}
nightly_tag: ${{ steps.vars.outputs.nightly_tag }}
steps:
- name: Checkout
uses: actions/checkout@v4
@ -58,16 +64,53 @@ jobs:
# All the changes will be overwritten by the upstream main branch
git reset --hard src/main
git push origin main -f
let sha_short = (git rev-parse --short origin/main | str trim | str substring 0..7)
let tag_name = $'nightly-($sha_short)'
if (git ls-remote --tags origin $tag_name | is-empty) {
git tag -a $tag_name -m $'Nightly build from ($sha_short)'
- name: Create Tag and Output Tag Name
if: github.repository == 'nushell/nightly'
id: vars
shell: nu {0}
run: |
let date = date now | format date %m%d
let version = open Cargo.toml | get package.version
let sha_short = (git rev-parse --short origin/main | str trim | str substring 0..6)
let latest_meta = http get https://api.github.com/repos/nushell/nightly/releases
| sort-by -r created_at
| where tag_name =~ nightly
| get tag_name?.0? | default ''
| parse '{version}-nightly.{build}+{hash}'
if ($latest_meta.0?.hash? | default '') == $sha_short {
print $'(ansi g)Latest nightly build is up-to-date, skip rebuilding.(ansi reset)'
$'skip=true(char nl)' o>> $env.GITHUB_OUTPUT
exit 0
}
let prev_ver = $latest_meta.0?.version? | default '0.0.0'
let build = if ($latest_meta | is-empty) or ($version != $prev_ver) { 1 } else {
($latest_meta | get build?.0? | default 0 | into int) + 1
}
let nightly_tag = $'($version)-nightly.($build)+($sha_short)'
$'build_date=($date)(char nl)' o>> $env.GITHUB_OUTPUT
$'nightly_tag=($nightly_tag)(char nl)' o>> $env.GITHUB_OUTPUT
if (git ls-remote --tags origin $nightly_tag | is-empty) {
ls **/Cargo.toml | each {|file|
open --raw $file.name
| str replace --all $'version = "($version)"' $'version = "($version)-nightly.($build)"'
| save --force $file.name
}
# Disable the following two workflows for the automatic committed changes
rm .github/workflows/ci.yml
rm .github/workflows/audit.yml
git add .
git commit -m $'Update version to ($version)-nightly.($build)'
git tag -a $nightly_tag -m $'Nightly build from ($sha_short)'
git push origin --tags
git push origin main -f
}
standard:
release:
name: Nu
needs: prepare
if: needs.prepare.outputs.skip != 'true'
strategy:
fail-fast: false
matrix:
@ -84,24 +127,15 @@ jobs:
- armv7-unknown-linux-musleabihf
- riscv64gc-unknown-linux-gnu
- loongarch64-unknown-linux-gnu
extra: ['bin']
include:
- target: aarch64-apple-darwin
os: macos-latest
- target: x86_64-apple-darwin
os: macos-latest
- target: x86_64-pc-windows-msvc
extra: 'bin'
os: windows-latest
- target: x86_64-pc-windows-msvc
extra: msi
os: windows-latest
- target: aarch64-pc-windows-msvc
extra: 'bin'
os: windows-latest
- target: aarch64-pc-windows-msvc
extra: msi
os: windows-latest
os: windows-11-arm
- target: x86_64-unknown-linux-gnu
os: ubuntu-22.04
- target: x86_64-unknown-linux-musl
@ -120,40 +154,64 @@ jobs:
os: ubuntu-22.04
runs-on: ${{matrix.os}}
steps:
- uses: actions/checkout@v4
with:
ref: main
fetch-depth: 0
- name: Install Wix Toolset 6 for Windows
shell: pwsh
if: ${{ startsWith(matrix.os, 'windows') }}
run: |
dotnet tool install --global wix --version 6.0.0
dotnet workload install wix
$wixPath = "$env:USERPROFILE\.dotnet\tools"
echo "$wixPath" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append
$env:PATH = "$wixPath;$env:PATH"
wix --version
- name: Update Rust Toolchain Target
run: |
echo "targets = ['${{matrix.target}}']" >> rust-toolchain.toml
- name: Setup Rust toolchain and cache
uses: actions-rust-lang/setup-rust-toolchain@v1.12.0
uses: actions-rust-lang/setup-rust-toolchain@v1
# WARN: Keep the rustflags to prevent from the winget submission error: `CAQuietExec: Error 0xc0000135`
with:
rustflags: ''
- name: Setup Nushell
uses: hustcer/setup-nu@v3
if: ${{ matrix.os != 'windows-11-arm' }}
with:
version: 0.103.0
- name: Release Nu Binary
id: nu
if: ${{ matrix.os != 'windows-11-arm' }}
run: nu .github/workflows/release-pkg.nu
env:
OS: ${{ matrix.os }}
REF: ${{ github.ref }}
TARGET: ${{ matrix.target }}
_EXTRA_: ${{ matrix.extra }}
- name: Build Nu for Windows ARM64
id: nu0
shell: pwsh
if: ${{ matrix.os == 'windows-11-arm' }}
run: |
$env:OS = 'windows'
$env:REF = '${{ github.ref }}'
$env:TARGET = '${{ matrix.target }}'
cargo build --release --all --target aarch64-pc-windows-msvc
cp ./target/${{ matrix.target }}/release/nu.exe .
./nu.exe -c 'version'
./nu.exe ${{github.workspace}}/.github/workflows/release-pkg.nu
- name: Create an Issue for Release Failure
if: ${{ failure() }}
uses: JasonEtco/create-an-issue@v2.9.2
uses: JasonEtco/create-an-issue@v2
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
@ -161,13 +219,6 @@ jobs:
search_existing: open
filename: .github/AUTO_ISSUE_TEMPLATE/nightly-build-fail.md
- name: Set Outputs of Short SHA
id: vars
run: |
echo "date=$(date -u +'%Y-%m-%d')" >> $GITHUB_OUTPUT
sha_short=$(git rev-parse --short HEAD)
echo "sha_short=${sha_short:0:7}" >> $GITHUB_OUTPUT
# REF: https://github.com/marketplace/actions/gh-release
# Create a release only in nushell/nightly repo
- name: Publish Archive
@ -175,9 +226,39 @@ jobs:
if: ${{ startsWith(github.repository, 'nushell/nightly') }}
with:
prerelease: true
files: ${{ steps.nu.outputs.archive }}
tag_name: nightly-${{ steps.vars.outputs.sha_short }}
name: Nu-nightly-${{ steps.vars.outputs.date }}-${{ steps.vars.outputs.sha_short }}
files: |
${{ steps.nu.outputs.msi }}
${{ steps.nu0.outputs.msi }}
${{ steps.nu.outputs.archive }}
${{ steps.nu0.outputs.archive }}
tag_name: ${{ needs.prepare.outputs.nightly_tag }}
name: ${{ needs.prepare.outputs.build_date }}-${{ needs.prepare.outputs.nightly_tag }}
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
sha256sum:
needs: [prepare, release]
name: Create Sha256sum
runs-on: ubuntu-latest
if: github.repository == 'nushell/nightly'
steps:
- name: Download Release Archives
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: >-
gh release download ${{ needs.prepare.outputs.nightly_tag }}
--repo ${{ github.repository }}
--pattern '*'
--dir release
- name: Create Checksums
run: cd release && shasum -a 256 * > ../SHA256SUMS
- name: Publish Checksums
uses: softprops/action-gh-release@v2.0.9
with:
draft: false
prerelease: true
files: SHA256SUMS
tag_name: ${{ needs.prepare.outputs.nightly_tag }}
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
@ -185,12 +266,9 @@ jobs:
name: Cleanup
# Should only run in nushell/nightly repo
if: github.repository == 'nushell/nightly'
needs: [release, sha256sum]
runs-on: ubuntu-latest
steps:
# Sleep for 30 minutes, waiting for the release to be published
- name: Waiting for Release
run: sleep 1800
- uses: actions/checkout@v4
with:
ref: main
@ -205,7 +283,7 @@ jobs:
shell: nu {0}
run: |
let KEEP_COUNT = 10
let deprecated = (http get https://api.github.com/repos/nushell/nightly/releases | sort-by -r created_at | select tag_name id | range $KEEP_COUNT..)
let deprecated = (http get https://api.github.com/repos/nushell/nightly/releases | sort-by -r created_at | select tag_name id | slice $KEEP_COUNT..)
for release in $deprecated {
print $'Deleting tag ($release.tag_name)'
git push origin --delete $release.tag_name

View File

@ -175,49 +175,56 @@ if $os in ['macos-latest'] or $USE_UBUNTU {
tar -czf $archive $dest
print $'archive: ---> ($archive)'; ls $archive
# REF: https://github.blog/changelog/2022-10-11-github-actions-deprecating-save-state-and-set-output-commands/
echo $"archive=($archive)" | save --append $env.GITHUB_OUTPUT
echo $"archive=($archive)(char nl)" o>> $env.GITHUB_OUTPUT
} else if $os =~ 'windows' {
let releaseStem = $'($bin)-($version)-($target)'
let arch = if $nu.os-info.arch =~ 'x86_64' { 'x64' } else { 'arm64' }
fetch-less $arch
print $'(char nl)Download less related stuffs...'; hr-line
# todo: less-v661 is out but is released as a zip file. maybe we should switch to that and extract it?
aria2c https://github.com/jftuga/less-Windows/releases/download/less-v608/less.exe -o less.exe
# the below was renamed because it was failing to download for darren. it should work but it wasn't
# todo: maybe we should get rid of this aria2c dependency and just use http get?
#aria2c https://raw.githubusercontent.com/jftuga/less-Windows/master/LICENSE -o LICENSE-for-less.txt
aria2c https://github.com/jftuga/less-Windows/blob/master/LICENSE -o LICENSE-for-less.txt
# Create Windows msi release package
if (get-env _EXTRA_) == 'msi' {
let wixRelease = $'($src)/target/wix/($releaseStem).msi'
print $'(char nl)Start creating Windows msi package with the following contents...'
cd $src; hr-line
# Wix need the binaries be stored in target/release/
cp -r ($'($dist)/*' | into glob) target/release/
ls target/release/* | print
cargo install cargo-wix --version 0.3.8
cargo wix --no-build --nocapture --package nu --output $wixRelease
print $'(char nl)(ansi g)Archive contents:(ansi reset)'; hr-line; ls | print
let archive = $'($dist)/($releaseStem).zip'
7z a $archive ...(glob *)
let pkg = (ls -f $archive | get name)
if not ($pkg | is-empty) {
# Workaround for https://github.com/softprops/action-gh-release/issues/280
let archive = ($wixRelease | str replace --all '\' '/')
print $'archive: ---> ($archive)';
echo $"archive=($archive)" | save --append $env.GITHUB_OUTPUT
} else {
print $'(char nl)(ansi g)Archive contents:(ansi reset)'; hr-line; ls | print
let archive = $'($dist)/($releaseStem).zip'
7z a $archive ...(glob *)
let pkg = (ls -f $archive | get name)
if not ($pkg | is-empty) {
# Workaround for https://github.com/softprops/action-gh-release/issues/280
let archive = ($pkg | get 0 | str replace --all '\' '/')
print $'archive: ---> ($archive)'
echo $"archive=($archive)" | save --append $env.GITHUB_OUTPUT
}
let archive = ($pkg | get 0 | str replace --all '\' '/')
print $'archive: ---> ($archive)'
echo $"archive=($archive)(char nl)" o>> $env.GITHUB_OUTPUT
}
# Create extra Windows msi release package if dotnet and wix are available
let installed = [dotnet wix] | all { (which $in | length) > 0 }
if $installed and (wix --version | split row . | first | into int) >= 6 {
print $'(char nl)Start creating Windows msi package with the following contents...'
cd $src; cd wix; hr-line; mkdir nu
# Wix need the binaries be stored in nu folder
cp -r ($'($dist)/*' | into glob) nu/
cp $'($dist)/README.txt' .
ls -f nu/* | print
./nu/nu.exe -c $'NU_RELEASE_VERSION=($version) dotnet build -c Release -p:Platform=($arch)'
glob **/*.msi | print
# Workaround for https://github.com/softprops/action-gh-release/issues/280
let wixRelease = (glob **/*.msi | where $it =~ bin | get 0 | str replace --all '\' '/')
let msi = $'($wixRelease | path dirname)/nu-($version)-($target).msi'
mv $wixRelease $msi
print $'MSI archive: ---> ($msi)';
echo $"msi=($msi)(char nl)" o>> $env.GITHUB_OUTPUT
}
}
def fetch-less [
arch: string = 'x64' # The architecture to fetch
] {
let less_zip = $'less-($arch).zip'
print $'Fetching less archive: (ansi g)($less_zip)(ansi reset)'
let url = $'https://github.com/jftuga/less-Windows/releases/download/less-v668/($less_zip)'
http get https://github.com/jftuga/less-Windows/blob/master/LICENSE | save -rf LICENSE-for-less.txt
http get $url | save -rf $less_zip
unzip $less_zip
rm $less_zip lesskey.exe
}
def 'cargo-build-nu' [] {

View File

@ -35,24 +35,15 @@ jobs:
- armv7-unknown-linux-musleabihf
- riscv64gc-unknown-linux-gnu
- loongarch64-unknown-linux-gnu
extra: ['bin']
include:
- target: aarch64-apple-darwin
os: macos-latest
- target: x86_64-apple-darwin
os: macos-latest
- target: x86_64-pc-windows-msvc
extra: 'bin'
os: windows-latest
- target: x86_64-pc-windows-msvc
extra: msi
os: windows-latest
- target: aarch64-pc-windows-msvc
extra: 'bin'
os: windows-latest
- target: aarch64-pc-windows-msvc
extra: msi
os: windows-latest
os: windows-11-arm
- target: x86_64-unknown-linux-gnu
os: ubuntu-22.04
- target: x86_64-unknown-linux-musl
@ -75,6 +66,17 @@ jobs:
steps:
- uses: actions/checkout@v4
- name: Install Wix Toolset 6 for Windows
shell: pwsh
if: ${{ startsWith(matrix.os, 'windows') }}
run: |
dotnet tool install --global wix --version 6.0.0
dotnet workload install wix
$wixPath = "$env:USERPROFILE\.dotnet\tools"
echo "$wixPath" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append
$env:PATH = "$wixPath;$env:PATH"
wix --version
- name: Update Rust Toolchain Target
run: |
echo "targets = ['${{matrix.target}}']" >> rust-toolchain.toml
@ -88,17 +90,31 @@ jobs:
- name: Setup Nushell
uses: hustcer/setup-nu@v3
if: ${{ matrix.os != 'windows-11-arm' }}
with:
version: 0.103.0
- name: Release Nu Binary
id: nu
if: ${{ matrix.os != 'windows-11-arm' }}
run: nu .github/workflows/release-pkg.nu
env:
OS: ${{ matrix.os }}
REF: ${{ github.ref }}
TARGET: ${{ matrix.target }}
_EXTRA_: ${{ matrix.extra }}
- name: Build Nu for Windows ARM64
id: nu0
shell: pwsh
if: ${{ matrix.os == 'windows-11-arm' }}
run: |
$env:OS = 'windows'
$env:REF = '${{ github.ref }}'
$env:TARGET = '${{ matrix.target }}'
cargo build --release --all --target aarch64-pc-windows-msvc
cp ./target/${{ matrix.target }}/release/nu.exe .
./nu.exe -c 'version'
./nu.exe ${{github.workspace}}/.github/workflows/release-pkg.nu
# WARN: Don't upgrade this action due to the release per asset issue.
# See: https://github.com/softprops/action-gh-release/issues/445
@ -107,7 +123,11 @@ jobs:
if: ${{ startsWith(github.ref, 'refs/tags/') }}
with:
draft: true
files: ${{ steps.nu.outputs.archive }}
files: |
${{ steps.nu.outputs.msi }}
${{ steps.nu0.outputs.msi }}
${{ steps.nu.outputs.archive }}
${{ steps.nu0.outputs.archive }}
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

View File

@ -3,7 +3,7 @@ fn main() {
let mut res = winresource::WindowsResource::new();
res.set("ProductName", "Nushell");
res.set("FileDescription", "Nushell");
res.set("LegalCopyright", "Copyright (C) 2022");
res.set("LegalCopyright", "Copyright (C) 2025");
res.set_icon("assets/nu_logo.ico");
res.compile()
.expect("Failed to run the Windows resource compiler (rc.exe)");

Binary file not shown.

36
wix/main.wixproj Normal file
View File

@ -0,0 +1,36 @@
<Project Sdk="WixToolset.Sdk/6.0.0">
<PropertyGroup>
<OutputType>Package</OutputType>
<OutputName>nu-$(Platform)</OutputName>
<UpgradeCode>82D756D2-19FA-4F09-B10F-64942E89F364</UpgradeCode>
<DefineConstants>
SourceDir=$(MSBuildProjectDirectory)\nu;
</DefineConstants>
<SuppressValidation>true</SuppressValidation>
<SuppressIces>ICE80</SuppressIces>
</PropertyGroup>
<PropertyGroup Condition=" '$(Platform)' == 'x64' ">
<InstallerPlatform>x64</InstallerPlatform>
<DefineConstants>$(DefineConstants)</DefineConstants>
</PropertyGroup>
<PropertyGroup Condition=" '$(Platform)' == 'arm64' ">
<InstallerPlatform>arm64</InstallerPlatform>
<DefineConstants>$(DefineConstants)</DefineConstants>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="WixToolset.UI.wixext" Version="6.0.0" />
<PackageReference Include="WixToolset.Util.wixext" Version="6.0.0" />
</ItemGroup>
<ItemGroup>
<BindPath Include="." />
<Content Include="nu.ico" />
<Content Include="README.txt" />
<Content Include="License.rtf" />
<Content Include="windows-terminal-profile.json" />
</ItemGroup>
</Project>

View File

@ -1,468 +1,297 @@
<?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.
-->
<?xml version="1.0" encoding="UTF-8"?>
<!--
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.
- https://learn.microsoft.com/en-us/windows/win32/msi/single-package-authoring
- https://learn.microsoft.com/en-us/windows-server/administration/windows-commands/msiexec
-->
<?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'>
<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs"
xmlns:ui="http://wixtoolset.org/schemas/v4/wxs/ui"
xmlns:util="http://wixtoolset.org/schemas/v4/wxs/util">
<Product
Id='*'
Name='nu'
UpgradeCode='82D756D2-19FA-4F09-B10F-64942E89F364'
Manufacturer='The Nushell Project Developers'
Language='1033'
Codepage='1252'
Version='$(var.Version)'>
<?define ProductName = "Nushell" ?>
<?define ApplicationFolderName = "nu" ?>
<?define ProductVersion = "$(env.NU_RELEASE_VERSION)" ?>
<?define Manufacturer = "The Nushell Project Developers" ?>
<?define UpgradeCode = "82D756D2-19FA-4F09-B10F-64942E89F364" ?>
<Package Id='*'
Keywords='Installer'
Description='A new type of shell'
Manufacturer='The Nushell Project Developers'
InstallerVersion='450'
Languages='1033'
Compressed='yes'
InstallScope='perUser'
SummaryCodepage='1252'
Platform='$(var.Platform)'/>
<!-- https://docs.firegiant.com/wix/schema/wxs/package/ -->
<Package
Compressed="yes"
Id="Nushell.Nushell"
InstallerVersion="500"
Scope="perUserOrMachine"
Name="$(var.ProductName)"
Version="$(var.ProductVersion)"
UpgradeCode="$(var.UpgradeCode)"
Manufacturer="$(var.Manufacturer)" >
<MajorUpgrade
Schedule='afterInstallInitialize'
DowngradeErrorMessage='A newer version of [ProductName] is already installed. Setup will now exit.'/>
<MajorUpgrade
MigrateFeatures="yes"
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'/>
<Property Id="ALLUSERS" Secure="yes" Value="2" />
<Property Id="MSIINSTALLPERUSER" Secure="yes" Value="1" />
<!-- Embed cab media to MSI file -->
<Media Id="1" Cabinet="cab1.cab" EmbedCab="yes" />
<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:
<!-- Allow install for Current User Or Machine -->
<Property Id="WixUISupportPerUser" Value="1" />
<Property Id="WixUISupportPerMachine" Value="1" />
<!-- Install for PerUser by default -->
<!-- If set to WixPerMachineFolder will install for PerMachine by default -->
<Property Id="WixAppFolder" Value="WixLocalAppDataFolder" />
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>
<!--
Support for winget install `——scope machine`:
Winget doesn't directly pass ALLUSERS=1 to the MSI installer when using
——scope machine. Instead, it passes a property called INSTALLSCOPEMACHINE=1
This converts the winget parameter to the standard MSI parameter.
FIXME: However, this doesn't seem to work...
-->
<SetProperty Id="ALLUSERS" Value="1" After="LaunchConditions" Condition="INSTALLSCOPEMACHINE=1" />
<!-- This ensures the per-user flag is turned off when installing for all users. -->
<SetProperty Id="MSIINSTALLPERUSER" Value="0" After="LaunchConditions" Condition="INSTALLSCOPEMACHINE=1" />
<Component Id='icon0' Guid='*' Win64='$(var.Win64)'>
<File
Id='icon0'
Name='nu.ico'
DiskId='1'
Source='assets/nu_logo.ico'
KeyPath='yes'/>
</Component>
<!-- Workaround Wix Bug: https://github.com/wixtoolset/issues/issues/2165 -->
<!-- The suggested folder in the dest folder dialog should be C:\Program Files\nu -->
<CustomAction Id="Overwrite_WixSetDefaultPerMachineFolder" Property="WixPerMachineFolder"
Value="[ProgramFiles64Folder][ApplicationFolderName]" Execute="immediate" />
<CustomAction Id="Overwrite_ARPINSTALLLOCATION" Property="ARPINSTALLLOCATION"
Value="[ProgramFiles64Folder][ApplicationFolderName]" Execute="immediate" />
<InstallUISequence>
<Custom Action="Overwrite_WixSetDefaultPerMachineFolder" After="WixSetDefaultPerMachineFolder" />
</InstallUISequence>
<InstallExecuteSequence>
<Custom Action="Overwrite_WixSetDefaultPerMachineFolder" After="WixSetDefaultPerMachineFolder" />
<Custom Action="Overwrite_ARPINSTALLLOCATION" After="InstallValidate"/>
</InstallExecuteSequence>
<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='no'/>
</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>
<!--
<Component Id='binary23' Guid='*' Win64='$(var.Win64)'>
<File
Id='exe23'
Name='nu_plugin_stream_example.exe'
DiskId='1'
Source='target\$(var.Profile)\nu_plugin_stream_example.exe'
KeyPath='yes'/>
</Component>
-->
<Component Id='binary24' Guid='*' Win64='$(var.Win64)'>
<File
Id='exe24'
Name='nu_plugin_polars.exe'
DiskId='1'
Source='target\$(var.Profile)\nu_plugin_polars.exe'
KeyPath='yes'/>
</Component>
</Directory>
</Directory>
</Directory>
<!-- Enable UAC prompt when installing for all users -->
<!-- <Property Id="MSIUSEREALADMINDETECTION" Value="1" /> -->
<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>
<Icon Id="ProductIconId" SourceFile="$(var.ProjectDir)/nu.ico"/>
<Property Id="ARPPRODUCTICON" Value="ProductIconId" />
<Property Id='ARPHELPLINK' Value='https://www.nushell.sh/book/' />
<Property Id="ApplicationFolderName" Value="$(var.ApplicationFolderName)" />
<!-- INSTALLDIR is the logical target directory whose path will be set by the INSTALLDIR property. -->
<Directory Id="INSTALLDIR" Name="$(var.ApplicationFolderName)">
<!-- LOGICAL_BINDIR's path will be set by the LOGICAL_BINDIR property -->
<Directory Id="LOGICAL_BINDIR" Name="bin" />
</Directory>
<!-- Per Machine Install - these are the definitions of the physical locations -->
<StandardDirectory Id="ProgramFiles64Folder">
<Directory Id="APPLICATIONFOLDER" Name="$(var.ApplicationFolderName)">
<Directory Id="BINDIR" Name="bin">
<!-- Per-machine PATH component -->
<Component Id="EnvironmentPathMachine" Guid="*" Condition="ALLUSERS=1 AND NOT MSIINSTALLPERUSER=1">
<!-- The value MUST BE [LOGICAL_BINDIR] to make sure the env been removed for a custom dir installation -->
<Environment Id="PATHMachine"
Name="PATH"
Value="[LOGICAL_BINDIR]"
Permanent="no"
Part="last"
Action="set"
System="yes" />
<RegistryValue Root="HKLM"
Key="Software\nu"
Name="installed"
Type="integer"
Value="1"
KeyPath="yes" />
</Component>
</Directory>
</Directory>
</StandardDirectory>
<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'/>
<!-- Install for Current User - these are the definitions of the physical locations -->
<StandardDirectory Id="LocalAppDataFolder">
<Directory Id="LocalAppProgramsFolder" Name="Programs">
<Directory Id="INSTALLDIR_USER" Name="$(var.ApplicationFolderName)">
<Directory Id="BINDIR_USER" Name="bin">
<!-- Per-user PATH component -->
<Component Id="EnvironmentPathUser" Guid="*" Condition="MSIINSTALLPERUSER=1">
<Environment Id="PATHUser"
Name="PATH"
Value="[BINDIR_USER]"
Permanent="no"
Part="last"
Action="set"
System="no" />
<RegistryValue Root="HKCU"
Key="Software\nu"
Name="installed"
Type="integer"
Value="1"
KeyPath="yes" />
</Component>
</Directory>
</Directory>
</Directory>
<ComponentRef Id='icon0'/>
<!-- Windows Terminal Profile Directories -->
<Directory Id="AppDataMicrosoftFolder" Name="Microsoft">
<Directory Id="AppDataWindowsTerminalFolder" Name="Windows Terminal">
<Directory Id="WindowsTerminalProfileFolder" Name="Fragments">
<Directory Id="WindowsTerminalProfileAppFolder" Name="$(var.ApplicationFolderName)">
<Component Id="WindowsTerminalProfile" Guid="*">
<File Id="WindowsTerminalProfileFile"
Name="nu.json"
KeyPath="yes"
Source="$(var.ProjectDir)\windows-terminal-profile.json" />
<RegistryValue Root="HKCU"
Key="Software\nu"
Name="WindowsTerminalProfile"
Value="1"
Type="integer" />
<RemoveFolder Id="RemoveWindowsTerminalProfileFolderA" Directory="WindowsTerminalProfileAppFolder" On="uninstall" />
<RemoveFolder Id="RemoveWindowsTerminalProfileFolderB" Directory="WindowsTerminalProfileFolder" On="uninstall" />
<RemoveFolder Id="RemoveWindowsTerminalProfileFolderC" Directory="AppDataWindowsTerminalFolder" On="uninstall" />
<RemoveFolder Id="RemoveWindowsTerminalProfileFolderD" Directory="AppDataMicrosoftFolder" On="uninstall" />
</Component>
</Directory>
</Directory>
</Directory>
</Directory>
</StandardDirectory>
<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'/>
<!-- <ComponentRef Id='binary23'/> -->
<ComponentRef Id='binary24'/>
<ComponentGroup Id="NushellBinaries" Directory="LOGICAL_BINDIR">
<Component Id="Nu_Main" Guid="*">
<File Id="nu.exe" Source="$(var.SourceDir)\nu.exe" KeyPath="yes" />
</Component>
<Component Id="Less" Guid="*">
<File Id="less.exe" Source="$(var.SourceDir)\less.exe" KeyPath="yes" />
</Component>
<Component Id="Nu_Plugin_Inc" Guid="*">
<File Id="nu_plugin_inc.exe" Source="$(var.SourceDir)\nu_plugin_inc.exe" KeyPath="yes" />
</Component>
<Component Id="Nu_Plugin_Gstat" Guid="*">
<File Id="nu_plugin_gstat.exe" Source="$(var.SourceDir)\nu_plugin_gstat.exe" KeyPath="yes" />
</Component>
<Component Id="Nu_Plugin_Query" Guid="*">
<File Id="nu_plugin_query.exe" Source="$(var.SourceDir)\nu_plugin_query.exe" KeyPath="yes" />
</Component>
<Component Id="Nu_Plugin_Polars" Guid="*">
<File Id="nu_plugin_polars.exe" Source="$(var.SourceDir)\nu_plugin_polars.exe" KeyPath="yes" />
</Component>
<Component Id="Nu_Plugin_Formats" Guid="*">
<File Id="nu_plugin_formats.exe" Source="$(var.SourceDir)\nu_plugin_formats.exe" KeyPath="yes" />
</Component>
<Component Id="Less_License" Guid="*">
<File Id="LICENSE_for_less.txt" Source="$(var.SourceDir)\LICENSE-for-less.txt" KeyPath="yes" />
</Component>
</ComponentGroup>
<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>
<!-- License and Icon in main installation directory -->
<ComponentGroup Id="NushellResources" Directory="INSTALLDIR">
<Component Id="Nu_Icon" Guid="*">
<File Id="nu.ico" Source="$(var.ProjectDir)\nu.ico" KeyPath="yes" />
</Component>
<Component Id="Nu_Readme" Guid="*">
<File Id="README.txt" Source="$(var.ProjectDir)\README.txt" KeyPath="yes" />
</Component>
<Component Id="Nu_License" Guid="*">
<File Id="License.rtf" Source="$(var.ProjectDir)\License.rtf" KeyPath="yes" />
</Component>
</ComponentGroup>
<Feature
Id='WindowsTerminalProfile'
Title='Windows Terminal Profile'
Description='Add [ProductName] profile to Windows Terminal.'
Level='1'
Absent='allow'>
<ComponentRef Id='WindowsTerminalProfile'/>
</Feature>
</Feature>
<!-- Main feature set -->
<Feature Id="ProductFeature"
Level="1"
Title="Nushell"
Description="Install $(var.ProductName) and plugins.">
<ComponentGroupRef Id="NushellBinaries" />
<ComponentGroupRef Id="NushellResources" />
<ComponentRef Id="EnvironmentPathUser" />
<ComponentRef Id="EnvironmentPathMachine" />
</Feature>
<SetProperty Id='ARPINSTALLLOCATION' Value='[APPLICATIONFOLDER]' After='CostFinalize'/>
<!-- Windows Terminal Profile Feature -->
<Feature Id="WindowsTerminalProfileFeature"
Level="1"
Title="Windows Terminal Profile"
Description="Add $(var.ProductName) profile to Windows Terminal.">
<ComponentRef Id="WindowsTerminalProfile" />
</Feature>
<Icon Id='ProductICO' SourceFile='assets/nu_logo.ico'/>
<Property Id='ARPPRODUCTICON' Value='ProductICO' />
<!-- Load Advanced UI -->
<WixVariable Id="WixUILicenseRtf" Value="$(var.ProjectDir)\License.rtf" />
<ui:WixUI Id="WixUI_Advanced" />
<Property Id='ARPHELPLINK' Value='https://www.nushell.sh/book/'/>
<!-- Windows Version Check -->
<Launch Condition="VersionNT >= 601" Message="This application requires Windows 7 or later." />
<!-- for Value, see https://learn.microsoft.com/en-ca/windows/win32/msi/formatted -->
<SetProperty
Id="ReplacePathsInWindowsTerminalProfile"
Sequence="execute"
Value="&quot;[#exe0]&quot; -c &quot;let doc = (open `[#WindowsTerminalProfileFile]` | update profiles.commandline `[#exe0]` | update profiles.icon `[#icon0]`); $doc | 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>
<!-- Arch checking -->
<?if $(sys.BUILDARCH) = x64 ?>
<Launch Condition="VersionNT64" Message="This installation package is only supported on 64-bit Windows." />
<?endif?>
<UI>
<UIRef Id='WixUI_FeatureTree'/>
<!--
Disabling the EULA dialog in the installer is a two step process:
<?if $(sys.BUILDARCH) = arm64 ?>
<Launch Condition="ProcessorArchitecture = 'ARM64'" Message="This installation package is only supported on ARM64 Windows." />
<?endif?>
1. Uncomment the following two `Publish` tags
2. Comment out or remove the `<WiXVariable Id='WixUILicenseRtf'...` tag further down
<!-- If installing per-user (MSIINSTALLPERUSER=1), this sets INSTALLDIR and BINDIR to point to user-specific paths -->
<SetProperty Id="INSTALLDIR"
Action="SetINSTALLDIR_User"
Value="[LocalAppDataFolder]Programs\$(var.ApplicationFolderName)"
After="LaunchConditions"
Condition="MSIINSTALLPERUSER=1"
Sequence="both" />
<SetProperty Id="BINDIR"
Action="SetBINDIR_User"
Value="[LocalAppDataFolder]Programs\$(var.ApplicationFolderName)\bin"
After="LaunchConditions"
Condition="MSIINSTALLPERUSER=1"
Sequence="both" />
-->
<!--<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>-->
<!-- If installing per-machine (ALLUSERS=1 AND NOT MSIINSTALLPERUSER=1), this sets INSTALLDIR and BINDIR to point to machine-wide (Program Files) paths -->
<SetProperty Id="INSTALLDIR"
Action="SetINSTALLDIR_Machine"
Value="[APPLICATIONFOLDER]"
After="LaunchConditions"
Condition="ALLUSERS=1 AND NOT MSIINSTALLPERUSER=1"
Sequence="both" />
</UI>
<!-- Override APPLICATIONFOLDER for 64-bit installations -->
<?if $(sys.BUILDARCH) = x64 OR $(sys.BUILDARCH) = arm64 ?>
<SetProperty Id="APPLICATIONFOLDER"
Value="[ProgramFiles64Folder]$(var.ApplicationFolderName)"
After="LaunchConditions"
Condition="ALLUSERS=1 AND NOT MSIINSTALLPERUSER=1"
Sequence="both" />
<?endif?>
<!--
Disabling the EULA dialog in the installer requires commenting out
or removing the following `WixVariable` tag
-->
<WixVariable Id='WixUILicenseRtf' Value='wix\License.rtf'/>
<SetProperty Id="BINDIR"
Action="SetBINDIR_Machine"
Value="[BINDIR]"
After="LaunchConditions"
Condition="ALLUSERS=1 AND NOT MSIINSTALLPERUSER=1"
Sequence="both" />
<!-- Set the LOGICAL_BINDIR property to the resolved BINDIR path -->
<!-- This line MUST NOT be removed in order to set a custom folder for PerMachine installation -->
<SetProperty Id="LOGICAL_BINDIR" Value="[BINDIR]" After="LaunchConditions" Sequence="both" />
<!--
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.
<!-- Property that defines the command executed by the Windows Terminal Profile custom action -->
<!-- for Value, see https://learn.microsoft.com/en-ca/windows/win32/msi/formatted -->
<SetProperty Id="ReplacePathsInWindowsTerminalProfile"
Sequence="execute"
After="CostFinalize"
Value="&quot;[#nu.exe]&quot; -c &quot;let doc = (open `[#WindowsTerminalProfileFile]` | update profiles.commandline `[#nu.exe]` | update profiles.icon `[#nu.ico]`); $doc | save -f `[#WindowsTerminalProfileFile]`&quot;"
Condition="&amp;WindowsTerminalProfileFeature=3" />
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>
<!-- Defines the custom action that updates paths in the Windows Terminal profile JSON file -->
<CustomAction Id="ReplacePathsInWindowsTerminalProfile"
Return="check"
Impersonate="yes"
Execute="deferred"
DllEntry="WixQuietExec"
BinaryRef="Wix4UtilCA_$(sys.BUILDARCHSHORT)" />
<InstallExecuteSequence>
<Custom Action="ReplacePathsInWindowsTerminalProfile" Before="InstallFinalize"
Condition="&amp;WindowsTerminalProfileFeature=3" />
</InstallExecuteSequence>
</Package>
</Wix>

BIN
wix/nu.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.3 KiB