19 changed files with 151 additions and 1000 deletions
-
37.github/workflows/release.yml
-
2.gitignore
-
56.goreleaser.yml
-
31.vscode/settings.json
-
125README.md
-
BINbin/cursor_id_modifier_v2.5.0_darwin_amd64_intel
-
BINbin/cursor_id_modifier_v2.5.0_darwin_arm64_m1
-
BINbin/cursor_id_modifier_v2.5.0_linux_amd64
-
BINbin/cursor_id_modifier_v2.5.0_windows_amd64.exe
-
7bin/md5_checksums.txt
-
139cursor_modifier.bat
-
211cursor_modifier.sh
-
279install.sh
-
16main.go
-
118scripts/build_all.bat
-
101scripts/build_all.sh
-
6scripts/build_linux.sh
-
13scripts/build_mac.sh
-
6scripts/build_windows.bat
@ -0,0 +1,37 @@ |
|||||
|
name: Release |
||||
|
|
||||
|
on: |
||||
|
push: |
||||
|
tags: |
||||
|
- 'v*' |
||||
|
|
||||
|
permissions: |
||||
|
contents: write |
||||
|
|
||||
|
jobs: |
||||
|
goreleaser: |
||||
|
runs-on: ubuntu-latest |
||||
|
steps: |
||||
|
- name: Checkout |
||||
|
uses: actions/checkout@v4 |
||||
|
with: |
||||
|
fetch-depth: 0 |
||||
|
|
||||
|
- name: Set up Go |
||||
|
uses: actions/setup-go@v5 |
||||
|
with: |
||||
|
check-latest: true |
||||
|
|
||||
|
- name: Set Repository Variables |
||||
|
run: | |
||||
|
echo "GITHUB_REPOSITORY_OWNER=$(echo ${{ github.repository }} | cut -d '/' -f 1)" >> $GITHUB_ENV |
||||
|
echo "GITHUB_REPOSITORY_NAME=$(echo ${{ github.repository }} | cut -d '/' -f 2)" >> $GITHUB_ENV |
||||
|
|
||||
|
- name: Run GoReleaser |
||||
|
uses: goreleaser/goreleaser-action@v5 |
||||
|
with: |
||||
|
distribution: goreleaser |
||||
|
version: latest |
||||
|
args: release --clean |
||||
|
env: |
||||
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} |
@ -0,0 +1,56 @@ |
|||||
|
project_name: cursor-id-modifier |
||||
|
|
||||
|
before: |
||||
|
hooks: |
||||
|
- go mod tidy |
||||
|
|
||||
|
builds: |
||||
|
- env: |
||||
|
- CGO_ENABLED=0 |
||||
|
ldflags: |
||||
|
- -s -w -X main.version={{.Version}} |
||||
|
goos: |
||||
|
- linux |
||||
|
- windows |
||||
|
- darwin |
||||
|
goarch: |
||||
|
- amd64 |
||||
|
- arm64 |
||||
|
mod_timestamp: '{{ .CommitTimestamp }}' |
||||
|
flags: |
||||
|
- -trimpath |
||||
|
binary: cursor_id_modifier_{{ .Version }}_{{ .Os }}_{{ .Arch }} |
||||
|
|
||||
|
archives: |
||||
|
- format: binary |
||||
|
name_template: "{{ .Binary }}" |
||||
|
allow_different_binary_count: true |
||||
|
|
||||
|
changelog: |
||||
|
use: github |
||||
|
sort: asc |
||||
|
groups: |
||||
|
- title: Features |
||||
|
regexp: "^.*feat[(\\w)]*:+.*$" |
||||
|
order: 0 |
||||
|
- title: 'Bug Fixes' |
||||
|
regexp: "^.*fix[(\\w)]*:+.*$" |
||||
|
order: 1 |
||||
|
- title: Others |
||||
|
order: 999 |
||||
|
filters: |
||||
|
exclude: |
||||
|
- '^docs:' |
||||
|
- '^test:' |
||||
|
- '^ci:' |
||||
|
- '^chore:' |
||||
|
- Merge pull request |
||||
|
- Merge branch |
||||
|
|
||||
|
release: |
||||
|
github: |
||||
|
owner: '{{ .Env.GITHUB_REPOSITORY_OWNER }}' |
||||
|
name: '{{ .Env.GITHUB_REPOSITORY_NAME }}' |
||||
|
draft: false |
||||
|
prerelease: auto |
||||
|
mode: replace |
@ -1,31 +0,0 @@ |
|||||
{ |
|
||||
"cSpell.words": [ |
|
||||
"apprun", |
|
||||
"buildmode", |
|
||||
"certutil", |
|
||||
"dylib", |
|
||||
"enabledelayedexpansion", |
|
||||
"endlocal", |
|
||||
"errorlevel", |
|
||||
"fatih", |
|
||||
"gcflags", |
|
||||
"GOARCH", |
|
||||
"hashfile", |
|
||||
"IMAGENAME", |
|
||||
"killall", |
|
||||
"ldflags", |
|
||||
"LOCALAPPDATA", |
|
||||
"mktemp", |
|
||||
"msys", |
|
||||
"pgrep", |
|
||||
"pkill", |
|
||||
"runas", |
|
||||
"setlocal", |
|
||||
"taskkill", |
|
||||
"tasklist", |
|
||||
"trimpath", |
|
||||
"urandom", |
|
||||
"uuidgen", |
|
||||
"xattr" |
|
||||
] |
|
||||
} |
|
@ -1,7 +0,0 @@ |
|||||
MD5 Checksums |
|
||||
============= |
|
||||
|
|
||||
c3f03388afd01cd2d9f6c58348abf8e1 cursor_id_modifier_v2.5.0_windows_amd64.exe |
|
||||
b2caec6c3bede8f51245e5b74b11b96c cursor_id_modifier_v2.5.0_darwin_amd64_intel |
|
||||
8e93f913d653e26bf522bde78b51a26a cursor_id_modifier_v2.5.0_darwin_arm64_m1 |
|
||||
73db2eb340c0f5878a206ddc63693f77 cursor_id_modifier_v2.5.0_linux_amd64 |
|
@ -1,139 +0,0 @@ |
|||||
@echo off |
|
||||
chcp 65001 >nul |
|
||||
setlocal EnableDelayedExpansion |
|
||||
|
|
||||
:: 版本号 |
|
||||
set "VERSION=2.5.0" |
|
||||
|
|
||||
:: 检测语言 |
|
||||
for /f "tokens=2 delims==" %%a in ('wmic os get OSLanguage /value') do set OSLanguage=%%a |
|
||||
if "%OSLanguage%"=="2052" ( |
|
||||
set "LANG=cn" |
|
||||
) else ( |
|
||||
set "LANG=en" |
|
||||
) |
|
||||
|
|
||||
:: 多语言文本 |
|
||||
if "%LANG%"=="cn" ( |
|
||||
set "SUCCESS_MSG=[√] 配置文件已成功更新!" |
|
||||
set "RESTART_MSG=[!] 请手动重启 Cursor 以使更新生效" |
|
||||
set "READING_CONFIG=正在读取配置文件..." |
|
||||
set "GENERATING_IDS=正在生成新的标识符..." |
|
||||
set "CHECKING_PROCESSES=正在检查运行中的 Cursor 实例..." |
|
||||
set "CLOSING_PROCESSES=正在关闭 Cursor 实例..." |
|
||||
set "PROCESSES_CLOSED=所有 Cursor 实例已关闭" |
|
||||
set "PLEASE_WAIT=请稍候..." |
|
||||
) else ( |
|
||||
set "SUCCESS_MSG=[√] Configuration file updated successfully!" |
|
||||
set "RESTART_MSG=[!] Please restart Cursor manually for changes to take effect" |
|
||||
set "READING_CONFIG=Reading configuration file..." |
|
||||
set "GENERATING_IDS=Generating new identifiers..." |
|
||||
set "CHECKING_PROCESSES=Checking for running Cursor instances..." |
|
||||
set "CLOSING_PROCESSES=Closing Cursor instances..." |
|
||||
set "PROCESSES_CLOSED=All Cursor instances have been closed" |
|
||||
set "PLEASE_WAIT=Please wait..." |
|
||||
) |
|
||||
|
|
||||
:: 检查管理员权限 |
|
||||
net session >nul 2>&1 |
|
||||
if %errorLevel% neq 0 ( |
|
||||
echo 请以管理员身份运行此脚本 |
|
||||
echo Please run this script as administrator |
|
||||
pause |
|
||||
exit /b 1 |
|
||||
) |
|
||||
|
|
||||
:: 主程序 |
|
||||
:main |
|
||||
cls |
|
||||
call :printBanner |
|
||||
|
|
||||
echo %CHECKING_PROCESSES% |
|
||||
tasklist | find /i "Cursor.exe" >nul |
|
||||
if %errorLevel% equ 0 ( |
|
||||
echo %CLOSING_PROCESSES% |
|
||||
taskkill /F /IM "Cursor.exe" >nul 2>&1 |
|
||||
timeout /t 2 >nul |
|
||||
echo %PROCESSES_CLOSED% |
|
||||
) |
|
||||
|
|
||||
set "CONFIG_PATH=%APPDATA%\Cursor\User\globalStorage\storage.json" |
|
||||
echo %READING_CONFIG% |
|
||||
|
|
||||
echo %GENERATING_IDS% |
|
||||
:: 生成随机ID |
|
||||
set "machineId=" |
|
||||
set "macMachineId=" |
|
||||
set "devDeviceId=" |
|
||||
set "sqmId=" |
|
||||
|
|
||||
:: 生成32位随机ID |
|
||||
for /L %%i in (1,1,32) do ( |
|
||||
set /a "r=!random! %% 16" |
|
||||
set "hex=0123456789abcdef" |
|
||||
for %%j in (!r!) do set "machineId=!machineId!!hex:~%%j,1!" |
|
||||
) |
|
||||
|
|
||||
for /L %%i in (1,1,32) do ( |
|
||||
set /a "r=!random! %% 16" |
|
||||
for %%j in (!r!) do set "macMachineId=!macMachineId!!hex:~%%j,1!" |
|
||||
) |
|
||||
|
|
||||
:: 生成UUID格式的devDeviceId |
|
||||
for /L %%i in (1,1,32) do ( |
|
||||
set /a "r=!random! %% 16" |
|
||||
for %%j in (!r!) do set "devDeviceId=!devDeviceId!!hex:~%%j,1!" |
|
||||
if %%i==8 set "devDeviceId=!devDeviceId!-" |
|
||||
if %%i==12 set "devDeviceId=!devDeviceId!-" |
|
||||
if %%i==16 set "devDeviceId=!devDeviceId!-" |
|
||||
if %%i==20 set "devDeviceId=!devDeviceId!-" |
|
||||
) |
|
||||
|
|
||||
for /L %%i in (1,1,32) do ( |
|
||||
set /a "r=!random! %% 16" |
|
||||
for %%j in (!r!) do set "sqmId=!sqmId!!hex:~%%j,1!" |
|
||||
) |
|
||||
|
|
||||
:: 创建配置目录 |
|
||||
if not exist "%APPDATA%\Cursor\User\globalStorage" ( |
|
||||
mkdir "%APPDATA%\Cursor\User\globalStorage" |
|
||||
) |
|
||||
|
|
||||
:: 生成配置文件 |
|
||||
( |
|
||||
echo { |
|
||||
echo "telemetry.macMachineId": "%macMachineId%", |
|
||||
echo "telemetry.machineId": "%machineId%", |
|
||||
echo "telemetry.devDeviceId": "%devDeviceId%", |
|
||||
echo "telemetry.sqmId": "%sqmId%" |
|
||||
echo } |
|
||||
) > "%CONFIG_PATH%" |
|
||||
|
|
||||
echo. |
|
||||
echo ============================================================ |
|
||||
echo %SUCCESS_MSG% |
|
||||
echo %RESTART_MSG% |
|
||||
echo ============================================================ |
|
||||
echo. |
|
||||
echo Config file location: |
|
||||
echo %CONFIG_PATH% |
|
||||
echo. |
|
||||
pause |
|
||||
exit /b |
|
||||
|
|
||||
:: 打印banner |
|
||||
:printBanner |
|
||||
echo. |
|
||||
echo ██████╗██╗ ██╗██████╗ ███████╗ ██████╗ ██████╗ |
|
||||
echo ██╔════╝██║ ██║██╔══██╗██╔════╝██╔═══██╗██╔══██╗ |
|
||||
echo ██║ ██║ ██║██████╔╝███████╗██║ ██║█████╔╝ |
|
||||
echo ██║ ██║ ██║██╔══██╗╚════██║██║ ██║██╔══██╗ |
|
||||
echo ╚██████╗╚██████╔╝██║ ██║███████║╚██████╔╝██║ ██║ |
|
||||
echo ╚═════╝ ╚═════╝ ╚═╝ ╚═╝╚══════╝ ╚═════╝ ╚═╝ ╚═╝ |
|
||||
echo. |
|
||||
echo ^>^> Cursor ID Modifier v1.0 ^<^< |
|
||||
echo [ By Pancake Fruit Rolled Shark Chili ] |
|
||||
echo. |
|
||||
exit /b |
|
||||
|
|
||||
endlocal |
|
@ -1,211 +0,0 @@ |
|||||
#!/bin/bash |
|
||||
|
|
||||
# 版本号 - 与其他文件保持一致 |
|
||||
VERSION="2.5.0" |
|
||||
|
|
||||
# 颜色定义 |
|
||||
RED='\033[0;31m' |
|
||||
GREEN='\033[0;32m' |
|
||||
YELLOW='\033[1;33m' |
|
||||
CYAN='\033[0;36m' |
|
||||
NC='\033[0m' |
|
||||
|
|
||||
# 语言检测优化 |
|
||||
detect_language() { |
|
||||
local lang |
|
||||
if [ -n "$LANG" ]; then |
|
||||
lang="$LANG" |
|
||||
else |
|
||||
lang=$(locale | grep "LANG=" | cut -d= -f2) |
|
||||
fi |
|
||||
|
|
||||
if [[ $lang == *"zh"* ]]; then |
|
||||
echo "cn" |
|
||||
else |
|
||||
echo "en" |
|
||||
fi |
|
||||
} |
|
||||
|
|
||||
LANG=$(detect_language) |
|
||||
|
|
||||
# 多语言文本 - 修复编码问题 |
|
||||
if [ "$LANG" == "cn" ]; then |
|
||||
SUCCESS_MSG="[√] 配置文件已成功更新!" |
|
||||
RESTART_MSG="[!] 请手动重启 Cursor 以使更新生效" |
|
||||
READING_CONFIG="正在读取配置文件..." |
|
||||
GENERATING_IDS="正在生成新的标识符..." |
|
||||
CHECKING_PROCESSES="正在检查运行中的 Cursor 实例..." |
|
||||
CLOSING_PROCESSES="正在关闭 Cursor 实例..." |
|
||||
PROCESSES_CLOSED="所有 Cursor 实例已关闭" |
|
||||
PLEASE_WAIT="请稍候..." |
|
||||
ERROR_NO_ROOT="请使用 sudo 运行此脚本" |
|
||||
ERROR_CONFIG_PATH="无法获取配置文件路径" |
|
||||
ERROR_CREATE_DIR="无法创建配置目录" |
|
||||
ERROR_WRITE_CONFIG="无法写入配置文件" |
|
||||
else |
|
||||
SUCCESS_MSG="[√] Configuration file updated successfully!" |
|
||||
RESTART_MSG="[!] Please restart Cursor manually for changes to take effect" |
|
||||
READING_CONFIG="Reading configuration file..." |
|
||||
GENERATING_IDS="Generating new identifiers..." |
|
||||
CHECKING_PROCESSES="Checking for running Cursor instances..." |
|
||||
CLOSING_PROCESSES="Closing Cursor instances..." |
|
||||
PROCESSES_CLOSED="All Cursor instances have been closed" |
|
||||
PLEASE_WAIT="Please wait..." |
|
||||
ERROR_NO_ROOT="Please run this script with sudo" |
|
||||
ERROR_CONFIG_PATH="Unable to get config file path" |
|
||||
ERROR_CREATE_DIR="Unable to create config directory" |
|
||||
ERROR_WRITE_CONFIG="Unable to write config file" |
|
||||
fi |
|
||||
|
|
||||
# 生成随机ID - 添加错误处理 |
|
||||
generate_machine_id() { |
|
||||
if ! command -v openssl >/dev/null 2>&1; then |
|
||||
echo "$(head -c 32 /dev/urandom | xxd -p)" |
|
||||
else |
|
||||
openssl rand -hex 32 |
|
||||
fi |
|
||||
} |
|
||||
|
|
||||
generate_dev_device_id() { |
|
||||
local uuid="" |
|
||||
if command -v uuidgen >/dev/null 2>&1; then |
|
||||
uuid=$(uuidgen) |
|
||||
else |
|
||||
uuid=$(printf '%04x%04x-%04x-%04x-%04x-%04x%04x%04x' \ |
|
||||
$RANDOM $RANDOM \ |
|
||||
$RANDOM \ |
|
||||
$(($RANDOM & 0x0fff | 0x4000)) \ |
|
||||
$(($RANDOM & 0x3fff | 0x8000)) \ |
|
||||
$RANDOM $RANDOM $RANDOM) |
|
||||
fi |
|
||||
echo "$uuid" |
|
||||
} |
|
||||
|
|
||||
# 获取配置文件路径 - 优化路径处理 |
|
||||
get_config_path() { |
|
||||
local username=$1 |
|
||||
case "$(uname)" in |
|
||||
"Darwin") |
|
||||
echo "/Users/$username/Library/Application Support/Cursor/User/globalStorage/storage.json" |
|
||||
;; |
|
||||
"Linux") |
|
||||
echo "/home/$username/.config/Cursor/User/globalStorage/storage.json" |
|
||||
;; |
|
||||
*) |
|
||||
echo "" |
|
||||
return 1 |
|
||||
;; |
|
||||
esac |
|
||||
} |
|
||||
|
|
||||
# 检查Cursor进程 - 添加错误处理 |
|
||||
check_cursor_running() { |
|
||||
if ! command -v pgrep >/dev/null 2>&1; then |
|
||||
ps aux | grep -i "Cursor\|AppRun" | grep -v grep >/dev/null |
|
||||
else |
|
||||
pgrep -f "Cursor|AppRun" >/dev/null |
|
||||
fi |
|
||||
} |
|
||||
|
|
||||
# 关闭Cursor进程 - 优化进程关闭 |
|
||||
kill_cursor_processes() { |
|
||||
echo -e "${CYAN}$CLOSING_PROCESSES${NC}" |
|
||||
if command -v pkill >/dev/null 2>&1; then |
|
||||
pkill -f "Cursor|AppRun" |
|
||||
else |
|
||||
killall Cursor 2>/dev/null |
|
||||
killall AppRun 2>/dev/null |
|
||||
fi |
|
||||
sleep 2 |
|
||||
if check_cursor_running; then |
|
||||
if command -v pkill >/dev/null 2>&1; then |
|
||||
pkill -9 -f "Cursor|AppRun" |
|
||||
else |
|
||||
killall -9 Cursor 2>/dev/null |
|
||||
killall -9 AppRun 2>/dev/null |
|
||||
fi |
|
||||
fi |
|
||||
echo -e "${GREEN}$PROCESSES_CLOSED${NC}" |
|
||||
} |
|
||||
|
|
||||
# 打印banner - 修复显示问题 |
|
||||
print_banner() { |
|
||||
echo -e "${CYAN}" |
|
||||
echo ' ██████╗██╗ ██╗██████╗ ███████╗ ██████╗ ██████╗ ' |
|
||||
echo ' ██╔════╝██║ ██║██╔══██╗██╔════╝██╔═══██╗██╔══██╗' |
|
||||
echo ' ██║ ██║ ██║██████╔╝███████╗██║ ██║██████╔╝' |
|
||||
echo ' ██║ ██║ ██║██╔══██╗╚════██║██║ ██║██╔══██╗' |
|
||||
echo ' ╚██████╗╚██████╔╝██║ ██║███████║╚██████╔╝██║ ██║' |
|
||||
echo ' ╚═════╝ ╚═════╝ ╚═╝ ╚═╝╚══════╝ ╚═════╝ ╚═╝ ╚═╝' |
|
||||
echo -e "${NC}" |
|
||||
echo -e "${YELLOW}\t\t>> Cursor ID Modifier ${VERSION} <<${NC}" |
|
||||
echo -e "${CYAN}\t\t [ By Pancake Fruit Rolled Shark Chili ]${NC}" |
|
||||
echo |
|
||||
} |
|
||||
|
|
||||
# 主函数 - 添加错误处理 |
|
||||
main() { |
|
||||
# 检查root权限 |
|
||||
if [ "$EUID" -ne 0 ]; then |
|
||||
echo -e "${RED}${ERROR_NO_ROOT}${NC}" |
|
||||
exit 1 |
|
||||
fi |
|
||||
|
|
||||
# 获取实际用户名 |
|
||||
REAL_USER=${SUDO_USER:-$USER} |
|
||||
|
|
||||
clear |
|
||||
print_banner |
|
||||
|
|
||||
# 确保Cursor已关闭 |
|
||||
if check_cursor_running; then |
|
||||
kill_cursor_processes |
|
||||
fi |
|
||||
|
|
||||
CONFIG_PATH=$(get_config_path "$REAL_USER") |
|
||||
if [ -z "$CONFIG_PATH" ]; then |
|
||||
echo -e "${RED}${ERROR_CONFIG_PATH}${NC}" |
|
||||
exit 1 |
|
||||
fi |
|
||||
echo -e "${CYAN}$READING_CONFIG${NC}" |
|
||||
|
|
||||
# 生成新配置 |
|
||||
echo -e "${CYAN}$GENERATING_IDS${NC}" |
|
||||
NEW_CONFIG=$(cat <<EOF |
|
||||
{ |
|
||||
"telemetry.macMachineId": "$(generate_machine_id)", |
|
||||
"telemetry.machineId": "$(generate_machine_id)", |
|
||||
"telemetry.devDeviceId": "$(generate_dev_device_id)", |
|
||||
"telemetry.sqmId": "$(generate_machine_id)" |
|
||||
} |
|
||||
EOF |
|
||||
) |
|
||||
|
|
||||
# 创建目录(如果不存在) |
|
||||
if ! mkdir -p "$(dirname "$CONFIG_PATH")" 2>/dev/null; then |
|
||||
echo -e "${RED}${ERROR_CREATE_DIR}${NC}" |
|
||||
exit 1 |
|
||||
fi |
|
||||
|
|
||||
# 保存配置 |
|
||||
if ! echo "$NEW_CONFIG" > "$CONFIG_PATH"; then |
|
||||
echo -e "${RED}${ERROR_WRITE_CONFIG}${NC}" |
|
||||
exit 1 |
|
||||
fi |
|
||||
|
|
||||
chown "$REAL_USER" "$CONFIG_PATH" 2>/dev/null |
|
||||
chmod 644 "$CONFIG_PATH" 2>/dev/null |
|
||||
|
|
||||
# 显示成功消息 |
|
||||
echo -e "\n${GREEN}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}" |
|
||||
echo -e "${GREEN}$SUCCESS_MSG${NC}" |
|
||||
echo -e "${YELLOW}$RESTART_MSG${NC}" |
|
||||
echo -e "${GREEN}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}" |
|
||||
|
|
||||
echo -e "\n配置文件位置/Config file location:" |
|
||||
echo -e "${CYAN}$CONFIG_PATH${NC}\n" |
|
||||
|
|
||||
read -p "Press Enter to exit..." |
|
||||
} |
|
||||
|
|
||||
main "$@" |
|
@ -1,255 +1,50 @@ |
|||||
#!/bin/bash |
|
||||
|
#!/usr/bin/env bash |
||||
|
|
||||
# Version / 版本号 |
|
||||
VERSION="v2.5.0" |
|
||||
|
|
||||
# Configuration / 配置 |
|
||||
KEEP_BINARY=false |
|
||||
DOWNLOAD_DIR="/tmp" |
|
||||
INSTALL_DIR="/usr/local/bin" |
|
||||
AUTO_SUDO=false |
|
||||
|
|
||||
# Colors / 颜色 |
|
||||
RED='\033[31m' |
|
||||
GREEN='\033[32m' |
|
||||
YELLOW='\033[33m' |
|
||||
BLUE='\033[36m' |
|
||||
BOLD='\033[1m' |
|
||||
NC='\033[0m' |
|
||||
|
|
||||
# Separator / 分隔线 |
|
||||
SEPARATOR="${BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}" |
|
||||
|
|
||||
# Bilingual message functions / 双语消息函数 |
|
||||
|
# Error handling |
||||
error() { |
error() { |
||||
echo -e "\n${SEPARATOR}" |
|
||||
echo -e "${RED}${BOLD}❌ Error:${NC} $1" |
|
||||
echo -e "${RED}${BOLD}❌ 错误:${NC}$2" |
|
||||
echo -e "${SEPARATOR}\n" |
|
||||
|
echo -e "\033[31m\033[1mError:\033[0m $1" >&2 |
||||
exit 1 |
exit 1 |
||||
} |
} |
||||
|
|
||||
info() { |
|
||||
echo -e "\n${BLUE}${BOLD}ℹ️ [EN]:${NC} $1" |
|
||||
echo -e "${BLUE}${BOLD}ℹ️ [中文]:${NC} $2\n" |
|
||||
} |
|
||||
|
|
||||
success() { |
|
||||
echo -e "\n${SEPARATOR}" |
|
||||
echo -e "${GREEN}${BOLD}✅ [EN]:${NC} $1" |
|
||||
echo -e "${GREEN}${BOLD}✅ [中文]:${NC} $2" |
|
||||
echo -e "${SEPARATOR}\n" |
|
||||
} |
|
||||
|
|
||||
warning() { |
|
||||
echo -e "\n${YELLOW}${BOLD}⚠️ [EN]:${NC} $1" |
|
||||
echo -e "${YELLOW}${BOLD}⚠️ [中文]:${NC} $2\n" |
|
||||
} |
|
||||
|
|
||||
# System detection / 系统检测 |
|
||||
detect_platform() { |
|
||||
OS=$(uname -s | tr '[:upper:]' '[:lower:]') |
|
||||
ARCH=$(uname -m) |
|
||||
|
|
||||
case "$OS" in |
|
||||
linux*) |
|
||||
case "$ARCH" in |
|
||||
x86_64) BINARY_NAME="cursor_id_modifier_${VERSION}_linux_amd64" ;; |
|
||||
*) error "Unsupported Linux architecture: $ARCH" "不支持的Linux架构:$ARCH" ;; |
|
||||
esac |
|
||||
;; |
|
||||
darwin*) |
|
||||
case "$ARCH" in |
|
||||
x86_64) BINARY_NAME="cursor_id_modifier_${VERSION}_darwin_amd64_intel" ;; |
|
||||
arm64) BINARY_NAME="cursor_id_modifier_${VERSION}_darwin_arm64_m1" ;; |
|
||||
*) error "Unsupported macOS architecture: $ARCH" "不支持的macOS架构:$ARCH" ;; |
|
||||
esac |
|
||||
;; |
|
||||
msys*|mingw*|cygwin*) |
|
||||
case "$ARCH" in |
|
||||
x86_64) BINARY_NAME="cursor_id_modifier_${VERSION}_windows_amd64.exe" ;; |
|
||||
*) error "Unsupported Windows architecture: $ARCH" "不支持的Windows架构:$ARCH" ;; |
|
||||
esac |
|
||||
;; |
|
||||
*) |
|
||||
error "Unsupported operating system: $OS" "不支持的操作系统:$OS" |
|
||||
;; |
|
||||
esac |
|
||||
} |
|
||||
|
|
||||
# System checks / 系统检查 |
|
||||
check_requirements() { |
|
||||
info "Checking system requirements..." "正在检查系统要求..." |
|
||||
|
|
||||
# Check network connectivity / 检查网络连接 |
|
||||
if ! ping -c 1 github.com >/dev/null 2>&1; then |
|
||||
error "No network connection to GitHub" "无法连接到 GitHub" |
|
||||
fi |
|
||||
|
# Detect platform |
||||
|
OS=$(uname -s | tr '[:upper:]' '[:lower:]') |
||||
|
ARCH=$(uname -m) |
||||
|
|
||||
# Check curl / 检查curl |
|
||||
if ! command -v curl >/dev/null 2>&1; then |
|
||||
error "curl is required. Please install curl first." \ |
|
||||
"需要安装 curl。请先安装 curl 后再运行此脚本。" |
|
||||
fi |
|
||||
} |
|
||||
|
|
||||
# Privilege check / 权限检查 |
|
||||
check_privileges() { |
|
||||
if [ "$EUID" -ne 0 ]; then |
|
||||
if [ "$AUTO_SUDO" = "true" ]; then |
|
||||
if command -v sudo >/dev/null 2>&1; then |
|
||||
info "Re-running with sudo..." "使用 sudo 重新运行..." |
|
||||
exec sudo bash "$0" "$@" |
|
||||
else |
|
||||
error "This script must be run as root. Please use sudo." \ |
|
||||
"此脚本必须以 root 身份运行。请使用 sudo。" |
|
||||
fi |
|
||||
else |
|
||||
error "This script must be run as root. Please use sudo." \ |
|
||||
"此脚本必须以 root 身份运行。请使用 sudo。" |
|
||||
fi |
|
||||
fi |
|
||||
} |
|
||||
|
# Get latest version |
||||
|
VERSION=$(curl -sL "https://api.github.com/repos/realies/go-cursor-help/releases/latest" | grep '"tag_name":' | sed -E 's/.*"v([^"]+)".*/\1/') |
||||
|
[ -z "$VERSION" ] && error "Could not determine latest version" |
||||
|
|
||||
# Binary verification / 二进制验证 |
|
||||
verify_binary() { |
|
||||
info "Verifying binary..." "正在验证二进制文件..." |
|
||||
|
|
||||
# Check file existence / 检查文件是否存在 |
|
||||
if [ ! -f "$DOWNLOAD_PATH" ]; then |
|
||||
error "Binary file download failed or does not exist" \ |
|
||||
"二进制文件下载失败或不存在" |
|
||||
fi |
|
||||
|
|
||||
# Check executable format / 检查可执行格式 |
|
||||
if ! file "$DOWNLOAD_PATH" | grep -q "executable"; then |
|
||||
error "Downloaded file is not an executable" \ |
|
||||
"下载的文件不是可执行文件" |
|
||||
fi |
|
||||
|
|
||||
# Check file size / 检查文件大小 |
|
||||
local size=$(wc -c < "$DOWNLOAD_PATH") |
|
||||
if [ "$size" -lt 1000000 ]; then # At least 1MB / 至少1MB |
|
||||
error "Downloaded file size is abnormal" \ |
|
||||
"下载的文件大小异常" |
|
||||
fi |
|
||||
|
|
||||
# Set executable permissions / 设置可执行权限 |
|
||||
info "Setting executable permissions..." "正在设置可执行权限..." |
|
||||
if ! chmod +x "$DOWNLOAD_PATH"; then |
|
||||
error "Failed to set executable permissions" "无法设置可执行权限" |
|
||||
fi |
|
||||
} |
|
||||
|
|
||||
# Cleanup functions / 清理函数 |
|
||||
cleanup_old_version() { |
|
||||
if [ -f "$INSTALL_DIR/cursor-id-modifier" ]; then |
|
||||
info "Removing old version..." "正在删除旧版..." |
|
||||
rm -f "$INSTALL_DIR/cursor-id-modifier" || \ |
|
||||
error "Failed to remove old version" "删除旧版本失败" |
|
||||
fi |
|
||||
} |
|
||||
|
|
||||
cleanup_temp_files() { |
|
||||
if [ "$KEEP_BINARY" = "false" ]; then |
|
||||
rm -f "$DOWNLOAD_PATH" |
|
||||
rm -f "$INSTALL_DIR/cursor-id-modifier-wrapper" |
|
||||
fi |
|
||||
} |
|
||||
|
|
||||
# Parse arguments / 解析参数 |
|
||||
parse_args() { |
|
||||
while [[ $# -gt 0 ]]; do |
|
||||
case $1 in |
|
||||
--auto-sudo) |
|
||||
AUTO_SUDO=true |
|
||||
shift |
|
||||
;; |
|
||||
--keep-binary) |
|
||||
KEEP_BINARY=true |
|
||||
shift |
|
||||
;; |
|
||||
--download-dir=*) |
|
||||
DOWNLOAD_DIR="${1#*=}" |
|
||||
shift |
|
||||
;; |
|
||||
*) |
|
||||
shift |
|
||||
;; |
|
||||
|
# Get binary name based on platform |
||||
|
case "$OS" in |
||||
|
linux*) |
||||
|
case "$ARCH" in |
||||
|
x86_64) BINARY="cursor_id_modifier_${VERSION}_linux_amd64" ;; |
||||
|
aarch64|arm64) BINARY="cursor_id_modifier_${VERSION}_linux_arm64" ;; |
||||
|
*) error "Unsupported Linux architecture: $ARCH" ;; |
||||
esac |
esac |
||||
done |
|
||||
} |
|
||||
|
|
||||
# Print banner / 打印横幅 |
|
||||
print_banner() { |
|
||||
echo -e "\n${BLUE}${BOLD}" |
|
||||
echo " ██████╗██╗ ██╗██████╗ ███████╗ ██████╗ ██████╗" |
|
||||
echo " ██╔════╝██║ ██║██╔══██╗██╔════╝█╔═══██╗██╔══██╗" |
|
||||
echo " ██║ ██║ ██║██████╔╝███████╗██║ ██║██████╔╝" |
|
||||
echo " ██║ ██║ ██║██╔══██╗╚════██ ██║ ██║██╔══██╗" |
|
||||
echo " ╚██████╗╚██████╔╝██║ ██║███████║╚██████╔╝██║ ██║" |
|
||||
echo " ╚════╝ ╚═════╝ ╚═╝ ╚═╝╚══════╝ ╚════╝ ╚═╝ ╚═╝" |
|
||||
echo -e "${NC}" |
|
||||
echo -e "${YELLOW}${BOLD} >> Cursor ID Modifier ${VERSION} <<${NC}" |
|
||||
echo -e "${BLUE}${BOLD} [ By Pancake Fruit Rolled Shark Chili ]${NC}\n" |
|
||||
} |
|
||||
|
|
||||
# Main installation process / 主安装流程 |
|
||||
main() { |
|
||||
check_privileges "$@" |
|
||||
|
|
||||
print_banner |
|
||||
|
|
||||
info "Starting installation of cursor-id-modifier ${VERSION}..." \ |
|
||||
"开始安装 cursor-id-modifier ${VERSION}..." |
|
||||
|
|
||||
detect_platform |
|
||||
check_requirements |
|
||||
|
|
||||
# Create installation directory / 创建安装目录 |
|
||||
mkdir -p "$INSTALL_DIR" 2>/dev/null || \ |
|
||||
error "Failed to create installation directory" "无法创建安装目录" |
|
||||
|
|
||||
# Download binary / 下载二进制文件 |
|
||||
info "Downloading cursor-id-modifier ($OS-$ARCH)..." \ |
|
||||
"正在下载 cursor-id-modifier ($OS-$ARCH)..." |
|
||||
|
|
||||
DOWNLOAD_URL="https://github.com/yuaotian/go-cursor-help/raw/refs/heads/master/bin/$BINARY_NAME" |
|
||||
DOWNLOAD_PATH="$DOWNLOAD_DIR/$BINARY_NAME" |
|
||||
|
|
||||
if ! curl -L --progress-bar "$DOWNLOAD_URL" -o "$DOWNLOAD_PATH"; then |
|
||||
error "Failed to download binary" "下载二进制文件失败" |
|
||||
fi |
|
||||
|
|
||||
success "Download completed" "下载完成" |
|
||||
|
;; |
||||
|
darwin*) |
||||
|
case "$ARCH" in |
||||
|
x86_64) BINARY="cursor_id_modifier_${VERSION}_darwin_amd64" ;; |
||||
|
arm64) BINARY="cursor_id_modifier_${VERSION}_darwin_arm64" ;; |
||||
|
*) error "Unsupported macOS architecture: $ARCH" ;; |
||||
|
esac |
||||
|
;; |
||||
|
*) error "Unsupported operating system: $OS" ;; |
||||
|
esac |
||||
|
|
||||
verify_binary |
|
||||
cleanup_old_version |
|
||||
|
# Set up cleanup trap |
||||
|
trap 'rm -f "./${BINARY}"' EXIT |
||||
|
|
||||
# Install binary / 安装二进制文件 |
|
||||
info "Installing binary..." "正在安装二进制文件..." |
|
||||
if ! cp "$DOWNLOAD_PATH" "$INSTALL_DIR/cursor-id-modifier"; then |
|
||||
error "Failed to install binary" "安装二进制文件失败" |
|
||||
fi |
|
||||
|
# Download and run |
||||
|
DOWNLOAD_URL="https://github.com/realies/go-cursor-help/releases/download/v${VERSION}/${BINARY}" |
||||
|
echo "Downloading from: ${DOWNLOAD_URL}" |
||||
|
|
||||
# Create wrapper script / 创建包装脚本 |
|
||||
cat > "$INSTALL_DIR/cursor-id-modifier-wrapper" << 'EOF' |
|
||||
#!/bin/bash |
|
||||
if [ "$(uname -s)" = "Darwin" ]; then |
|
||||
sudo /usr/local/bin/cursor-id-modifier "$@" |
|
||||
else |
|
||||
sudo /usr/local/bin/cursor-id-modifier "$@" |
|
||||
|
# Download with error checking |
||||
|
if ! curl -fL "$DOWNLOAD_URL" -o "./${BINARY}"; then |
||||
|
error "Download failed. HTTP error from GitHub" |
||||
fi |
fi |
||||
EOF |
|
||||
chmod +x "$INSTALL_DIR/cursor-id-modifier-wrapper" |
|
||||
|
|
||||
# Cleanup / 清理 |
|
||||
cleanup_temp_files |
|
||||
|
|
||||
success "Installation successful! Run 'cursor-id-modifier-wrapper' from anywhere." \ |
|
||||
"安装成功!现在可以在任何位置运行 'cursor-id-modifier-wrapper'。" |
|
||||
} |
|
||||
|
|
||||
# Start installation / 开始安装 |
|
||||
parse_args "$@" |
|
||||
main "$@" |
|
||||
|
chmod +x "./${BINARY}" |
||||
|
echo "Running cursor-id-modifier..." |
||||
|
sudo "./${BINARY}" |
@ -1,118 +0,0 @@ |
|||||
@echo off |
|
||||
setlocal EnableDelayedExpansion |
|
||||
|
|
||||
:: 设置版本信息 |
|
||||
set VERSION=2.5.0 |
|
||||
|
|
||||
:: 设置颜色代码 |
|
||||
set "GREEN=[32m" |
|
||||
set "RED=[31m" |
|
||||
set "YELLOW=[33m" |
|
||||
set "RESET=[0m" |
|
||||
set "CYAN=[36m" |
|
||||
|
|
||||
:: 设置编译优化标志 |
|
||||
set "LDFLAGS=-s -w" |
|
||||
set "BUILDMODE=pie" |
|
||||
set "GCFLAGS=-N -l" |
|
||||
|
|
||||
:: 设置 CGO |
|
||||
set CGO_ENABLED=0 |
|
||||
|
|
||||
:: 显示编译信息 |
|
||||
echo %YELLOW%开始构建 version %VERSION%%RESET% |
|
||||
echo %YELLOW%使用优化标志: LDFLAGS=%LDFLAGS%, BUILDMODE=%BUILDMODE%%RESET% |
|
||||
echo %YELLOW%CGO_ENABLED=%CGO_ENABLED%%RESET% |
|
||||
|
|
||||
:: 清理旧的构建文件 |
|
||||
echo %YELLOW%清理旧的构建文件...%RESET% |
|
||||
if exist "..\bin" ( |
|
||||
rd /s /q "..\bin" |
|
||||
echo %GREEN%清理完成%RESET% |
|
||||
) else ( |
|
||||
echo %YELLOW%bin 目录不存在,无需清理%RESET% |
|
||||
) |
|
||||
|
|
||||
:: 创建输出目录 |
|
||||
mkdir "..\bin" 2>nul |
|
||||
|
|
||||
:: 定义目标平台数组 |
|
||||
set platforms[0].os=windows |
|
||||
set platforms[0].arch=amd64 |
|
||||
set platforms[0].ext=.exe |
|
||||
set platforms[0].suffix= |
|
||||
|
|
||||
set platforms[1].os=darwin |
|
||||
set platforms[1].arch=amd64 |
|
||||
set platforms[1].ext= |
|
||||
set platforms[1].suffix=_intel |
|
||||
|
|
||||
set platforms[2].os=darwin |
|
||||
set platforms[2].arch=arm64 |
|
||||
set platforms[2].ext= |
|
||||
set platforms[2].suffix=_m1 |
|
||||
|
|
||||
set platforms[3].os=linux |
|
||||
set platforms[3].arch=amd64 |
|
||||
set platforms[3].ext= |
|
||||
set platforms[3].suffix= |
|
||||
|
|
||||
:: 设置开始时间 |
|
||||
set start_time=%time% |
|
||||
|
|
||||
:: 创建 MD5 信息文件 |
|
||||
echo MD5 Checksums > ..\bin\md5_checksums.txt |
|
||||
echo ============= >> ..\bin\md5_checksums.txt |
|
||||
echo. >> ..\bin\md5_checksums.txt |
|
||||
|
|
||||
:: 编译所有目标 |
|
||||
echo 开始编译所有平台... |
|
||||
|
|
||||
for /L %%i in (0,1,3) do ( |
|
||||
set "os=!platforms[%%i].os!" |
|
||||
set "arch=!platforms[%%i].arch!" |
|
||||
set "ext=!platforms[%%i].ext!" |
|
||||
set "suffix=!platforms[%%i].suffix!" |
|
||||
|
|
||||
echo. |
|
||||
echo Building for !os! !arch!... |
|
||||
|
|
||||
set GOOS=!os! |
|
||||
set GOARCH=!arch! |
|
||||
|
|
||||
:: 构建输出文件名 |
|
||||
set "outfile=..\bin\cursor_id_modifier_v%VERSION%_!os!_!arch!!suffix!!ext!" |
|
||||
|
|
||||
:: 执行构建 |
|
||||
go build -trimpath -buildmode=%BUILDMODE% -ldflags="%LDFLAGS%" -gcflags="%GCFLAGS%" -o "!outfile!" ..\main.go |
|
||||
|
|
||||
if !errorlevel! equ 0 ( |
|
||||
echo %GREEN%Build successful: !outfile!%RESET% |
|
||||
|
|
||||
:: 计算并显示 MD5 |
|
||||
certutil -hashfile "!outfile!" MD5 | findstr /v "CertUtil" | findstr /v "MD5" > md5.tmp |
|
||||
set /p MD5=<md5.tmp |
|
||||
del md5.tmp |
|
||||
echo !MD5! cursor_id_modifier_v%VERSION%_!os!_!arch!!suffix!!ext! >> ..\bin\md5_checksums.txt |
|
||||
echo %CYAN%MD5: !MD5!%RESET% |
|
||||
) else ( |
|
||||
echo %RED%Build failed for !os! !arch!%RESET% |
|
||||
) |
|
||||
) |
|
||||
|
|
||||
:: 计算总耗时 |
|
||||
set end_time=%time% |
|
||||
set /a duration = %end_time:~0,2% * 3600 + %end_time:~3,2% * 60 + %end_time:~6,2% - (%start_time:~0,2% * 3600 + %start_time:~3,2% * 60 + %start_time:~6,2%) |
|
||||
|
|
||||
echo. |
|
||||
echo %GREEN%所有构建完成! 总耗时: %duration% 秒%RESET% |
|
||||
echo %CYAN%MD5 校验值已保存到 bin/md5_checksums.txt%RESET% |
|
||||
if exist "..\bin" dir /b "..\bin" |
|
||||
|
|
||||
:: 显示 MD5 校验文件内容 |
|
||||
echo. |
|
||||
echo %YELLOW%MD5 校验值:%RESET% |
|
||||
type ..\bin\md5_checksums.txt |
|
||||
|
|
||||
pause |
|
||||
endlocal |
|
@ -1,101 +0,0 @@ |
|||||
#!/bin/bash |
|
||||
|
|
||||
# 设置颜色代码 |
|
||||
GREEN='\033[0;32m' |
|
||||
RED='\033[0;31m' |
|
||||
NC='\033[0m' # No Color |
|
||||
|
|
||||
# 版本信息 |
|
||||
VERSION="2.5.0" |
|
||||
|
|
||||
# 错误处理函数 |
|
||||
handle_error() { |
|
||||
echo -e "${RED}Error: $1${NC}" |
|
||||
exit 1 |
|
||||
} |
|
||||
|
|
||||
# 清理函数 |
|
||||
cleanup() { |
|
||||
echo "Cleaning old builds..." |
|
||||
rm -rf ../bin |
|
||||
} |
|
||||
|
|
||||
# 创建输出目录 |
|
||||
create_output_dir() { |
|
||||
echo "Creating bin directory..." |
|
||||
mkdir -p ../bin || handle_error "Failed to create bin directory" |
|
||||
} |
|
||||
|
|
||||
# 构建函数 |
|
||||
build() { |
|
||||
local os=$1 |
|
||||
local arch=$2 |
|
||||
local suffix=$3 |
|
||||
|
|
||||
echo -e "\nBuilding for $os ($arch)..." |
|
||||
|
|
||||
output_name="../bin/cursor_id_modifier_v${VERSION}_${os}_${arch}${suffix}" |
|
||||
|
|
||||
GOOS=$os GOARCH=$arch go build -o "$output_name" ../main.go |
|
||||
|
|
||||
if [ $? -eq 0 ]; then |
|
||||
echo -e "${GREEN}✓ Successfully built: ${output_name}${NC}" |
|
||||
else |
|
||||
echo -e "${RED}✗ Failed to build for $os $arch${NC}" |
|
||||
return 1 |
|
||||
fi |
|
||||
} |
|
||||
|
|
||||
# 主函数 |
|
||||
main() { |
|
||||
# 显示构建信息 |
|
||||
echo "Starting build process for version ${VERSION}" |
|
||||
|
|
||||
# 清理旧文件 |
|
||||
cleanup |
|
||||
|
|
||||
# 创建输出目录 |
|
||||
create_output_dir |
|
||||
|
|
||||
# 定义构建目标 |
|
||||
declare -A targets=( |
|
||||
["windows_amd64"]=".exe" |
|
||||
["darwin_amd64"]="" |
|
||||
["darwin_arm64"]="" |
|
||||
["linux_amd64"]="" |
|
||||
) |
|
||||
|
|
||||
# 构建计数器 |
|
||||
local success_count=0 |
|
||||
local fail_count=0 |
|
||||
|
|
||||
# 遍历所有目标进行构建 |
|
||||
for target in "${!targets[@]}"; do |
|
||||
os=${target%_*} |
|
||||
arch=${target#*_} |
|
||||
suffix=${targets[$target]} |
|
||||
|
|
||||
if build "$os" "$arch" "$suffix"; then |
|
||||
((success_count++)) |
|
||||
else |
|
||||
((fail_count++)) |
|
||||
fi |
|
||||
done |
|
||||
|
|
||||
# 显示构建结果 |
|
||||
echo -e "\nBuild Summary:" |
|
||||
echo -e "${GREEN}Successful builds: $success_count${NC}" |
|
||||
if [ $fail_count -gt 0 ]; then |
|
||||
echo -e "${RED}Failed builds: $fail_count${NC}" |
|
||||
fi |
|
||||
|
|
||||
# 显示生成的文件列表 |
|
||||
echo -e "\nGenerated files:" |
|
||||
ls -1 ../bin |
|
||||
} |
|
||||
|
|
||||
# 捕获错误信号 |
|
||||
trap 'echo -e "\n${RED}Build process interrupted${NC}"; exit 1' INT TERM |
|
||||
|
|
||||
# 执行主函数 |
|
||||
main |
|
@ -1,6 +0,0 @@ |
|||||
#!/bin/bash |
|
||||
echo "Building for Linux..." |
|
||||
export GOOS=linux |
|
||||
export GOARCH=amd64 |
|
||||
go build -o ../bin/cursor_id_modifier_linux ../main.go |
|
||||
echo "Build complete: ../bin/cursor_id_modifier_linux" |
|
@ -1,13 +0,0 @@ |
|||||
#!/bin/bash |
|
||||
echo "Building for macOS..." |
|
||||
export GOOS=darwin |
|
||||
export GOARCH=amd64 |
|
||||
go build -o ../bin/cursor_id_modifier_mac ../main.go |
|
||||
echo "Build complete: ../bin/cursor_id_modifier_mac" |
|
||||
|
|
||||
# Build for Apple Silicon |
|
||||
echo "Building for macOS ARM64..." |
|
||||
export GOOS=darwin |
|
||||
export GOARCH=arm64 |
|
||||
go build -o ../bin/cursor_id_modifier_mac_arm64 ../main.go |
|
||||
echo "Build complete: ../bin/cursor_id_modifier_mac_arm64" |
|
@ -1,6 +0,0 @@ |
|||||
@echo off |
|
||||
echo Building for Windows... |
|
||||
set GOOS=windows |
|
||||
set GOARCH=amd64 |
|
||||
go build -o ../bin/cursor_id_modifier.exe ../main.go |
|
||||
echo Build complete: ../bin/cursor_id_modifier.exe |
|
Write
Preview
Loading…
Cancel
Save
Reference in new issue