mirror of
https://github.com/nushell/nushell.git
synced 2025-05-29 22:29:06 +02:00
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:
parent
6906a0ca50
commit
10be753ab7
148
.github/workflows/nightly-build.yml
vendored
148
.github/workflows/nightly-build.yml
vendored
@ -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
|
||||
|
79
.github/workflows/release-pkg.nu
vendored
79
.github/workflows/release-pkg.nu
vendored
@ -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' [] {
|
||||
|
44
.github/workflows/release.yml
vendored
44
.github/workflows/release.yml
vendored
@ -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 }}
|
||||
|
||||
|
@ -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)");
|
||||
|
BIN
wix/License.rtf
BIN
wix/License.rtf
Binary file not shown.
36
wix/main.wixproj
Normal file
36
wix/main.wixproj
Normal 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>
|
699
wix/main.wxs
699
wix/main.wxs
@ -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=""[#exe0]" -c "let doc = (open `[#WindowsTerminalProfileFile]` | update profiles.commandline `[#exe0]` | update profiles.icon `[#icon0]`); $doc | save -f `[#WindowsTerminalProfileFile]`""
|
||||
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=""[#nu.exe]" -c "let doc = (open `[#WindowsTerminalProfileFile]` | update profiles.commandline `[#nu.exe]` | update profiles.icon `[#nu.ico]`); $doc | save -f `[#WindowsTerminalProfileFile]`""
|
||||
Condition="&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="&WindowsTerminalProfileFeature=3" />
|
||||
</InstallExecuteSequence>
|
||||
</Package>
|
||||
</Wix>
|
||||
|
BIN
wix/nu.ico
Normal file
BIN
wix/nu.ico
Normal file
Binary file not shown.
After Width: | Height: | Size: 7.3 KiB |
Loading…
x
Reference in New Issue
Block a user