diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 0591f76..5779faf 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -14,18 +14,24 @@ jobs: fail-fast: false matrix: include: - - os: windows-latest + - os: windows-2022 target: x86_64-pc-windows-msvc - name: windows-x86_64 + name: windows-x64 + - os: windows-2022 + target: i686-pc-windows-msvc + name: windows-x86 + - os: windows-2022 + target: aarch64-pc-windows-msvc + name: windows-arm64 - os: ubuntu-22.04 # build on the oldest supported runner for broader glibc compatibility target: x86_64-unknown-linux-gnu name: linux-x86_64 - os: macos-14 # Apple Silicon target: aarch64-apple-darwin - name: macos-aarch64 + name: macos-arm64 - os: macos-14 # Intel (cross-compiled from Apple Silicon to avoid queue delays) target: x86_64-apple-darwin - name: macos-x86_64 + name: macos-x64 steps: - uses: actions/checkout@v4 diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index b46e8d2..db8fc0b 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -1,13 +1,15 @@ name: Release -# Build native binaries for Windows / Linux / macOS. +# Build native installers and portable archives for Windows / Linux / macOS. # - Push a tag like `v0.2.3` -> builds all platforms and attaches the archives # to a GitHub Release. +# - Push a `build/**` branch -> builds preview installers as workflow artifacts. # - Run manually (workflow_dispatch) -> builds all platforms and uploads them as # downloadable workflow artifacts (no release created). on: push: + branches: ["build/**"] tags: ["v*"] workflow_dispatch: @@ -22,21 +24,43 @@ jobs: fail-fast: false matrix: include: - - os: windows-latest + - os: windows-2022 target: x86_64-pc-windows-msvc - name: windows-x86_64 + name: windows-x64 + kind: windows + arch: x64 + bin: ashell.exe + - os: windows-2022 + target: i686-pc-windows-msvc + name: windows-x86 + kind: windows + arch: x86 + bin: ashell.exe + - os: windows-2022 + target: aarch64-pc-windows-msvc + name: windows-arm64 + kind: windows + arch: arm64 bin: ashell.exe - os: ubuntu-22.04 # build on the oldest supported runner for broader glibc compatibility target: x86_64-unknown-linux-gnu - name: linux-x86_64 + name: linux-x64 + kind: linux + arch: x64 bin: ashell - os: macos-14 # Apple Silicon target: aarch64-apple-darwin - name: macos-aarch64 + name: macos-arm64 + kind: macos + arch: arm64 + binary_arch: arm64 bin: ashell - os: macos-14 # Intel (cross-compiled from Apple Silicon to avoid queue delays) target: x86_64-apple-darwin - name: macos-x86_64 + name: macos-x64 + kind: macos + arch: x64 + binary_arch: x86_64 bin: ashell steps: @@ -68,28 +92,46 @@ jobs: - name: Build (release) run: cargo build --release --target ${{ matrix.target }} - - name: Package + - name: Set package metadata shell: bash run: | - set -eu - VERSION="${GITHUB_REF_NAME:-dev}" - STAGE="ashell-${VERSION}-${{ matrix.name }}" + set -euo pipefail + VERSION="$(sed -n 's/^version = "\([^"]*\)"/\1/p' Cargo.toml | head -n 1)" + if [ -z "$VERSION" ]; then + echo "Unable to read the package version from Cargo.toml" >&2 + exit 1 + fi - if [ "${{ runner.os }}" = "macOS" ]; then - # ── Build a proper .app bundle ──────────────────────────────────── - # Note: We build the bundle manually here rather than running - # scripts/package-macos-app.sh, because that script runs `cargo build` - # without respecting the `--target` flag from the matrix. + if [ "$GITHUB_REF_TYPE" = "tag" ]; then + PACKAGE_VERSION="${GITHUB_REF_NAME#v}" + if [ "$PACKAGE_VERSION" != "$VERSION" ]; then + echo "Tag version $PACKAGE_VERSION does not match Cargo.toml version $VERSION" >&2 + exit 1 + fi + else + PACKAGE_VERSION="${VERSION}-dev.${GITHUB_SHA:0:7}" + fi - APP="ashell.app" - CONTENTS="$APP/Contents" - mkdir -p "$CONTENTS/MacOS" "$CONTENTS/Resources" + echo "VERSION=$VERSION" >> "$GITHUB_ENV" + echo "PACKAGE_VERSION=$PACKAGE_VERSION" >> "$GITHUB_ENV" + echo "PACKAGE_BASENAME=ashell-v${PACKAGE_VERSION}-${{ matrix.name }}" >> "$GITHUB_ENV" - cp "target/${{ matrix.target }}/release/ashell" "$CONTENTS/MacOS/" - cp "assets/icons/ashell.icns" "$CONTENTS/Resources/ashell.icns" + - name: Package macOS app, DMG, and portable archive + if: matrix.kind == 'macos' + shell: bash + run: | + set -euo pipefail + APP_ROOT="$RUNNER_TEMP/${PACKAGE_BASENAME}-app" + DMG_ROOT="$RUNNER_TEMP/${PACKAGE_BASENAME}-dmg" + APP="$APP_ROOT/ashell.app" + CONTENTS="$APP/Contents" - VERSION_NUM="${VERSION#v}" - cat > "$CONTENTS/Info.plist" < "$CONTENTS/Info.plist" < @@ -110,9 +152,9 @@ jobs: CFBundlePackageType APPL CFBundleShortVersionString - ${VERSION_NUM} + ${VERSION} CFBundleVersion - 1 + ${GITHUB_RUN_NUMBER} LSMinimumSystemVersion 12.0 NSHighResolutionCapable @@ -121,35 +163,88 @@ jobs: EOF - printf 'APPL????' > "$CONTENTS/PkgInfo" + printf 'APPL????' > "$CONTENTS/PkgInfo" + plutil -lint "$CONTENTS/Info.plist" - # Ad-hoc code-sign the assembled bundle. - codesign --force --deep --sign - "$APP" - codesign --verify --verbose "$APP" + # Release builds remain ad-hoc signed until signing credentials are configured. + codesign --force --deep --sign - "$APP" + codesign --verify --deep --strict --verbose=2 "$APP" - # Package with ditto (Apple's tool) to preserve signature/metadata - ditto -c -k --keepParent "$APP" "${STAGE}.zip" - echo "ASSET=${STAGE}.zip" >> "$GITHUB_ENV" + ditto -c -k --sequesterRsrc --keepParent \ + "$APP" "dist/${PACKAGE_BASENAME}-portable.zip" + ditto "$APP" "$DMG_ROOT/ashell.app" + ln -s /Applications "$DMG_ROOT/Applications" + hdiutil create \ + -volname "ashell ${VERSION}" \ + -srcfolder "$DMG_ROOT" \ + -ov \ + -format UDZO \ + "dist/${PACKAGE_BASENAME}.dmg" - elif [ "${{ runner.os }}" = "Windows" ]; then - mkdir "$STAGE" - cp "target/${{ matrix.target }}/release/${{ matrix.bin }}" "$STAGE/" - 7z a "${STAGE}.zip" "$STAGE" >/dev/null - echo "ASSET=${STAGE}.zip" >> "$GITHUB_ENV" - - else - # Linux - mkdir "$STAGE" - cp "target/${{ matrix.target }}/release/${{ matrix.bin }}" "$STAGE/" - tar -czf "${STAGE}.tar.gz" "$STAGE" - echo "ASSET=${STAGE}.tar.gz" >> "$GITHUB_ENV" + EXPECTED_ARCH="${{ matrix.binary_arch }}" + ACTUAL_ARCHS="$(lipo -archs "$CONTENTS/MacOS/ashell")" + if [ "$ACTUAL_ARCHS" != "$EXPECTED_ARCH" ]; then + echo "Expected $EXPECTED_ARCH binary, found $ACTUAL_ARCHS" >&2 + exit 1 fi + shasum -a 256 dist/* + + - name: Package Windows installer and portable archive + if: matrix.kind == 'windows' + shell: pwsh + env: + ASHELL_ARCH: ${{ matrix.arch }} + ASHELL_BINARY_PATH: ${{ github.workspace }}\target\${{ matrix.target }}\release\ashell.exe + ASHELL_OUTPUT_DIR: ${{ github.workspace }}\dist + run: | + $ErrorActionPreference = "Stop" + New-Item -ItemType Directory -Path "dist" -Force | Out-Null + + $isccCommand = Get-Command "ISCC.exe" -ErrorAction SilentlyContinue + if ($null -ne $isccCommand) { + $iscc = $isccCommand.Source + } else { + $iscc = "${env:ProgramFiles(x86)}\Inno Setup 6\ISCC.exe" + } + if (-not (Test-Path $iscc)) { + throw "Inno Setup compiler was not found" + } + + & $iscc "packaging\windows\ashell.iss" + if ($LASTEXITCODE -ne 0) { + throw "Inno Setup failed with exit code $LASTEXITCODE" + } + + $installer = "dist\${env:PACKAGE_BASENAME}-setup.exe" + if (-not (Test-Path $installer)) { + throw "Expected installer was not created: $installer" + } + + $stage = Join-Path $env:RUNNER_TEMP $env:PACKAGE_BASENAME + New-Item -ItemType Directory -Path $stage | Out-Null + Copy-Item $env:ASHELL_BINARY_PATH (Join-Path $stage "ashell.exe") + Compress-Archive -Path $stage -DestinationPath "dist\${env:PACKAGE_BASENAME}-portable.zip" + Get-FileHash -Algorithm SHA256 "dist\*" + + - name: Package Linux portable archive + if: matrix.kind == 'linux' + shell: bash + run: | + set -euo pipefail + STAGE="$RUNNER_TEMP/$PACKAGE_BASENAME" + mkdir -p "$STAGE" dist + cp "target/${{ matrix.target }}/release/${{ matrix.bin }}" "$STAGE/" + tar -C "$RUNNER_TEMP" -czf "dist/${PACKAGE_BASENAME}.tar.gz" "$PACKAGE_BASENAME" + sha256sum dist/* + - name: Upload workflow artifact uses: actions/upload-artifact@v4 with: name: ${{ matrix.name }} - path: ${{ env.ASSET }} + path: dist/* + if-no-files-found: error + retention-days: 14 publish: name: Publish Release @@ -161,11 +256,12 @@ jobs: uses: actions/download-artifact@v4 with: path: dist + merge-multiple: true - name: Attach to GitHub Release uses: softprops/action-gh-release@v2 with: - files: dist/**/* + files: dist/* generate_release_notes: true fail_on_unmatched_files: true @@ -187,12 +283,13 @@ jobs: with: pattern: macos-* path: dist + merge-multiple: true - name: Update Cask run: | VERSION=${GITHUB_REF#refs/tags/v} - SHA_ARM=$(sha256sum dist/macos-aarch64/*.zip | cut -d' ' -f1) - SHA_INTEL=$(sha256sum dist/macos-x86_64/*.zip | cut -d' ' -f1) + SHA_ARM=$(sha256sum "dist/ashell-v${VERSION}-macos-arm64.dmg" | cut -d' ' -f1) + SHA_INTEL=$(sha256sum "dist/ashell-v${VERSION}-macos-x64.dmg" | cut -d' ' -f1) mkdir -p tap/Casks CASK_FILE="tap/Casks/ashell.rb" @@ -203,11 +300,11 @@ jobs: on_arm do sha256 "${SHA_ARM}" - url "https://github.com/rust-kotlin/ashell/releases/download/v#{version}/ashell-v#{version}-macos-aarch64.zip" + url "https://github.com/rust-kotlin/ashell/releases/download/v#{version}/ashell-v#{version}-macos-arm64.dmg" end on_intel do sha256 "${SHA_INTEL}" - url "https://github.com/rust-kotlin/ashell/releases/download/v#{version}/ashell-v#{version}-macos-x86_64.zip" + url "https://github.com/rust-kotlin/ashell/releases/download/v#{version}/ashell-v#{version}-macos-x64.dmg" end name "ashell" diff --git a/.gitignore b/.gitignore index e89d4af..ebb28db 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ -/target/ +dist/ +target/ .DS_Store diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..fba52f3 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,115 @@ +# 更新日志 + +本文档记录 ashell 的重要功能变更。 + +格式参考 [Keep a Changelog](https://keepachangelog.com/zh-CN/1.1.0/),版本号遵循 +[语义化版本](https://semver.org/lang/zh-CN/)。 + +## [Unreleased] + +### 新增 + +- 新增应用退出快捷键。macOS 默认使用 `Command+Q`,Windows 默认使用 `Alt+F4`, + 其他平台默认使用 `Ctrl+Q`。 +- 在设置页快捷键面板增加“退出应用”配置项,支持修改或取消绑定。 +- 新增窗口位置、尺寸及最大化或全屏状态记忆,并在显示器布局变化后自动校正窗口位置。 +- 新增“记忆标签页”设置,默认关闭。启用后可恢复标签组、分屏布局、活动标签、 + 本地工作目录和终端编码。 +- 本地终端和 SSH 标签页新增独立编码切换,支持 UTF-8、GB18030、GBK、Big5、 + Shift_JIS、EUC-KR 和 Windows-1252。 +- 远程文件编辑器新增编码切换,额外支持 UTF-16 LE、UTF-16 BE、BOM 检测与保留。 +- 新增 CSV 连接导入和导出功能。 +- 连接列表新增筛选、批量选择、已选数量统计和批量删除功能。 +- 新增全局 SSH 历史命令功能,支持筛选、选择、批量删除、复制和执行。 +- 新增 SSH 远程进程查看功能,可按 CPU 或内存占用查看、筛选、刷新、展开详情和复制信息。 +- 新增远程进程终止功能,并增加二次确认和系统进程 PID 保护。 +- 新增 SSH 网络端口查看功能,支持筛选、刷新以及查看协议、地址、端口、状态和进程。 +- 远程文件面板新增目录树、定位当前目录、折叠全部目录和目录加载错误提示。 +- 远程文件新增重命名及应用内文件编辑功能。 +- 远程文件编辑窗口支持拖动和调整大小,按 `Esc` 可放弃修改并关闭窗口。 +- 发布流程新增 macOS x64/arm64 DMG 安装包,以及 Windows x64/x86/arm64 安装程序; + 各平台同时保留便携压缩包。 + +### 变更 + +- 将英文连接管理标题由 `CONNECTION MANAGEMENT` 简化为 `CONNECTIONS`。 +- 重新整理连接管理操作区,集中展示导入、导出和新建连接操作。 +- 连接列表改为名称靠左、连接地址靠右的整行布局,并保持列表项宽度一致。 +- 点击连接行只切换勾选状态,只有点击连接图标才发起连接。 +- 编辑连接保存后不再自动打开该连接。 +- 新建和编辑页面标题调整为“新建连接”和“编辑连接”。 +- SSH 表单改为 IP 与端口同行、账号与密码同行,并增加默认终端编码设置。 +- 右上角加号改为紧凑下拉菜单,仅保留“本地终端”和“新建连接”。 +- CSV 导出格式精简为 `name,host,port,username,password`,不再导出 ID、认证类型、 + 私钥路径、私钥内容和私钥口令。 +- CSV 导入支持常见字段别名、UTF-8 BOM、带引号内容和多行密码,端口为空时默认使用 `22`。 +- CSV 导入使用 `host + port + username` 识别同一连接,匹配时更新原配置并保留本地专用字段。 +- 同一 CSV 中的重复连接以最后一条为准;本地存在多个相同标识时跳过更新并计入导入结果。 +- 保留对旧版 CSV 可选认证、私钥和口令字段的兼容导入能力。 +- 强化活动标签样式,通过文字、颜色和背景区分当前标签页。 +- 本地终端标签标题改为当前目录,并使用 `~`、`~/Sites/ashell` 等紧凑路径。 +- 恢复的 SSH 标签页不再自动连接;当前选中恢复或已断开的 SSH 标签时才询问是否重新连接。 +- 重新连接窗口精简标题、说明文字和宽度。 +- 历史命令改为宽度适中的小型弹出窗口,最多显示 10 行,超出后滚动。 +- 历史命令跨 SSH 标签页可用,当前连接的命令优先显示;超长命令保持单行并使用省略号。 +- 点击历史命令行只切换勾选状态,执行和复制分别使用独立图标;执行后自动关闭弹出窗口。 +- 相同历史命令自动去重并保留最新记录,每个 SSH 连接最多保存 200 条。 +- 远程文件面板只在当前标签为 SSH 时显示,并随活动 SSH 标签切换对应的 SFTP 会话。 +- SSH 当前目录变化时自动同步远程文件路径。 +- 远程文件面板改为左侧目录树、右侧当前目录内容的双栏布局,分隔宽度可拖动并持久化。 +- 面板头部整合传输记录、历史命令和更多操作,移除原底部传输栏。 +- 同步路径、刷新、添加和更多操作按钮增加名称并调整图标。 +- 文件列表复选框固定在左侧,列宽支持独立拖动。 +- 文件列表仅在内容确实溢出时显示滚动条,并支持触摸板纵向和横向滚动。 +- 文件右键菜单和其他下拉菜单根据文字长度自适应宽度。 +- 远程文件编辑改为应用内编辑,支持按扩展名进行语法高亮、2 MB 文件限制和原权限保留。 +- CPU、内存和网络模块仅在已连接 SSH 标签页中提供远程详情入口。 +- 进程表头与 CPU 或内存数据列保持对齐,复制操作位于终止操作之前。 +- 统一按钮、复选框、删除、连接、执行和复制控件的鼠标指针反馈。 +- 统一连接列表和历史命令列表的复选框对齐、行间距、操作区间距及选择数量显示。 +- 清理未使用的本地化定义,统一 YAML 双引号格式,并保持中英文键一致。 + +### 修复 + +- 修复本地终端位于主目录时状态圆点越出标签栏的问题。 +- 修复本地目录变化后标签仍显示旧路径或错误项目路径的问题。 +- 修复管道、重定向等复合命令只记录最后一段内容的问题。 +- 修复历史命令未正确处理退格、`Ctrl+U`、`Ctrl+W` 和 `Ctrl+C` 的问题。 +- 修复 Vim、`crontab -e` 等全屏编辑状态下的内容被错误记录为历史命令的问题。 +- 修复历史命令重复、无故丢失或配置并发保存时被旧数据覆盖的问题。 +- 修复连接列表和历史命令列表的滚动条遮挡右侧操作按钮的问题。 +- 修复远程进程详情重复显示命令内容的问题。 +- 修复空目录展开后目录图标缩进漂移、无法重新折叠的问题。 +- 修复异步目录响应错误覆盖当前远程路径的问题。 +- 修复远程文件表头列宽无法自由拖动的问题。 +- 修复文件内容较窄时仍产生过大横向滚动范围的问题。 +- 修复窗口缩小时远程文件面板右侧按钮被遮挡的问题。 +- 修复触摸板无法正确进行文件列表纵向或横向滚动的问题。 +- 修复编辑器选择错误编码后可能将乱码永久写回远程文件的问题。 +- 修复重新连接后旧终端后端的延迟事件覆盖新连接状态的问题。 +- 修复设置、进程、端口、新建连接及编辑连接窗口在部分状态下无法打开的问题。 +- 修复系统进程和网络端口筛选框未随显示语言更新中英文占位文案的问题。 +- 修复多个交互元素缺少指针光标及下拉菜单宽度过大的问题。 + +### 兼容性与稳定性 + +- 增加 Linux、macOS 和 Windows 远程系统信息、进程及端口探测兼容。 +- Windows 远程探测使用 PowerShell 编码命令,Unix 环境根据可用工具自动回退。 +- 远程探测增加超时、退出状态和错误输出检查。 +- 本地终端目录跟踪同时兼容 Unix 进程检测和 Windows PowerShell 路径报告。 +- 窗口恢复会根据当前显示器可见区域限制尺寸和坐标,避免窗口恢复到屏幕之外。 +- 配置保存改为加锁、临时文件原子替换和备份恢复,降低并发写入或意外退出导致的数据损坏风险。 +- 主配置损坏时尝试从 `.bak` 恢复,并优先恢复修订号更新的历史命令。 +- 配置文件继续兼容旧版本缺少编码、历史命令和标签页字段的数据。 +- 远程文件保存采用临时文件替换方式,并尽可能保留原文件权限。 +- CSV 导出前增加明文密码安全提示;Unix 系统下导出文件权限设置为 `0600`。 +- 替换存在未来 Rust 不兼容警告的 `block` 依赖,并增加本地 `stacksafe-macro` 兼容补丁。 +- 移除 `proc-macro-error2` 相关依赖,消除对应的 Cargo 未来不兼容警告。 +- 增加 CSV、编码、配置恢复、标签恢复、SFTP 目录树、远程进程端口解析和过期事件过滤测试。 + +### 注意事项 + +- “记忆标签页”默认关闭,需要在设置页手动启用。 +- CSV 导出的密码为明文,不包含私钥和私钥口令,请妥善保管并在迁移后及时移除。 +- 应用内远程文件编辑器仅支持不超过 2 MB 的文件。 +- 文件内容无法使用当前编码完整解码,或修改内容无法使用目标编码表示时,将禁止保存以避免损坏文件。 diff --git a/README.en.md b/README.en.md index 95e3c9f..c332a7d 100644 --- a/README.en.md +++ b/README.en.md @@ -20,7 +20,11 @@ v0.4 builds on the v0.3 foundation and focuses on more capable workspace operati ## Download -You can download the latest pre-compiled releases for macOS, Windows, and Linux from the [GitHub Releases page](https://github.com/rust-kotlin/ashell/releases/latest). +You can download the latest installers from the [GitHub Releases page](https://github.com/rust-kotlin/ashell/releases/latest): + +- macOS: `.dmg` installers for x64 and arm64, plus portable `.zip` archives. +- Windows: `Setup.exe` installers for x64, x86, and arm64, plus portable `.zip` archives. +- Linux: a portable x64 `.tar.gz` archive. ## Mac Installation Guide @@ -43,14 +47,27 @@ brew upgrade ashell --cask ### Method 2: Manual Download -1. Download and unzip from the [Releases page](https://github.com/rust-kotlin/ashell/releases/latest). -2. Move `ashell.app` to your **Applications** folder. +1. Download the `.dmg` matching your processor from the [Releases page](https://github.com/rust-kotlin/ashell/releases/latest). +2. Open the DMG and drag `ashell.app` into **Applications**. 3. Since the app uses ad-hoc signing, macOS may warn that the app is "damaged" upon first launch. If this happens, open Terminal and run: ```bash sudo xattr -cr /Applications/ashell.app ``` +## Windows Installation Guide + +Download the appropriate installer from the [Releases page](https://github.com/rust-kotlin/ashell/releases/latest): + +| System architecture | Installer suffix | +| --- | --- | +| Intel/AMD 64-bit | `windows-x64-setup.exe` | +| Intel/AMD 32-bit | `windows-x86-setup.exe` | +| Windows on ARM | `windows-arm64-setup.exe` | + +The installer can optionally create a desktop shortcut and registers ashell in the Start menu and the Windows uninstall list. +The installer is not yet signed with a commercial code-signing certificate, so Windows SmartScreen may display a security warning. + ## Features The current version provides a fully-featured GPUI-native workspace: diff --git a/README.md b/README.md index e6e5555..d496de0 100644 --- a/README.md +++ b/README.md @@ -20,7 +20,11 @@ v0.4 在 v0.3 打下的基础上,重点带来了更完整的工作区操作能 ## 下载 -您可以从 [GitHub Releases 页面](https://github.com/rust-kotlin/ashell/releases/latest) 下载 macOS、Windows 和 Linux 版本的最新预编译程序。 +您可以从 [GitHub Releases 页面](https://github.com/rust-kotlin/ashell/releases/latest) 下载最新安装包: + +- macOS:x64 和 arm64 的 `.dmg`,同时提供便携 `.zip`。 +- Windows:x64、x86 和 arm64 的 `Setup.exe`,同时提供便携 `.zip`。 +- Linux:x64 便携 `.tar.gz`。 ## Mac 安装指南 @@ -43,14 +47,27 @@ brew upgrade ashell --cask ### 方法 2: 手动下载 -1. 从 [Releases 页面](https://github.com/rust-kotlin/ashell/releases/latest) 下载并解压。 -2. 将 `ashell.app` 拖入或移动到 **应用程序 (Applications)** 目录。 +1. 从 [Releases 页面](https://github.com/rust-kotlin/ashell/releases/latest) 下载与处理器匹配的 `.dmg`。 +2. 打开 DMG,将 `ashell.app` 拖入 **Applications** 目录。 3. 由于应用采用本地签名,初次启动时如果系统提示“App 已损坏,无法打开”,请打开终端(Terminal)并执行以下命令: ```bash sudo xattr -cr /Applications/ashell.app ``` +## Windows 安装指南 + +从 [Releases 页面](https://github.com/rust-kotlin/ashell/releases/latest) 下载对应安装程序: + +| 系统架构 | 安装包名称后缀 | +| --- | --- | +| Intel/AMD 64 位 | `windows-x64-setup.exe` | +| Intel/AMD 32 位 | `windows-x86-setup.exe` | +| Windows on ARM | `windows-arm64-setup.exe` | + +运行安装程序后,可选择是否创建桌面快捷方式;应用也会出现在开始菜单和系统卸载列表中。 +当前安装包尚未使用商业代码签名证书,Windows SmartScreen 可能显示安全提醒。 + ## 功能特性 当前版本提供了一个功能完备的 GPUI 原生工作区: diff --git a/packaging/windows/ChineseSimplified.isl b/packaging/windows/ChineseSimplified.isl new file mode 100644 index 0000000..30d9973 --- /dev/null +++ b/packaging/windows/ChineseSimplified.isl @@ -0,0 +1,417 @@ +; *** Inno Setup version 6.5.0+ Chinese Simplified messages *** +; +; To download user-contributed translations of this file, go to: +; https://jrsoftware.org/files/istrans/ +; +; Note: When translating this text, do not add periods (.) to the end of +; messages that didn't have them already, because on those messages Inno +; Setup adds the periods automatically (appending a period would result in +; two periods being displayed). +; +; Maintainer: Zhenghan Yang (Kira) +; Email: 847320916@QQ.com +; Github: https://github.com/kira-96/Inno-Setup-Chinese-Simplified-Translation +; Encoding: UTF-8 +; Translation based on network resource +; + +[LangOptions] +; The following three entries are very important. Be sure to read and +; understand the '[LangOptions] section' topic in the help file. +LanguageName=简体中文 +; About LanguageID, to reference link: +; https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-lcid/a9eac961-e77d-41a6-90a5-ce1a8b0cdb9c +LanguageID=$0804 +; LanguageCodePage should always be set if possible, even if this file is Unicode +; For English it's set to zero anyway because English only uses ASCII characters +LanguageCodePage=936 +; If the language you are translating to requires special font faces or +; sizes, uncomment any of the following entries and change them accordingly. +;DialogFontName= +;DialogFontSize=9 +;DialogFontBaseScaleWidth=7 +;DialogFontBaseScaleHeight=15 +;WelcomeFontName=Segoe UI +;WelcomeFontSize=14 + +[Messages] + +; *** Application titles +SetupAppTitle=安装 +SetupWindowTitle=安装 - %1 +UninstallAppTitle=卸载 +UninstallAppFullTitle=%1 卸载 + +; *** Misc. common +InformationTitle=信息 +ConfirmTitle=确认 +ErrorTitle=错误 + +; *** SetupLdr messages +SetupLdrStartupMessage=现在将安装 %1。您想要继续吗? +LdrCannotCreateTemp=无法创建临时文件。安装程序已中止 +LdrCannotExecTemp=无法执行临时目录中的文件。安装程序已中止 +HelpTextNote= + +; *** Startup error messages +LastErrorMessage=%1。%n%n错误 %2: %3 +SetupFileMissing=安装目录中缺少文件 %1。请修正这个问题或者获取程序的新副本。 +SetupFileCorrupt=安装文件已损坏。请获取程序的新副本。 +SetupFileCorruptOrWrongVer=安装文件已损坏,或是与这个安装程序的版本不兼容。请修正这个问题或获取新的程序副本。 +InvalidParameter=无效的命令行参数:%n%n%1 +SetupAlreadyRunning=安装程序已在运行。 +WindowsVersionNotSupported=此程序不支持当前计算机运行的 Windows 版本。 +WindowsServicePackRequired=此程序需要 %1 服务包 %2 或更高版本。 +NotOnThisPlatform=此程序不能在 %1 上运行。 +OnlyOnThisPlatform=此程序只能在 %1 上运行。 +OnlyOnTheseArchitectures=此程序只能安装到为下列处理器架构设计的 Windows 版本中:%n%n%1 +WinVersionTooLowError=此程序需要 %1 版本 %2 或更高。 +WinVersionTooHighError=此程序不能安装于 %1 版本 %2 或更高。 +AdminPrivilegesRequired=在安装此程序时您必须以管理员身份登录。 +PowerUserPrivilegesRequired=在安装此程序时您必须以管理员身份或高级用户组身份登录。 +SetupAppRunningError=安装程序检测到 %1 当前正在运行。%n%n请先关闭正在运行的程序,然后点击“确定”继续,或点击“取消”退出。 +UninstallAppRunningError=卸载程序检测到 %1 当前正在运行。%n%n请先关闭正在运行的程序,然后点击“确定”继续,或点击“取消”退出。 + +; *** Startup questions +PrivilegesRequiredOverrideTitle=选择安装程序安装模式 +PrivilegesRequiredOverrideInstruction=选择安装模式 +PrivilegesRequiredOverrideText1=%1 可以为所有用户安装(需要管理员权限),或仅为您安装。 +PrivilegesRequiredOverrideText2=%1 可以仅为您安装,或为所有用户安装(需要管理员权限)。 +PrivilegesRequiredOverrideAllUsers=为所有用户安装(&A) +PrivilegesRequiredOverrideAllUsersRecommended=为所有用户安装(&A)(推荐) +PrivilegesRequiredOverrideCurrentUser=仅为我安装(&M) +PrivilegesRequiredOverrideCurrentUserRecommended=仅为我安装(&M)(推荐) + +; *** Misc. errors +ErrorCreatingDir=安装程序无法创建目录“%1” +ErrorTooManyFilesInDir=无法在目录“%1”中创建文件,因为里面包含太多文件。 + +; *** Setup common messages +ExitSetupTitle=退出安装程序 +ExitSetupMessage=安装程序尚未完成。如果现在退出,将不会安装该程序。%n%n您之后可以再次运行安装程序完成安装。%n%n现在退出安装程序吗? +AboutSetupMenuItem=关于安装程序(&A)... +AboutSetupTitle=关于安装程序 +AboutSetupMessage=%1 版本 %2%n%3%n%n%1 主页:%n%4 +AboutSetupNote= +TranslatorNote=简体中文翻译由 Kira(847320916@qq.com)维护。项目地址:https://github.com/kira-96/Inno-Setup-Chinese-Simplified-Translation + +; *** Buttons +ButtonBack=< 上一步(&B) +ButtonNext=下一步(&N) > +ButtonInstall=安装(&I) +ButtonOK=确定 +ButtonCancel=取消 +ButtonYes=是(&Y) +ButtonYesToAll=全是(&A) +ButtonNo=否(&N) +ButtonNoToAll=全否(&O) +ButtonFinish=完成(&F) +ButtonBrowse=浏览(&B)... +ButtonWizardBrowse=浏览(&R)... +ButtonNewFolder=新建文件夹(&M) + +; *** "Select Language" dialog messages +SelectLanguageTitle=选择安装语言 +SelectLanguageLabel=选择安装时使用的语言。 + +; *** Common wizard text +ClickNext=点击“下一步”继续,或点击“取消”退出安装程序。 +BeveledLabel= +BrowseDialogTitle=浏览文件夹 +BrowseDialogLabel=在下面的列表中选择一个文件夹,然后点击“确定”。 +NewFolderName=新建文件夹 + +; *** "Welcome" wizard page +WelcomeLabel1=欢迎使用 [name] 安装向导 +WelcomeLabel2=即将在您的计算机上安装 [name/ver]。%n%n建议您在继续安装前关闭所有其他应用程序。 + +; *** "Password" wizard page +WizardPassword=密码 +PasswordLabel1=此安装程序需要密码验证。 +PasswordLabel3=请输入密码,然后点击“下一步”继续。密码区分大小写。 +PasswordEditLabel=密码(&P): +IncorrectPassword=您输入的密码不正确,请重新输入。 + +; *** "License Agreement" wizard page +WizardLicense=许可协议 +LicenseLabel=请在继续安装前阅读以下重要信息。 +LicenseLabel3=请阅读下列许可协议。在继续安装前您必须同意这些协议条款。 +LicenseAccepted=我同意此协议(&A) +LicenseNotAccepted=我不同意此协议(&D) + +; *** "Information" wizard pages +WizardInfoBefore=信息 +InfoBeforeLabel=请在继续安装前阅读以下重要信息。 +InfoBeforeClickLabel=准备好继续安装后,点击“下一步”。 +WizardInfoAfter=信息 +InfoAfterLabel=请在继续安装前阅读以下重要信息。 +InfoAfterClickLabel=准备好继续安装后,点击“下一步”。 + +; *** "User Information" wizard page +WizardUserInfo=用户信息 +UserInfoDesc=请输入您的信息。 +UserInfoName=用户名(&U): +UserInfoOrg=组织(&O): +UserInfoSerial=序列号(&S): +UserInfoNameRequired=请输入用户名。 + +; *** "Select Destination Location" wizard page +WizardSelectDir=选择目标位置 +SelectDirDesc=您想将 [name] 安装在哪里? +SelectDirLabel3=安装程序将安装 [name] 到下面的文件夹中。 +SelectDirBrowseLabel=点击“下一步”继续。如果您想选择其他文件夹,点击“浏览”。 +DiskSpaceGBLabel=至少需要有 [gb] GB 的可用磁盘空间。 +DiskSpaceMBLabel=至少需要有 [mb] MB 的可用磁盘空间。 +CannotInstallToNetworkDrive=安装程序无法安装到一个网络驱动器。 +CannotInstallToUNCPath=安装程序无法安装到一个 UNC 路径。 +InvalidPath=您必须输入一个带驱动器盘符的完整路径,例如:%n%nC:\App%n%n或UNC路径:%n%n\\server\share +InvalidDrive=您选定的驱动器或 UNC 共享不存在或不能访问。请选择其他位置。 +DiskSpaceWarningTitle=磁盘空间不足 +DiskSpaceWarning=安装程序至少需要 %1 KB 的可用空间才能安装,但选定驱动器只有 %2 KB 的可用空间。%n%n您确定要继续吗? +DirNameTooLong=文件夹名称或路径太长。 +InvalidDirName=文件夹名称无效。 +BadDirName32=文件夹名称不能包含下列任何字符:%n%n%1 +DirExistsTitle=文件夹已存在 +DirExists=文件夹:%n%n%1%n%n已经存在。您确定安装到这个文件夹中吗? +DirDoesntExistTitle=文件夹不存在 +DirDoesntExist=文件夹:%n%n%1%n%n不存在。您想要创建此文件夹吗? + +; *** "Select Components" wizard page +WizardSelectComponents=选择组件 +SelectComponentsDesc=您想安装哪些程序组件? +SelectComponentsLabel2=选中您想安装的组件;取消您不想安装的组件。然后点击“下一步”继续。 +FullInstallation=完全安装 +; if possible don't translate 'Compact' as 'Minimal' (I mean 'Minimal' in your language) +CompactInstallation=简洁安装 +CustomInstallation=自定义安装 +NoUninstallWarningTitle=组件已存在 +NoUninstallWarning=安装程序检测到下列组件已安装在您的计算机中:%n%n%1%n%n取消选中这些组件不会卸载它们。%n%n您确定要继续吗? +ComponentSize1=%1 KB +ComponentSize2=%1 MB +ComponentsDiskSpaceGBLabel=当前选择的组件需要至少 [gb] GB 的磁盘空间。 +ComponentsDiskSpaceMBLabel=当前选择的组件需要至少 [mb] MB 的磁盘空间。 + +; *** "Select Additional Tasks" wizard page +WizardSelectTasks=选择附加任务 +SelectTasksDesc=您想要安装程序执行哪些附加任务? +SelectTasksLabel2=选择您想要安装程序在安装 [name] 时执行的附加任务,然后点击“下一步”。 + +; *** "Select Start Menu Folder" wizard page +WizardSelectProgramGroup=选择开始菜单文件夹 +SelectStartMenuFolderDesc=安装程序应该在哪里放置程序的快捷方式? +SelectStartMenuFolderLabel3=安装程序将在下列“开始”菜单文件夹中创建程序的快捷方式。 +SelectStartMenuFolderBrowseLabel=点击“下一步”继续。如果您想选择其他文件夹,点击“浏览”。 +MustEnterGroupName=您必须输入一个文件夹名称。 +GroupNameTooLong=文件夹名称或路径太长。 +InvalidGroupName=文件夹名称无效。 +BadGroupName=文件夹名称不能包含下列任何字符:%n%n%1 +NoProgramGroupCheck2=不创建开始菜单文件夹(&D) + +; *** "Ready to Install" wizard page +WizardReady=准备安装 +ReadyLabel1=安装程序准备就绪,现在可以开始安装 [name] 到您的计算机。 +ReadyLabel2a=点击“安装”继续此安装程序。如果您想重新查看或修改任何设置,点击“上一步”。 +ReadyLabel2b=点击“安装”继续此安装程序。 +ReadyMemoUserInfo=用户信息: +ReadyMemoDir=目标位置: +ReadyMemoType=安装类型: +ReadyMemoComponents=已选择组件: +ReadyMemoGroup=开始菜单文件夹: +ReadyMemoTasks=附加任务: + +; *** TDownloadWizardPage wizard page and DownloadTemporaryFile +DownloadingLabel2=正在下载文件... +ButtonStopDownload=停止下载(&S) +StopDownload=您确定要停止下载吗? +ErrorDownloadAborted=下载已中止。 +ErrorDownloadFailed=下载失败:%1 %2。 +ErrorDownloadSizeFailed=获取大小失败:%1 %2。 +ErrorProgress=无效的进度:%1 / %2。 +ErrorFileSize=文件大小错误:预期 %1,实际 %2。 + +; *** TExtractionWizardPage wizard page and ExtractArchive +ExtractingLabel=正在提取文件... +ButtonStopExtraction=停止提取(&S) +StopExtraction=您确定要停止提取吗? +ErrorExtractionAborted=提取已中止。 +ErrorExtractionFailed=提取失败:%1 + +; *** Archive extraction failure details +ArchiveIncorrectPassword=密码不正确。 +ArchiveIsCorrupted=压缩包已损坏。 +ArchiveUnsupportedFormat=不支持的压缩包格式。 + +; *** "Preparing to Install" wizard page +WizardPreparing=正在准备安装 +PreparingDesc=安装程序正在准备安装 [name] 到您的计算机。 +PreviousInstallNotCompleted=先前的程序安装或卸载未完成,需要您重启计算机以完成该安装。%n%n在重启计算机后,再次运行安装程序以完成 [name] 的安装。 +CannotContinue=安装程序不能继续。请点击“取消”退出。 +ApplicationsFound=以下应用程序正在使用将由安装程序更新的文件。建议您允许安装程序自动关闭这些应用程序。 +ApplicationsFound2=以下应用程序正在使用将由安装程序更新的文件。建议您允许安装程序自动关闭这些应用程序。安装完成后,安装程序将尝试重新启动这些应用程序。 +CloseApplications=自动关闭应用程序(&A) +DontCloseApplications=不要关闭应用程序(&D) +ErrorCloseApplications=安装程序无法自动关闭所有应用程序。建议您在继续之前,关闭所有在使用需要由安装程序更新的文件的应用程序。 +PrepareToInstallNeedsRestart=安装程序必须重启您的计算机。计算机重启后,请再次运行安装程序以完成 [name] 的安装。%n%n要立即重启吗? + +; *** "Installing" wizard page +WizardInstalling=正在安装 +InstallingLabel=安装程序正在安装 [name] 到您的计算机,请稍候。 + +; *** "Setup Completed" wizard page +FinishedHeadingLabel=完成 [name] 安装向导 +FinishedLabelNoIcons=安装程序已在您的计算机中安装了 [name]。 +FinishedLabel=安装程序已在您的计算机中安装了 [name]。您可以通过已安装的快捷方式运行此应用程序。 +ClickFinish=点击“完成”退出安装程序。 +FinishedRestartLabel=为完成 [name] 的安装,安装程序必须重新启动您的计算机。要立即重启吗? +FinishedRestartMessage=为完成 [name] 的安装,安装程序必须重新启动您的计算机。%n%n要立即重启吗? +ShowReadmeCheck=是,我想查阅自述文件 +YesRadio=是,立即重启计算机(&Y) +NoRadio=否,稍后重启计算机(&N) +; used for example as 'Run MyProg.exe' +RunEntryExec=运行 %1 +; used for example as 'View Readme.txt' +RunEntryShellExec=查阅 %1 + +; *** "Setup Needs the Next Disk" stuff +ChangeDiskTitle=安装程序需要下一张磁盘 +SelectDiskLabel2=请插入磁盘 %1 并点击“确定”。%n%n如果这个磁盘中的文件可以在下列文件夹之外的文件夹中找到,请输入正确的路径或点击“浏览”。 +PathLabel=路径(&P): +FileNotInDir2=“%2”中找不到文件“%1”。请插入正确的磁盘或选择其他文件夹。 +SelectDirectoryLabel=请指定下一张磁盘的位置。 + +; *** Installation phase messages +SetupAborted=安装程序未完成安装。%n%n请修正这个问题并重新运行安装程序。 +AbortRetryIgnoreSelectAction=选择操作 +AbortRetryIgnoreRetry=重试(&T) +AbortRetryIgnoreIgnore=忽略错误并继续(&I) +AbortRetryIgnoreCancel=取消安装 +RetryCancelSelectAction=选择操作 +RetryCancelRetry=重试(&T) +RetryCancelCancel=取消 + +; *** Installation status messages +StatusClosingApplications=正在关闭应用程序... +StatusCreateDirs=正在创建目录... +StatusExtractFiles=正在提取文件... +StatusDownloadFiles=正在下载文件... +StatusCreateIcons=正在创建快捷方式... +StatusCreateIniEntries=正在创建 INI 条目... +StatusCreateRegistryEntries=正在创建注册表条目... +StatusRegisterFiles=正在注册文件... +StatusSavingUninstall=正在保存卸载信息... +StatusRunProgram=正在完成安装... +StatusRestartingApplications=正在重启应用程序... +StatusRollback=正在撤销更改... + +; *** Misc. errors +ErrorInternal2=内部错误:%1。 +ErrorFunctionFailedNoCode=%1 失败。 +ErrorFunctionFailed=%1 失败;错误代码 %2。 +ErrorFunctionFailedWithMessage=%1 失败;错误代码 %2。%n%3 +ErrorExecutingProgram=无法执行文件:%n%1 + +; *** Registry errors +ErrorRegOpenKey=打开注册表项时出错:%n%1\%2 +ErrorRegCreateKey=创建注册表项时出错:%n%1\%2 +ErrorRegWriteKey=写入注册表项时出错:%n%1\%2 + +; *** INI errors +ErrorIniEntry=在文件“%1”中创建 INI 条目时出错。 + +; *** File copying errors +FileAbortRetryIgnoreSkipNotRecommended=跳过此文件(&S)(不推荐) +FileAbortRetryIgnoreIgnoreNotRecommended=忽略错误并继续(&I)(不推荐) +SourceIsCorrupted=源文件已损坏。 +SourceDoesntExist=源文件“%1”不存在。 +SourceVerificationFailed=源文件验证失败:%1 +VerificationSignatureDoesntExist=签名文件“%1”不存在。 +VerificationSignatureInvalid=签名文件“%1”无效。 +VerificationKeyNotFound=签名文件“%1”使用了未知的密钥。 +VerificationFileNameIncorrect=文件名不正确。 +VerificationFileTagIncorrect=文件标签不正确。 +VerificationFileSizeIncorrect=文件大小不正确。 +VerificationFileHashIncorrect=文件哈希值不正确。 +ExistingFileReadOnly2=无法替换已存在的文件,它是只读的。 +ExistingFileReadOnlyRetry=移除只读属性并重试(&R) +ExistingFileReadOnlyKeepExisting=保留已存在的文件(&K) +ErrorReadingExistingDest=尝试读取已存在的文件时出错: +FileExistsSelectAction=选择操作 +FileExists2=文件已经存在。 +FileExistsOverwriteExisting=覆盖已存在的文件(&O) +FileExistsKeepExisting=保留已存在的文件(&K) +FileExistsOverwriteOrKeepAll=为接下来的冲突文件执行此操作(&D) +ExistingFileNewerSelectAction=选择操作 +ExistingFileNewer2=已存在的文件比安装程序将要安装的文件还要新。 +ExistingFileNewerOverwriteExisting=覆盖已存在的文件(&O) +ExistingFileNewerKeepExisting=保留已存在的文件(&K)(推荐) +ExistingFileNewerOverwriteOrKeepAll=为接下来的冲突文件执行此操作(&D) +ErrorChangingAttr=尝试更改下列已存在的文件属性时出错: +ErrorCreatingTemp=尝试在目标目录创建文件时出错: +ErrorReadingSource=尝试读取下列源文件时出错: +ErrorCopying=尝试复制下列文件时出错: +ErrorDownloading=尝试下载文件时出错: +ErrorExtracting=尝试提取压缩包时出错: +ErrorReplacingExistingFile=尝试替换已存在的文件时出错: +ErrorRestartReplace=重启并替换失败: +ErrorRenamingTemp=尝试重命名下列目标目录中的一个文件时出错: +ErrorRegisterServer=无法注册 DLL/OCX:%1 +ErrorRegSvr32Failed=RegSvr32 失败;退出代码 %1。 +ErrorRegisterTypeLib=无法注册类型库:%1 + +; *** Uninstall display name markings +; used for example as 'My Program (32-bit)' +UninstallDisplayNameMark=%1 (%2) +; used for example as 'My Program (32-bit, All users)' +UninstallDisplayNameMarks=%1 (%2, %3) +UninstallDisplayNameMark32Bit=32 位 +UninstallDisplayNameMark64Bit=64 位 +UninstallDisplayNameMarkAllUsers=所有用户 +UninstallDisplayNameMarkCurrentUser=当前用户 + +; *** Post-installation errors +ErrorOpeningReadme=尝试打开自述文件时出错。 +ErrorRestartingComputer=安装程序无法重启计算机,请手动重启。 + +; *** Uninstaller messages +UninstallNotFound=文件“%1”不存在。无法卸载。 +UninstallOpenError=文件“%1”不能被打开。无法卸载 +UninstallUnsupportedVer=此版本的卸载程序无法识别卸载日志文件“%1”的格式。无法卸载。 +UninstallUnknownEntry=卸载日志中遇到一个未知条目(%1)。 +ConfirmUninstall=您确认要完全移除 %1 及其所有组件吗? +UninstallOnlyOnWin64=仅允许在 64 位 Windows 中卸载此程序。 +OnlyAdminCanUninstall=仅使用管理员权限的用户能完成此卸载。 +UninstallStatusLabel=正在从您的计算机中移除 %1,请稍候。 +UninstalledAll=已顺利从您的计算机中移除 %1。 +UninstalledMost=%1 卸载完成。%n%n有部分内容未能被删除,但您可以手动删除它们。 +UninstalledAndNeedsRestart=为完成 %1 的卸载,需要重启您的计算机。%n%n要立即重启吗? +UninstallDataCorrupted=文件“%1”已损坏。无法卸载。 + +; *** Uninstallation phase messages +ConfirmDeleteSharedFileTitle=删除共享文件? +ConfirmDeleteSharedFile2=系统表示下列共享文件已不再有任何程序使用。您希望卸载程序删除此共享文件吗?%n%n如果仍有程序正在使用此文件,删除后这些程序可能无法正常运行。如果您不能确定,请选择“否”,保留此文件在系统中不会造成任何损害。 +SharedFileNameLabel=文件名: +SharedFileLocationLabel=位置: +WizardUninstalling=卸载状态 +StatusUninstalling=正在卸载 %1... + +; *** Shutdown block reasons +ShutdownBlockReasonInstallingApp=正在安装 %1。 +ShutdownBlockReasonUninstallingApp=正在卸载 %1。 + +; The custom messages below aren't used by Setup itself, but if you make +; use of them in your scripts, you'll want to translate them. + +[CustomMessages] + +NameAndVersion=%1 版本 %2 +AdditionalIcons=附加快捷方式: +CreateDesktopIcon=创建桌面快捷方式(&D) +CreateQuickLaunchIcon=创建快速启动栏快捷方式(&Q) +ProgramOnTheWeb=%1 网站 +UninstallProgram=卸载 %1 +LaunchProgram=运行 %1 +AssocFileExtension=将 %2 文件扩展名与 %1 建立关联(&A) +AssocingFileExtension=正在将 %2 文件扩展名与 %1 建立关联... +AutoStartProgramGroupDescription=启动: +AutoStartProgram=自动启动 %1 +AddonHostProgramNotFound=您选择的文件夹中无法找到 %1。%n%n您确定要继续吗? diff --git a/packaging/windows/ashell.iss b/packaging/windows/ashell.iss new file mode 100644 index 0000000..304a70c --- /dev/null +++ b/packaging/windows/ashell.iss @@ -0,0 +1,81 @@ +#define MyAppName "ashell" +#define MyAppVersion GetEnv("PACKAGE_VERSION") +#define MyAppArch GetEnv("ASHELL_ARCH") +#define MyAppExeSource GetEnv("ASHELL_BINARY_PATH") +#define MyOutputDir GetEnv("ASHELL_OUTPUT_DIR") +#define MyOutputBaseName GetEnv("PACKAGE_BASENAME") + +#if MyAppVersion == "" + #error PACKAGE_VERSION is required +#endif +#if MyAppExeSource == "" + #error ASHELL_BINARY_PATH is required +#endif +#if MyOutputDir == "" + #error ASHELL_OUTPUT_DIR is required +#endif +#if MyOutputBaseName == "" + #error PACKAGE_BASENAME is required +#endif + +#if MyAppArch == "x64" + #define MyAppId "dev.ashell.app.x64" +#elif MyAppArch == "x86" + #define MyAppId "dev.ashell.app.x86" +#elif MyAppArch == "arm64" + #define MyAppId "dev.ashell.app.arm64" +#else + #error Unsupported ASHELL_ARCH value +#endif + +[Setup] +AppId={#MyAppId} +AppName={#MyAppName} +AppVersion={#MyAppVersion} +AppPublisher=ashell contributors +AppPublisherURL=https://github.com/rust-kotlin/ashell +AppSupportURL=https://github.com/rust-kotlin/ashell/issues +AppUpdatesURL=https://github.com/rust-kotlin/ashell/releases +DefaultDirName={localappdata}\Programs\ashell +DefaultGroupName=ashell +DisableProgramGroupPage=yes +PrivilegesRequired=lowest +OutputDir={#MyOutputDir} +OutputBaseFilename={#MyOutputBaseName}-setup +SetupIconFile=..\..\assets\icons\ashell.ico +UninstallDisplayIcon={app}\ashell.exe +LicenseFile=..\..\LICENSE +Compression=lzma2 +SolidCompression=yes +WizardStyle=modern +MinVersion=10.0 +CloseApplications=yes +RestartApplications=no + +#if MyAppArch == "x64" +ArchitecturesAllowed=x64compatible and not arm64 +ArchitecturesInstallIn64BitMode=x64compatible +#elif MyAppArch == "x86" +ArchitecturesAllowed=x86compatible and not x64compatible and not arm64 +ArchitecturesInstallIn64BitMode= +#elif MyAppArch == "arm64" +ArchitecturesAllowed=arm64 +ArchitecturesInstallIn64BitMode=arm64 +#endif + +[Languages] +Name: "en"; MessagesFile: "compiler:Default.isl" +Name: "zhcn"; MessagesFile: "ChineseSimplified.isl" + +[Tasks] +Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked + +[Files] +Source: "{#MyAppExeSource}"; DestDir: "{app}"; DestName: "ashell.exe"; Flags: ignoreversion + +[Icons] +Name: "{autoprograms}\ashell"; Filename: "{app}\ashell.exe" +Name: "{autodesktop}\ashell"; Filename: "{app}\ashell.exe"; Tasks: desktopicon + +[Run] +Filename: "{app}\ashell.exe"; Description: "{cm:LaunchProgram,ashell}"; Flags: nowait postinstall skipifsilent