mirror of
https://wget.la/https://github.com/leookun/cursor-byok
synced 2026-08-17 03:27:02 +08:00
v0.3.8
This commit is contained in:
@@ -0,0 +1,153 @@
|
||||
version: "3"
|
||||
|
||||
vars:
|
||||
ROOT_DIR:
|
||||
sh: 'cd "{{.TASKFILE_DIR}}/.." && pwd'
|
||||
BUILD_DIR:
|
||||
sh: 'cd "{{.TASKFILE_DIR}}" && pwd'
|
||||
|
||||
tasks:
|
||||
extract:proto:
|
||||
summary: 从 Cursor 扩展快照提取 proto
|
||||
dir: '{{.ROOT_DIR}}'
|
||||
preconditions:
|
||||
- sh: 'test -z "{{.PROTO_INPUT}}" || test -f "{{.PROTO_INPUT}}"'
|
||||
msg: "PROTO_INPUT 指向的 Cursor 扩展 bundle 不存在。"
|
||||
- sh: 'test -n "{{.PROTO_INPUT}}" || test -f ./proto/extensions-cursor-app/cursor-always-local/dist/main.js || test -f /Applications/Cursor.app/Contents/Resources/app/extensions/cursor-always-local/dist/main.js'
|
||||
msg: "未找到 Cursor 扩展 bundle;请传入 PROTO_INPUT=/path/to/cursor-always-local/dist/main.js。"
|
||||
cmds:
|
||||
- chmod +x ./proto/extract_extensions_proto.sh
|
||||
- '{{if .PROTO_INPUT}}./proto/extract_extensions_proto.sh "{{.PROTO_INPUT}}"{{else}}./proto/extract_extensions_proto.sh{{end}}'
|
||||
|
||||
sync:proto:
|
||||
summary: 从 Cursor 扩展快照同步 proto 并重新生成 Go 代码
|
||||
dir: '{{.ROOT_DIR}}'
|
||||
deps:
|
||||
- task: extract:proto
|
||||
cmds:
|
||||
- cp ./proto/from_extensions/agent_v1.proto ./proto/agent_v1.proto
|
||||
- cp ./proto/from_extensions/aiserver_v1.proto ./proto/aiserver_v1.proto
|
||||
- perl -0pi -e 's|option go_package = "react-admin/cursor-server/gen/agent/v1;agentv1";|option go_package = "cursor/gen/agentv1;agentv1";|' ./proto/agent_v1.proto
|
||||
- perl -0pi -e 's|option go_package = "react-admin/cursor-server/gen/aiserver/v1;aiserverv1";|option go_package = "cursor/gen/aiserverv1;aiserverv1";|' ./proto/aiserver_v1.proto
|
||||
- rm -rf ./gen/agentv1 ./gen/aiserverv1
|
||||
- task: generate:proto
|
||||
|
||||
generate:proto:
|
||||
summary: 生成 proto Go/Connect 代码
|
||||
dir: '{{.ROOT_DIR}}'
|
||||
sources:
|
||||
- proto/*.proto
|
||||
generates:
|
||||
- gen/agentv1/*.go
|
||||
- gen/aiserverv1/*.go
|
||||
- gen/aiserverv1/aiserverv1connect/*.go
|
||||
preconditions:
|
||||
- sh: protoc --version
|
||||
msg: "未检测到 protoc,请先安装 Protocol Buffers 编译器。"
|
||||
- sh: protoc-gen-go --version >/dev/null 2>&1 || which protoc-gen-go
|
||||
msg: "未检测到 protoc-gen-go,请先安装。"
|
||||
- sh: protoc-gen-connect-go --version >/dev/null 2>&1 || which protoc-gen-connect-go
|
||||
msg: "未检测到 protoc-gen-connect-go,请先安装。"
|
||||
cmds:
|
||||
- rm -rf ./gen/agentv1 ./gen/aiserverv1
|
||||
- protoc -I ./proto --go_out=. --go_opt=module=cursor --connect-go_out=. --connect-go_opt=module=cursor ./proto/agent_v1.proto ./proto/aiserver_v1.proto
|
||||
- gofmt -w $(find ./gen -name '*.go' -type f)
|
||||
|
||||
go:mod:tidy:
|
||||
summary: 整理 Go 依赖
|
||||
internal: true
|
||||
dir: '{{.ROOT_DIR}}'
|
||||
cmds:
|
||||
- go mod tidy
|
||||
|
||||
install:frontend:deps:
|
||||
summary: 安装前端依赖(Yarn)
|
||||
dir: '{{.ROOT_DIR}}/frontend'
|
||||
sources:
|
||||
- package.json
|
||||
- yarn.lock
|
||||
generates:
|
||||
- node_modules
|
||||
preconditions:
|
||||
- sh: yarn --version
|
||||
msg: "未检测到 Yarn,请先安装 Yarn。"
|
||||
cmds:
|
||||
- yarn install --frozen-lockfile
|
||||
|
||||
generate:bindings:
|
||||
label: generate:bindings (BUILD_FLAGS={{.BUILD_FLAGS}})
|
||||
summary: 生成前端绑定
|
||||
dir: '{{.ROOT_DIR}}'
|
||||
deps:
|
||||
- task: generate:proto
|
||||
- task: go:mod:tidy
|
||||
sources:
|
||||
- "**/*.[jt]s"
|
||||
- exclude: frontend/**/*
|
||||
- frontend/bindings/**/*
|
||||
- "**/*.go"
|
||||
- go.mod
|
||||
- go.sum
|
||||
generates:
|
||||
- frontend/bindings/**/*
|
||||
cmds:
|
||||
- wails3 generate bindings -f '{{.BUILD_FLAGS}}' -clean=true
|
||||
|
||||
build:frontend:
|
||||
label: build:frontend (DEV={{.DEV}} SCAN={{.SCAN}})
|
||||
summary: 构建前端资源
|
||||
dir: '{{.ROOT_DIR}}/frontend'
|
||||
sources:
|
||||
- "**/*"
|
||||
generates:
|
||||
- dist/**/*
|
||||
deps:
|
||||
- task: install:frontend:deps
|
||||
- task: generate:bindings
|
||||
vars:
|
||||
BUILD_FLAGS:
|
||||
ref: .BUILD_FLAGS
|
||||
cmds:
|
||||
- yarn run {{.BUILD_COMMAND}}{{if eq .SCAN "true"}} --scan{{end}}
|
||||
env:
|
||||
PRODUCTION: '{{if eq .DEV "true"}}false{{else}}true{{end}}'
|
||||
vars:
|
||||
BUILD_COMMAND: '{{if eq .DEV "true"}}build:dev{{else}}build{{end}}'
|
||||
SCAN: '{{.SCAN | default "false"}}'
|
||||
|
||||
dev:frontend:
|
||||
summary: 启动前端开发服务
|
||||
dir: '{{.ROOT_DIR}}/frontend'
|
||||
deps:
|
||||
- task: install:frontend:deps
|
||||
cmds:
|
||||
- yarn run dev --port {{.VITE_PORT}} --strictPort
|
||||
|
||||
generate:icons:
|
||||
summary: 仅使用 appicon.png 生成 Windows 与 macOS 图标
|
||||
dir: '{{.BUILD_DIR}}'
|
||||
sources:
|
||||
- "appicon.png"
|
||||
generates:
|
||||
- "darwin/icons.icns"
|
||||
- "windows/icon.ico"
|
||||
cmds:
|
||||
- wails3 generate icons -input appicon.png -macfilename darwin/icons.icns -windowsfilename windows/icon.ico
|
||||
|
||||
update:build-assets:
|
||||
summary: 根据配置更新构建资产
|
||||
dir: '{{.BUILD_DIR}}'
|
||||
cmds:
|
||||
- wails3 update build-assets -name "{{.APP_NAME}}" -binaryname "{{.APP_NAME}}" -config config.yml -dir .
|
||||
- rm -rf ios
|
||||
|
||||
setup:docker:
|
||||
summary: 构建 Linux 交叉编译 Docker 镜像
|
||||
dir: '{{.ROOT_DIR}}'
|
||||
preconditions:
|
||||
- sh: docker info >/dev/null 2>&1
|
||||
msg: "未检测到可用的 Docker daemon,请先启动 Docker。"
|
||||
- sh: test -f ./build/docker/Dockerfile.cross
|
||||
msg: "未找到 build/docker/Dockerfile.cross。"
|
||||
cmds:
|
||||
- docker build --platform linux/amd64{{if .BASE_IMAGE}} --build-arg BASE_IMAGE="{{.BASE_IMAGE}}"{{end}}{{if .GO_TARBALL_URL}} --build-arg GO_TARBALL_URL="{{.GO_TARBALL_URL}}"{{end}} -t cursor-linux-amd64-cross -f ./build/docker/Dockerfile.cross ./build/docker
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 74 KiB |
@@ -0,0 +1,43 @@
|
||||
version: "3"
|
||||
|
||||
# 构建元信息(修改后可执行:wails3 task common:update:build-assets)
|
||||
info:
|
||||
companyName: "Cursor助手"
|
||||
productName: "Cursor助手"
|
||||
productIdentifier: "com.cursor.wuxianxubei"
|
||||
description: "Cursor助手"
|
||||
copyright: "© 2026, Cursor助手"
|
||||
comments: "Cursor助手"
|
||||
version: "0.0.38"
|
||||
|
||||
dev_mode:
|
||||
root_path: .
|
||||
log_level: warn
|
||||
debounce: 1000
|
||||
ignore:
|
||||
dir:
|
||||
- .git
|
||||
- node_modules
|
||||
- frontend
|
||||
- bin
|
||||
file:
|
||||
- .DS_Store
|
||||
- .gitignore
|
||||
- .gitkeep
|
||||
watched_extension:
|
||||
- "*.go"
|
||||
- "*.js"
|
||||
- "*.ts"
|
||||
git_ignore: true
|
||||
executes:
|
||||
- cmd: wails3 build DEV=true
|
||||
type: blocking
|
||||
- cmd: wails3 task common:dev:frontend
|
||||
type: background
|
||||
- cmd: wails3 task run
|
||||
type: primary
|
||||
|
||||
fileAssociations:
|
||||
|
||||
other:
|
||||
- name: 其他数据
|
||||
@@ -0,0 +1,37 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>CFBundleExecutable</key>
|
||||
<string>Cursor助手</string>
|
||||
<key>CFBundleGetInfoString</key>
|
||||
<string>Cursor助手</string>
|
||||
<key>CFBundleIconFile</key>
|
||||
<string>icons</string>
|
||||
<key>CFBundleIconName</key>
|
||||
<string>appicon</string>
|
||||
<key>CFBundleIdentifier</key>
|
||||
<string>com.cursor.wuxianxubei</string>
|
||||
<key>CFBundleName</key>
|
||||
<string>Cursor助手</string>
|
||||
<key>CFBundlePackageType</key>
|
||||
<string>APPL</string>
|
||||
<key>CFBundleShortVersionString</key>
|
||||
<string>0.0.38</string>
|
||||
<key>CFBundleVersion</key>
|
||||
<string>0.0.38</string>
|
||||
<key>LSMinimumSystemVersion</key>
|
||||
<string>12.0.0</string>
|
||||
<key>LSUIElement</key>
|
||||
<true/>
|
||||
<key>NSAppTransportSecurity</key>
|
||||
<dict>
|
||||
<key>NSAllowsLocalNetworking</key>
|
||||
<true/>
|
||||
</dict>
|
||||
<key>NSHighResolutionCapable</key>
|
||||
<string>true</string>
|
||||
<key>NSHumanReadableCopyright</key>
|
||||
<string>© 2026, Cursor助手</string>
|
||||
</dict>
|
||||
</plist>
|
||||
@@ -0,0 +1,32 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>CFBundleExecutable</key>
|
||||
<string>Cursor助手</string>
|
||||
<key>CFBundleGetInfoString</key>
|
||||
<string>Cursor助手</string>
|
||||
<key>CFBundleIconFile</key>
|
||||
<string>icons</string>
|
||||
<key>CFBundleIconName</key>
|
||||
<string>appicon</string>
|
||||
<key>CFBundleIdentifier</key>
|
||||
<string>com.cursor.wuxianxubei</string>
|
||||
<key>CFBundleName</key>
|
||||
<string>Cursor助手</string>
|
||||
<key>CFBundlePackageType</key>
|
||||
<string>APPL</string>
|
||||
<key>CFBundleShortVersionString</key>
|
||||
<string>0.0.38</string>
|
||||
<key>CFBundleVersion</key>
|
||||
<string>0.0.38</string>
|
||||
<key>LSMinimumSystemVersion</key>
|
||||
<string>12.0.0</string>
|
||||
<key>LSUIElement</key>
|
||||
<true/>
|
||||
<key>NSHighResolutionCapable</key>
|
||||
<string>true</string>
|
||||
<key>NSHumanReadableCopyright</key>
|
||||
<string>© 2026, Cursor助手</string>
|
||||
</dict>
|
||||
</plist>
|
||||
@@ -0,0 +1,273 @@
|
||||
version: "3"
|
||||
|
||||
includes:
|
||||
common: ../Taskfile.yml
|
||||
|
||||
tasks:
|
||||
build:
|
||||
summary: 构建 macOS 程序
|
||||
internal: true
|
||||
cmds:
|
||||
- task: build:native
|
||||
vars:
|
||||
ARCH:
|
||||
ref: .ARCH
|
||||
OUTPUT:
|
||||
ref: .OUTPUT
|
||||
BINARY_NAME:
|
||||
ref: .BINARY_NAME
|
||||
BUILD_FLAGS:
|
||||
ref: .BUILD_FLAGS
|
||||
EXTRA_TAGS:
|
||||
ref: .EXTRA_TAGS
|
||||
DEV:
|
||||
ref: .DEV
|
||||
SCAN:
|
||||
ref: .SCAN
|
||||
|
||||
build:native:
|
||||
summary: 使用本机构建 macOS 程序
|
||||
internal: true
|
||||
deps:
|
||||
- task: common:go:mod:tidy
|
||||
- task: common:build:frontend
|
||||
vars:
|
||||
BUILD_FLAGS:
|
||||
ref: .BUILD_FLAGS
|
||||
DEV:
|
||||
ref: .DEV
|
||||
SCAN:
|
||||
ref: .SCAN
|
||||
- task: common:generate:icons
|
||||
cmds:
|
||||
- go build {{.BUILD_FLAGS}} -o {{.OUTPUT}}
|
||||
vars:
|
||||
BUILD_FLAGS: '{{if eq .DEV "true"}}{{if .EXTRA_TAGS}}-tags {{.EXTRA_TAGS}} {{end}}-buildvcs=false -gcflags=all="-l" -ldflags="-X cursor/internal/buildinfo.Version={{.APP_VERSION}}"{{else}}-tags production{{if .EXTRA_TAGS}},{{.EXTRA_TAGS}}{{end}} -trimpath -buildvcs=false -ldflags="-w -s -X cursor/internal/buildinfo.Version={{.APP_VERSION}}"{{end}}'
|
||||
BINARY_NAME: '{{.BINARY_NAME | default .APP_NAME}}'
|
||||
DEFAULT_OUTPUT: '{{.BIN_DIR}}/{{.BINARY_NAME}}'
|
||||
OUTPUT: '{{ .OUTPUT | default .DEFAULT_OUTPUT }}'
|
||||
env:
|
||||
GOOS: darwin
|
||||
CGO_ENABLED: 1
|
||||
GOARCH: '{{.ARCH | default ARCH}}'
|
||||
CGO_CFLAGS: "-mmacosx-version-min=10.15"
|
||||
CGO_LDFLAGS: "-mmacosx-version-min=10.15"
|
||||
MACOSX_DEPLOYMENT_TARGET: "10.15"
|
||||
|
||||
build:universal:
|
||||
summary: 构建 macOS 通用包(amd64 + arm64)
|
||||
internal: true
|
||||
deps:
|
||||
- task: build
|
||||
vars:
|
||||
ARCH: amd64
|
||||
BINARY_NAME: "{{.APP_NAME}}-amd64"
|
||||
OUTPUT: "{{.BIN_DIR}}/{{.APP_NAME}}-amd64"
|
||||
- task: build
|
||||
vars:
|
||||
ARCH: arm64
|
||||
BINARY_NAME: "{{.APP_NAME}}-arm64"
|
||||
OUTPUT: "{{.BIN_DIR}}/{{.APP_NAME}}-arm64"
|
||||
cmds:
|
||||
- lipo -create -output "{{.BIN_DIR}}/{{.APP_NAME}}" "{{.BIN_DIR}}/{{.APP_NAME}}-amd64" "{{.BIN_DIR}}/{{.APP_NAME}}-arm64"
|
||||
- rm -f "{{.BIN_DIR}}/{{.APP_NAME}}-amd64" "{{.BIN_DIR}}/{{.APP_NAME}}-arm64"
|
||||
|
||||
package:
|
||||
summary: 打包 macOS .app(可通过 APP_BUNDLE 指定输出包名)
|
||||
internal: true
|
||||
cmds:
|
||||
- task: build
|
||||
vars:
|
||||
ARCH:
|
||||
ref: .ARCH
|
||||
OUTPUT:
|
||||
ref: .OUTPUT
|
||||
BINARY_NAME:
|
||||
ref: .BINARY_NAME
|
||||
BUILD_FLAGS:
|
||||
ref: .BUILD_FLAGS
|
||||
EXTRA_TAGS:
|
||||
ref: .EXTRA_TAGS
|
||||
DEV:
|
||||
ref: .DEV
|
||||
SCAN:
|
||||
ref: .SCAN
|
||||
- task: create:app:bundle
|
||||
vars:
|
||||
APP_BUNDLE:
|
||||
ref: .APP_BUNDLE
|
||||
OUTPUT:
|
||||
ref: .OUTPUT
|
||||
BINARY_NAME:
|
||||
ref: .BINARY_NAME
|
||||
|
||||
package:dmg:
|
||||
summary: 打包 macOS DMG(可通过 APP_BUNDLE/DMG_NAME 指定输出文件名)
|
||||
internal: true
|
||||
cmds:
|
||||
- task: package
|
||||
vars:
|
||||
ARCH:
|
||||
ref: .ARCH
|
||||
OUTPUT:
|
||||
ref: .OUTPUT
|
||||
BINARY_NAME:
|
||||
ref: .BINARY_NAME
|
||||
APP_BUNDLE:
|
||||
ref: .APP_BUNDLE
|
||||
BUILD_FLAGS:
|
||||
ref: .BUILD_FLAGS
|
||||
EXTRA_TAGS:
|
||||
ref: .EXTRA_TAGS
|
||||
DEV:
|
||||
ref: .DEV
|
||||
SCAN:
|
||||
ref: .SCAN
|
||||
- task: create:dmg
|
||||
vars:
|
||||
ARCH:
|
||||
ref: .ARCH
|
||||
APP_BUNDLE:
|
||||
ref: .APP_BUNDLE
|
||||
DMG_NAME:
|
||||
ref: .DMG_NAME
|
||||
- task: cleanup:package:artifacts
|
||||
vars:
|
||||
OUTPUT:
|
||||
ref: .OUTPUT
|
||||
BINARY_NAME:
|
||||
ref: .BINARY_NAME
|
||||
APP_BUNDLE:
|
||||
ref: .APP_BUNDLE
|
||||
|
||||
package:archive:
|
||||
summary: 打包 macOS updater 归档(.tar.gz)
|
||||
internal: true
|
||||
cmds:
|
||||
- task: package
|
||||
vars:
|
||||
ARCH:
|
||||
ref: .ARCH
|
||||
OUTPUT:
|
||||
ref: .OUTPUT
|
||||
BINARY_NAME:
|
||||
ref: .BINARY_NAME
|
||||
APP_BUNDLE:
|
||||
ref: .APP_BUNDLE
|
||||
BUILD_FLAGS:
|
||||
ref: .BUILD_FLAGS
|
||||
EXTRA_TAGS:
|
||||
ref: .EXTRA_TAGS
|
||||
DEV:
|
||||
ref: .DEV
|
||||
SCAN:
|
||||
ref: .SCAN
|
||||
- task: create:archive
|
||||
vars:
|
||||
APP_BUNDLE:
|
||||
ref: .APP_BUNDLE
|
||||
ARCHIVE_PATH:
|
||||
ref: .ARCHIVE_PATH
|
||||
- task: cleanup:package:artifacts
|
||||
vars:
|
||||
OUTPUT:
|
||||
ref: .OUTPUT
|
||||
BINARY_NAME:
|
||||
ref: .BINARY_NAME
|
||||
APP_BUNDLE:
|
||||
ref: .APP_BUNDLE
|
||||
|
||||
package:universal:
|
||||
summary: 打包 macOS 通用 .app
|
||||
internal: true
|
||||
cmds:
|
||||
- task: build:universal
|
||||
- task: create:app:bundle
|
||||
|
||||
create:app:bundle:
|
||||
summary: 生成 .app 包
|
||||
internal: true
|
||||
vars:
|
||||
APP_BUNDLE: '{{.APP_BUNDLE | default (printf "%s.app" .APP_NAME)}}'
|
||||
BINARY_NAME: '{{.BINARY_NAME | default .APP_NAME}}'
|
||||
BINARY_PATH: '{{.OUTPUT | default (printf "%s/%s" .BIN_DIR .BINARY_NAME)}}'
|
||||
EXECUTABLE_NAME: '{{.EXECUTABLE_NAME | default .APP_NAME}}'
|
||||
cmds:
|
||||
- rm -rf "{{.BIN_DIR}}/{{.APP_BUNDLE}}"
|
||||
- mkdir -p "{{.BIN_DIR}}/{{.APP_BUNDLE}}/Contents/MacOS"
|
||||
- mkdir -p "{{.BIN_DIR}}/{{.APP_BUNDLE}}/Contents/Resources"
|
||||
- cp build/darwin/icons.icns "{{.BIN_DIR}}/{{.APP_BUNDLE}}/Contents/Resources"
|
||||
- cp "{{.BINARY_PATH}}" "{{.BIN_DIR}}/{{.APP_BUNDLE}}/Contents/MacOS/{{.EXECUTABLE_NAME}}"
|
||||
- cp build/darwin/Info.plist "{{.BIN_DIR}}/{{.APP_BUNDLE}}/Contents"
|
||||
- task: codesign:adhoc
|
||||
vars:
|
||||
APP_BUNDLE:
|
||||
ref: .APP_BUNDLE
|
||||
|
||||
codesign:adhoc:
|
||||
summary: 使用临时签名(开发测试)
|
||||
internal: true
|
||||
vars:
|
||||
APP_BUNDLE: '{{.APP_BUNDLE | default (printf "%s.app" .APP_NAME)}}'
|
||||
cmds:
|
||||
- codesign --force --deep --sign - "{{.BIN_DIR}}/{{.APP_BUNDLE}}"
|
||||
|
||||
create:dmg:
|
||||
summary: 生成 macOS DMG 包(优先使用 create-dmg,不存在时回退 hdiutil)
|
||||
internal: true
|
||||
vars:
|
||||
APP_BUNDLE: '{{.APP_BUNDLE | default (printf "%s.app" .APP_NAME)}}'
|
||||
DMG_NAME: '{{.DMG_NAME | default (printf "%s.dmg" .APP_NAME)}}'
|
||||
STAGING_DIR: '{{.BIN_DIR}}/.dmg-{{.ARCH | default ARCH}}'
|
||||
cmds:
|
||||
- rm -rf "{{.STAGING_DIR}}"
|
||||
- mkdir -p "{{.STAGING_DIR}}"
|
||||
- cp -R "{{.BIN_DIR}}/{{.APP_BUNDLE}}" "{{.STAGING_DIR}}/{{.APP_NAME}}.app"
|
||||
- |
|
||||
if [ -f "build/dmg-extras/提示损坏?点我.command" ]; then
|
||||
cp "build/dmg-extras/提示损坏?点我.command" "{{.STAGING_DIR}}/提示损坏?点我.command"
|
||||
chmod +x "{{.STAGING_DIR}}/提示损坏?点我.command"
|
||||
fi
|
||||
- |
|
||||
if command -v create-dmg >/dev/null 2>&1; then
|
||||
rm -f "{{.BIN_DIR}}/{{.DMG_NAME}}"
|
||||
create-dmg --volname "{{.APP_NAME}}" --window-size 600 400 --icon-size 100 --app-drop-link 450 200 "{{.BIN_DIR}}/{{.DMG_NAME}}" "{{.STAGING_DIR}}"
|
||||
else
|
||||
hdiutil create -volname "{{.APP_NAME}}" -srcfolder "{{.STAGING_DIR}}" -ov -format UDZO "{{.BIN_DIR}}/{{.DMG_NAME}}"
|
||||
fi
|
||||
- rm -rf "{{.STAGING_DIR}}"
|
||||
|
||||
create:archive:
|
||||
summary: 生成 macOS updater tar.gz 归档
|
||||
internal: true
|
||||
vars:
|
||||
APP_BUNDLE: '{{.APP_BUNDLE | default (printf "%s.app" .APP_NAME)}}'
|
||||
ARCHIVE_PATH: '{{.ARCHIVE_PATH | default (printf "%s/%s.tar.gz" .BIN_DIR .APP_NAME)}}'
|
||||
cmds:
|
||||
- rm -f "{{.ARCHIVE_PATH}}"
|
||||
- env LC_ALL=C tar -C "{{.BIN_DIR}}" -czf "{{.ARCHIVE_PATH}}" "{{.APP_BUNDLE}}"
|
||||
|
||||
cleanup:package:artifacts:
|
||||
summary: 清理打包中间产物
|
||||
internal: true
|
||||
vars:
|
||||
APP_BUNDLE: '{{.APP_BUNDLE | default (printf "%s.app" .APP_NAME)}}'
|
||||
BINARY_NAME: '{{.BINARY_NAME | default .APP_NAME}}'
|
||||
BINARY_PATH: '{{.OUTPUT | default (printf "%s/%s" .BIN_DIR .BINARY_NAME)}}'
|
||||
cmds:
|
||||
- rm -f "{{.BINARY_PATH}}"
|
||||
- rm -rf "{{.BIN_DIR}}/{{.APP_BUNDLE}}"
|
||||
|
||||
run:
|
||||
summary: 运行本地开发包
|
||||
vars:
|
||||
BINARY_NAME: '{{.BINARY_NAME | default .APP_NAME}}'
|
||||
EXECUTABLE_NAME: '{{.EXECUTABLE_NAME | default .APP_NAME}}'
|
||||
cmds:
|
||||
- mkdir -p "{{.BIN_DIR}}/{{.APP_NAME}}.dev.app/Contents/MacOS"
|
||||
- mkdir -p "{{.BIN_DIR}}/{{.APP_NAME}}.dev.app/Contents/Resources"
|
||||
- cp build/darwin/icons.icns "{{.BIN_DIR}}/{{.APP_NAME}}.dev.app/Contents/Resources"
|
||||
- cp "{{.BIN_DIR}}/{{.BINARY_NAME}}" "{{.BIN_DIR}}/{{.APP_NAME}}.dev.app/Contents/MacOS/{{.EXECUTABLE_NAME}}"
|
||||
- cp "build/darwin/Info.dev.plist" "{{.BIN_DIR}}/{{.APP_NAME}}.dev.app/Contents/Info.plist"
|
||||
- codesign --force --deep --sign - "{{.BIN_DIR}}/{{.APP_NAME}}.dev.app"
|
||||
- '{{.BIN_DIR}}/{{.APP_NAME}}.dev.app/Contents/MacOS/{{.EXECUTABLE_NAME}}'
|
||||
Binary file not shown.
Executable
+13
@@ -0,0 +1,13 @@
|
||||
#!/bin/bash
|
||||
APP_PATH="/Applications/Cursor助手.app"
|
||||
|
||||
if [ ! -d "$APP_PATH" ]; then
|
||||
echo "请先把 Cursor助手 拖到“应用程序”目录后再运行本脚本。"
|
||||
read -r -p "按回车退出..."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "正在移除隔离属性: $APP_PATH"
|
||||
xattr -cr "$APP_PATH"
|
||||
echo "处理完成,现在可以正常打开 Cursor助手。"
|
||||
read -r -p "按回车退出..."
|
||||
@@ -0,0 +1,26 @@
|
||||
# Docker image for building this app's Linux amd64 binary from macOS/Linux hosts.
|
||||
|
||||
ARG BASE_IMAGE=debian:trixie
|
||||
FROM ${BASE_IMAGE}
|
||||
|
||||
ARG GO_TARBALL_URL=https://go.dev/dl/go1.25.0.linux-amd64.tar.gz
|
||||
|
||||
RUN apt-get update \
|
||||
&& DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \
|
||||
ca-certificates curl git nodejs yarnpkg pkg-config gcc libc6-dev \
|
||||
libgtk-3-dev libwebkit2gtk-4.1-dev \
|
||||
&& curl -fsSL "${GO_TARBALL_URL}" -o /tmp/go.tar.gz \
|
||||
&& rm -rf /usr/local/go \
|
||||
&& tar -C /usr/local -xzf /tmp/go.tar.gz \
|
||||
&& ln -sf /usr/local/go/bin/go /usr/local/bin/go \
|
||||
&& ln -sf /usr/local/go/bin/gofmt /usr/local/bin/gofmt \
|
||||
&& ln -sf /usr/bin/yarnpkg /usr/local/bin/yarn \
|
||||
&& rm -f /tmp/go.tar.gz \
|
||||
&& rm -rf /var/lib/apt/lists/*
|
||||
|
||||
COPY build-linux.sh /usr/local/bin/build-linux.sh
|
||||
|
||||
RUN chmod +x /usr/local/bin/build-linux.sh
|
||||
|
||||
WORKDIR /app
|
||||
ENTRYPOINT ["/usr/local/bin/build-linux.sh"]
|
||||
@@ -0,0 +1,81 @@
|
||||
#!/bin/sh
|
||||
set -eu
|
||||
|
||||
log() {
|
||||
printf '[linux-build] %s\n' "$*"
|
||||
}
|
||||
|
||||
export GOOS=linux
|
||||
export GOARCH=amd64
|
||||
export CGO_ENABLED=1
|
||||
export CGO_CFLAGS="-w"
|
||||
|
||||
APP=${APP_NAME:-$(basename "$(pwd)")}
|
||||
BIN_PATH="bin/${APP}-linux-amd64"
|
||||
LOG_MODE=${GO_BUILD_LOG_MODE:-quiet}
|
||||
|
||||
case "$LOG_MODE" in
|
||||
quiet|heartbeat)
|
||||
;;
|
||||
verbose|trace)
|
||||
log "workspace: $(pwd)"
|
||||
log "target: ${APP} (${GOOS}/${GOARCH})"
|
||||
log "go version: $(go version)"
|
||||
log "log mode: ${LOG_MODE}"
|
||||
;;
|
||||
*)
|
||||
log "unknown GO_BUILD_LOG_MODE=${LOG_MODE}, falling back to quiet"
|
||||
LOG_MODE="quiet"
|
||||
;;
|
||||
esac
|
||||
|
||||
if [ -d "frontend" ] && [ -f "frontend/package.json" ] && [ ! -d "frontend/dist" ]; then
|
||||
log "frontend/dist missing, building frontend assets in container"
|
||||
(
|
||||
cd frontend
|
||||
yarn install --frozen-lockfile
|
||||
yarn run build
|
||||
)
|
||||
fi
|
||||
|
||||
mkdir -p bin
|
||||
|
||||
LDFLAGS="-s -w"
|
||||
if [ -n "${EXTRA_LDFLAGS:-}" ]; then
|
||||
LDFLAGS="$LDFLAGS $EXTRA_LDFLAGS"
|
||||
fi
|
||||
|
||||
TAGS="production"
|
||||
if [ -n "${EXTRA_TAGS:-}" ]; then
|
||||
TAGS="${TAGS},${EXTRA_TAGS}"
|
||||
fi
|
||||
|
||||
set -- go build
|
||||
case "$LOG_MODE" in
|
||||
quiet)
|
||||
;;
|
||||
heartbeat)
|
||||
;;
|
||||
verbose)
|
||||
set -- "$@" -v
|
||||
;;
|
||||
trace)
|
||||
set -- "$@" -x -v
|
||||
;;
|
||||
esac
|
||||
|
||||
set -- "$@" -tags "$TAGS" -trimpath -buildvcs=false -ldflags "$LDFLAGS" -o "$BIN_PATH" .
|
||||
|
||||
if "$@"; then
|
||||
:
|
||||
else
|
||||
status="$?"
|
||||
log "go build failed with exit code ${status}"
|
||||
exit "$status"
|
||||
fi
|
||||
|
||||
case "$LOG_MODE" in
|
||||
verbose|trace)
|
||||
log "built: ${BIN_PATH}"
|
||||
;;
|
||||
esac
|
||||
@@ -0,0 +1,9 @@
|
||||
//@ts-check
|
||||
// Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL
|
||||
// This file is automatically generated. DO NOT EDIT
|
||||
|
||||
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
||||
// @ts-ignore: Unused imports
|
||||
import { Create as $Create } from "@wailsio/runtime";
|
||||
|
||||
Object.freeze($Create.Events);
|
||||
@@ -0,0 +1,2 @@
|
||||
// Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL
|
||||
// This file is automatically generated. DO NOT EDIT
|
||||
@@ -0,0 +1,192 @@
|
||||
version: "3"
|
||||
|
||||
includes:
|
||||
common: ../Taskfile.yml
|
||||
|
||||
vars:
|
||||
CROSS_IMAGE: cursor-linux-amd64-cross
|
||||
PROJECT_ROOT:
|
||||
sh: 'cd "{{.TASKFILE_DIR}}/../.." && pwd'
|
||||
|
||||
tasks:
|
||||
build:
|
||||
summary: 构建 Linux 程序
|
||||
internal: true
|
||||
vars:
|
||||
TARGET_ARCH: '{{.ARCH | default ARCH}}'
|
||||
BUILD_FLAGS: '{{if eq .DEV "true"}}{{if .EXTRA_TAGS}}-tags {{.EXTRA_TAGS}} {{end}}-buildvcs=false -gcflags=all="-l" -ldflags="-X cursor/internal/buildinfo.Version={{.APP_VERSION}}"{{else}}-tags production{{if .EXTRA_TAGS}},{{.EXTRA_TAGS}}{{end}} -trimpath -buildvcs=false -ldflags="-w -s -X cursor/internal/buildinfo.Version={{.APP_VERSION}}"{{end}}'
|
||||
HAS_CC:
|
||||
sh: '(command -v gcc >/dev/null 2>&1 || command -v clang >/dev/null 2>&1) && echo "true" || echo "false"'
|
||||
preconditions:
|
||||
- sh: '[ "{{.TARGET_ARCH}}" = "amd64" ]'
|
||||
msg: "当前仅支持 linux/amd64 构建。"
|
||||
cmds:
|
||||
- task: '{{if and (eq OS "linux") (eq .HAS_CC "true") (eq .TARGET_ARCH ARCH)}}build:native{{else}}build:docker{{end}}'
|
||||
vars:
|
||||
ARCH:
|
||||
ref: .ARCH
|
||||
OUTPUT:
|
||||
ref: .OUTPUT
|
||||
BINARY_NAME:
|
||||
ref: .BINARY_NAME
|
||||
BUILD_FLAGS:
|
||||
ref: .BUILD_FLAGS
|
||||
EXTRA_TAGS:
|
||||
ref: .EXTRA_TAGS
|
||||
DEV:
|
||||
ref: .DEV
|
||||
SCAN:
|
||||
ref: .SCAN
|
||||
|
||||
build:native:
|
||||
summary: 使用本机构建 Linux 程序
|
||||
internal: true
|
||||
deps:
|
||||
- task: common:go:mod:tidy
|
||||
- task: common:build:frontend
|
||||
vars:
|
||||
BUILD_FLAGS:
|
||||
ref: .BUILD_FLAGS
|
||||
DEV:
|
||||
ref: .DEV
|
||||
SCAN:
|
||||
ref: .SCAN
|
||||
preconditions:
|
||||
- sh: '[ "{{OS}}" = "linux" ]'
|
||||
msg: "Linux 原生构建仅支持在 Linux 主机上执行。"
|
||||
- sh: pkg-config --version >/dev/null 2>&1
|
||||
msg: "未检测到 pkg-config,请先安装。"
|
||||
- sh: 'command -v gcc >/dev/null 2>&1 || command -v clang >/dev/null 2>&1'
|
||||
msg: "未检测到 gcc 或 clang,请先安装 C 编译器。"
|
||||
- sh: pkg-config --exists gtk+-3.0 webkit2gtk-4.1 gdk-3.0 gio-unix-2.0
|
||||
msg: "缺少 Linux GUI 构建依赖,请安装 gtk+-3.0、webkit2gtk-4.1、gdk-3.0 和 gio-unix-2.0 开发包。"
|
||||
cmds:
|
||||
- go build {{.BUILD_FLAGS}} -o "{{.OUTPUT}}"
|
||||
vars:
|
||||
BUILD_FLAGS: '{{if eq .DEV "true"}}{{if .EXTRA_TAGS}}-tags {{.EXTRA_TAGS}} {{end}}-buildvcs=false -gcflags=all="-l" -ldflags="-X cursor/internal/buildinfo.Version={{.APP_VERSION}}"{{else}}-tags production{{if .EXTRA_TAGS}},{{.EXTRA_TAGS}}{{end}} -trimpath -buildvcs=false -ldflags="-w -s -X cursor/internal/buildinfo.Version={{.APP_VERSION}}"{{end}}'
|
||||
BINARY_NAME: '{{.BINARY_NAME | default .APP_NAME}}'
|
||||
DEFAULT_OUTPUT: '{{.BIN_DIR}}/{{.BINARY_NAME}}'
|
||||
OUTPUT: '{{.OUTPUT | default .DEFAULT_OUTPUT}}'
|
||||
env:
|
||||
GOOS: linux
|
||||
CGO_ENABLED: 1
|
||||
GOARCH: '{{.ARCH | default ARCH}}'
|
||||
|
||||
build:docker:
|
||||
summary: 使用 Docker 构建 Linux 程序
|
||||
internal: true
|
||||
dir: '{{.PROJECT_ROOT}}'
|
||||
deps:
|
||||
- task: common:build:frontend
|
||||
vars:
|
||||
BUILD_FLAGS:
|
||||
ref: .BUILD_FLAGS
|
||||
DEV:
|
||||
ref: .DEV
|
||||
SCAN:
|
||||
ref: .SCAN
|
||||
preconditions:
|
||||
- sh: '[ "{{OS}}" = "darwin" ] || [ "{{OS}}" = "linux" ]'
|
||||
msg: "Docker Linux 构建当前仅支持在 macOS 或 Linux 主机上执行。"
|
||||
- sh: docker info >/dev/null 2>&1
|
||||
msg: "未检测到可用的 Docker daemon,请先启动 Docker。"
|
||||
- sh: docker image inspect {{.CROSS_IMAGE}} >/dev/null 2>&1
|
||||
msg: "未找到 Docker 镜像 '{{.CROSS_IMAGE}}',请先执行 task setup:docker。"
|
||||
cmds:
|
||||
- docker run --rm --platform "{{.DOCKER_PLATFORM}}" --entrypoint /bin/sh -v "{{.PROJECT_ROOT}}:/app" {{.GO_CACHE_MOUNT}} {{.REPLACE_MOUNTS}} -e GOPATH=/go -e GOMODCACHE=/go/pkg/mod -e APP_NAME="{{.APP_NAME}}" -e EXTRA_LDFLAGS="-X cursor/internal/buildinfo.Version={{.APP_VERSION}}" -e GO_BUILD_LOG_MODE="{{.GO_BUILD_LOG_MODE}}" {{if .EXTRA_TAGS}}-e EXTRA_TAGS="{{.EXTRA_TAGS}}"{{end}} "{{.CROSS_IMAGE}}" /app/build/docker/build-linux.sh
|
||||
- docker run --rm --platform "{{.DOCKER_PLATFORM}}" --entrypoint chown -v "{{.PROJECT_ROOT}}:/app" "{{.CROSS_IMAGE}}" -R $(id -u):$(id -g) /app/bin
|
||||
- mkdir -p "{{.BIN_DIR}}"
|
||||
- mv "bin/{{.APP_NAME}}-linux-{{.DOCKER_ARCH}}" "{{.OUTPUT}}"
|
||||
vars:
|
||||
DOCKER_ARCH: '{{.ARCH | default "amd64"}}'
|
||||
DOCKER_PLATFORM: 'linux/{{.DOCKER_ARCH}}'
|
||||
DEFAULT_OUTPUT: '{{.BIN_DIR}}/{{.APP_NAME}}'
|
||||
GO_BUILD_LOG_MODE: '{{.GO_BUILD_LOG_MODE | default "quiet"}}'
|
||||
OUTPUT: '{{.OUTPUT | default .DEFAULT_OUTPUT}}'
|
||||
GO_CACHE_MOUNT:
|
||||
sh: 'echo "-v ${GOPATH:-$HOME/go}/pkg/mod:/go/pkg/mod"'
|
||||
REPLACE_MOUNTS:
|
||||
sh: |
|
||||
grep -E '^replace .* => ' go.mod 2>/dev/null | while read -r line; do
|
||||
path=$(echo "$line" | sed -E 's/^replace .* => //' | tr -d '\r')
|
||||
if [ "${path#/}" = "$path" ]; then
|
||||
path="$(cd "$(dirname "$path")" 2>/dev/null && pwd)/$(basename "$path")"
|
||||
fi
|
||||
if [ -d "$path" ]; then
|
||||
echo "-v $path:$path:ro"
|
||||
fi
|
||||
done | tr '\n' ' '
|
||||
|
||||
package:archive:
|
||||
summary: 打包 Linux updater 归档(.tar.gz)
|
||||
internal: true
|
||||
cmds:
|
||||
- task: build
|
||||
vars:
|
||||
ARCH:
|
||||
ref: .ARCH
|
||||
OUTPUT:
|
||||
ref: .OUTPUT
|
||||
BINARY_NAME:
|
||||
ref: .BINARY_NAME
|
||||
BUILD_FLAGS:
|
||||
ref: .BUILD_FLAGS
|
||||
EXTRA_TAGS:
|
||||
ref: .EXTRA_TAGS
|
||||
DEV:
|
||||
ref: .DEV
|
||||
SCAN:
|
||||
ref: .SCAN
|
||||
- task: create:archive
|
||||
vars:
|
||||
OUTPUT:
|
||||
ref: .OUTPUT
|
||||
ARCHIVE_BINARY_NAME:
|
||||
ref: .ARCHIVE_BINARY_NAME
|
||||
ARCHIVE_PATH:
|
||||
ref: .ARCHIVE_PATH
|
||||
ARCH:
|
||||
ref: .ARCH
|
||||
- task: cleanup:package:artifacts
|
||||
vars:
|
||||
OUTPUT:
|
||||
ref: .OUTPUT
|
||||
BINARY_NAME:
|
||||
ref: .BINARY_NAME
|
||||
|
||||
create:archive:
|
||||
summary: 生成 Linux updater tar.gz 归档
|
||||
internal: true
|
||||
vars:
|
||||
BINARY_NAME: '{{.BINARY_NAME | default .APP_NAME}}'
|
||||
BINARY_PATH: '{{.OUTPUT | default (printf "%s/%s" .BIN_DIR .BINARY_NAME)}}'
|
||||
ARCHIVE_BINARY_NAME: '{{.ARCHIVE_BINARY_NAME | default .APP_NAME}}'
|
||||
ARCHIVE_PATH: '{{.ARCHIVE_PATH | default (printf "%s/%s.tar.gz" .BIN_DIR .APP_NAME)}}'
|
||||
STAGING_DIR: '{{.BIN_DIR}}/.linux-archive-{{.ARCH | default ARCH}}'
|
||||
cmds:
|
||||
- rm -rf "{{.STAGING_DIR}}"
|
||||
- mkdir -p "{{.STAGING_DIR}}"
|
||||
- cp "{{.BINARY_PATH}}" "{{.STAGING_DIR}}/{{.ARCHIVE_BINARY_NAME}}"
|
||||
- chmod +x "{{.STAGING_DIR}}/{{.ARCHIVE_BINARY_NAME}}"
|
||||
- rm -f "{{.ARCHIVE_PATH}}"
|
||||
- env LC_ALL=C tar -C "{{.STAGING_DIR}}" -czf "{{.ARCHIVE_PATH}}" "{{.ARCHIVE_BINARY_NAME}}"
|
||||
- rm -rf "{{.STAGING_DIR}}"
|
||||
|
||||
cleanup:package:artifacts:
|
||||
summary: 清理 Linux 打包中间产物
|
||||
internal: true
|
||||
vars:
|
||||
BINARY_NAME: '{{.BINARY_NAME | default .APP_NAME}}'
|
||||
BINARY_PATH: '{{.OUTPUT | default (printf "%s/%s" .BIN_DIR .BINARY_NAME)}}'
|
||||
cmds:
|
||||
- rm -f "{{.BINARY_PATH}}"
|
||||
|
||||
run:
|
||||
summary: 运行 Linux 可执行文件
|
||||
vars:
|
||||
OUTPUT: '{{.OUTPUT | default (printf "%s/%s" .BIN_DIR .APP_NAME)}}'
|
||||
preconditions:
|
||||
- sh: '[ "{{OS}}" = "linux" ]'
|
||||
msg: "Linux 运行任务仅支持在 Linux 主机上执行。"
|
||||
cmds:
|
||||
- '{{.OUTPUT}}'
|
||||
@@ -0,0 +1,13 @@
|
||||
[Desktop Entry]
|
||||
Version=1.0
|
||||
Name=Cursor助手
|
||||
Comment=Cursor助手
|
||||
# The Exec line includes %u to pass the URL to the application
|
||||
Exec=/usr/local/bin/Cursor助手 %u
|
||||
Terminal=false
|
||||
Type=Application
|
||||
Icon=Cursor助手
|
||||
Categories=Utility;
|
||||
StartupWMClass=Cursor助手
|
||||
|
||||
|
||||
@@ -0,0 +1,67 @@
|
||||
# Feel free to remove those if you don't want/need to use them.
|
||||
# Make sure to check the documentation at https://nfpm.goreleaser.com
|
||||
#
|
||||
# The lines below are called `modelines`. See `:help modeline`
|
||||
|
||||
name: "Cursor助手"
|
||||
arch: ${GOARCH}
|
||||
platform: "linux"
|
||||
version: "0.0.38"
|
||||
section: "default"
|
||||
priority: "extra"
|
||||
maintainer: ${GIT_COMMITTER_NAME} <${GIT_COMMITTER_EMAIL}>
|
||||
description: "Cursor助手"
|
||||
vendor: "Cursor助手"
|
||||
homepage: "https://wails.io"
|
||||
license: "MIT"
|
||||
release: "1"
|
||||
|
||||
contents:
|
||||
- src: "./bin/Cursor助手"
|
||||
dst: "/usr/local/bin/Cursor助手"
|
||||
- src: "./build/appicon.png"
|
||||
dst: "/usr/share/icons/hicolor/128x128/apps/Cursor助手.png"
|
||||
- src: "./build/linux/Cursor助手.desktop"
|
||||
dst: "/usr/share/applications/Cursor助手.desktop"
|
||||
|
||||
# Default dependencies for Debian 12/Ubuntu 22.04+ with WebKit 4.1
|
||||
depends:
|
||||
- libgtk-3-0
|
||||
- libwebkit2gtk-4.1-0
|
||||
|
||||
# Distribution-specific overrides for different package formats and WebKit versions
|
||||
overrides:
|
||||
# RPM packages for RHEL/CentOS/AlmaLinux/Rocky Linux (WebKit 4.0)
|
||||
rpm:
|
||||
depends:
|
||||
- gtk3
|
||||
- webkit2gtk4.1
|
||||
|
||||
# Arch Linux packages (WebKit 4.1)
|
||||
archlinux:
|
||||
depends:
|
||||
- gtk3
|
||||
- webkit2gtk-4.1
|
||||
|
||||
# scripts section to ensure desktop database is updated after install
|
||||
scripts:
|
||||
postinstall: "./build/linux/nfpm/scripts/postinstall.sh"
|
||||
# You can also add preremove, postremove if needed
|
||||
# preremove: "./build/linux/nfpm/scripts/preremove.sh"
|
||||
# postremove: "./build/linux/nfpm/scripts/postremove.sh"
|
||||
|
||||
# replaces:
|
||||
# - foobar
|
||||
# provides:
|
||||
# - bar
|
||||
# depends:
|
||||
# - gtk3
|
||||
# - libwebkit2gtk
|
||||
# recommends:
|
||||
# - whatever
|
||||
# suggests:
|
||||
# - something-else
|
||||
# conflicts:
|
||||
# - not-foo
|
||||
# - not-bar
|
||||
# changelog: "changelog.yaml"
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 26 KiB |
@@ -0,0 +1,156 @@
|
||||
version: "3"
|
||||
|
||||
includes:
|
||||
common: ../Taskfile.yml
|
||||
|
||||
tasks:
|
||||
build:
|
||||
summary: 构建 Windows 程序
|
||||
internal: true
|
||||
cmds:
|
||||
- task: build:native
|
||||
vars:
|
||||
ARCH:
|
||||
ref: .ARCH
|
||||
OUTPUT:
|
||||
ref: .OUTPUT
|
||||
BUILD_FLAGS:
|
||||
ref: .BUILD_FLAGS
|
||||
EXTRA_TAGS:
|
||||
ref: .EXTRA_TAGS
|
||||
DEV:
|
||||
ref: .DEV
|
||||
SCAN:
|
||||
ref: .SCAN
|
||||
|
||||
build:native:
|
||||
summary: 使用 Go 原生交叉编译构建 Windows 程序
|
||||
internal: true
|
||||
deps:
|
||||
- task: common:go:mod:tidy
|
||||
- task: common:build:frontend
|
||||
vars:
|
||||
BUILD_FLAGS:
|
||||
ref: .BUILD_FLAGS
|
||||
DEV:
|
||||
ref: .DEV
|
||||
SCAN:
|
||||
ref: .SCAN
|
||||
- task: common:generate:icons
|
||||
cmds:
|
||||
- task: generate:syso
|
||||
vars:
|
||||
ARCH:
|
||||
ref: .ARCH
|
||||
- go build {{.BUILD_FLAGS}} -o "{{.OUTPUT}}"
|
||||
- cmd: powershell Remove-item *.syso
|
||||
platforms: [windows]
|
||||
- cmd: rm -f *.syso
|
||||
platforms: [darwin, linux]
|
||||
vars:
|
||||
OUTPUT: '{{.OUTPUT | default (printf "%s/%s.exe" .BIN_DIR .APP_NAME)}}'
|
||||
BUILD_FLAGS: '{{if eq .DEV "true"}}{{if .EXTRA_TAGS}}-tags {{.EXTRA_TAGS}} {{end}}-buildvcs=false -gcflags=all="-l" -ldflags="-X cursor/internal/buildinfo.Version={{.APP_VERSION}}"{{else}}-tags production{{if .EXTRA_TAGS}},{{.EXTRA_TAGS}}{{end}} -trimpath -buildvcs=false -ldflags="-w -s -H windowsgui -X cursor/internal/buildinfo.Version={{.APP_VERSION}}"{{end}}'
|
||||
env:
|
||||
GOOS: windows
|
||||
CGO_ENABLED: 0
|
||||
GOARCH: '{{.ARCH | default ARCH}}'
|
||||
|
||||
package:
|
||||
summary: 打包 Windows 安装程序
|
||||
internal: true
|
||||
cmds:
|
||||
- task: '{{if eq (.FORMAT | default "nsis") "msix"}}create:msix:package{{else}}create:nsis:installer{{end}}'
|
||||
vars:
|
||||
FORMAT: '{{.FORMAT | default "nsis"}}'
|
||||
|
||||
generate:syso:
|
||||
summary: 生成 Windows 图标与版本信息资源
|
||||
internal: true
|
||||
dir: build
|
||||
cmds:
|
||||
- wails3 generate syso -arch {{.ARCH}} -icon windows/icon.ico -manifest windows/wails.exe.manifest -info windows/info.json -out ../wails_windows_{{.ARCH}}.syso
|
||||
vars:
|
||||
ARCH: '{{.ARCH | default ARCH}}'
|
||||
|
||||
create:nsis:installer:
|
||||
summary: 生成 NSIS 安装包
|
||||
internal: true
|
||||
dir: build/windows/nsis
|
||||
deps:
|
||||
- task: build
|
||||
vars:
|
||||
SCAN:
|
||||
ref: .SCAN
|
||||
cmds:
|
||||
- wails3 generate webview2bootstrapper -dir "{{.ROOT_DIR}}/build/windows/nsis"
|
||||
- |
|
||||
{{if eq OS "windows"}}
|
||||
makensis -DARG_WAILS_{{.ARG_FLAG}}_BINARY="{{.ROOT_DIR}}\{{.BIN_DIR}}\{{.APP_NAME}}.exe" project.nsi
|
||||
{{else}}
|
||||
makensis -DARG_WAILS_{{.ARG_FLAG}}_BINARY="{{.ROOT_DIR}}/{{.BIN_DIR}}/{{.APP_NAME}}.exe" project.nsi
|
||||
{{end}}
|
||||
vars:
|
||||
ARCH: '{{.ARCH | default ARCH}}'
|
||||
ARG_FLAG: '{{if eq .ARCH "amd64"}}AMD64{{else}}ARM64{{end}}'
|
||||
|
||||
create:msix:package:
|
||||
summary: 生成 MSIX 安装包
|
||||
internal: true
|
||||
deps:
|
||||
- task: build
|
||||
vars:
|
||||
SCAN:
|
||||
ref: .SCAN
|
||||
cmds:
|
||||
- |-
|
||||
wails3 tool msix \
|
||||
--config "{{.ROOT_DIR}}/wails.json" \
|
||||
--name "{{.APP_NAME}}" \
|
||||
--executable "{{.ROOT_DIR}}/{{.BIN_DIR}}/{{.APP_NAME}}.exe" \
|
||||
--arch "{{.ARCH}}" \
|
||||
--out "{{.ROOT_DIR}}/{{.BIN_DIR}}/{{.APP_NAME}}-{{.ARCH}}.msix" \
|
||||
{{if .CERT_PATH}}--cert "{{.CERT_PATH}}"{{end}} \
|
||||
{{if .PUBLISHER}}--publisher "{{.PUBLISHER}}"{{end}} \
|
||||
{{if .USE_MSIX_TOOL}}--use-msix-tool{{else}}--use-makeappx{{end}}
|
||||
vars:
|
||||
ARCH: '{{.ARCH | default ARCH}}'
|
||||
CERT_PATH: '{{.CERT_PATH | default ""}}'
|
||||
PUBLISHER: '{{.PUBLISHER | default ""}}'
|
||||
USE_MSIX_TOOL: '{{.USE_MSIX_TOOL | default "false"}}'
|
||||
|
||||
create:zip:
|
||||
summary: 生成 Windows ZIP 包(包含 exe 与 certs)
|
||||
internal: true
|
||||
vars:
|
||||
ARCH: '{{.ARCH | default ARCH}}'
|
||||
OUTPUT: '{{.OUTPUT | default (printf "%s/%s.exe" .BIN_DIR .APP_NAME)}}'
|
||||
ZIP_NAME: '{{.ZIP_NAME | default (printf "%s-windows-%s.zip" .APP_NAME .ARCH)}}'
|
||||
STAGING_DIR: '{{.BIN_DIR}}/.zip-{{.ARCH}}'
|
||||
cmds:
|
||||
- task: build
|
||||
vars:
|
||||
ARCH:
|
||||
ref: .ARCH
|
||||
OUTPUT:
|
||||
ref: .OUTPUT
|
||||
BUILD_FLAGS:
|
||||
ref: .BUILD_FLAGS
|
||||
EXTRA_TAGS:
|
||||
ref: .EXTRA_TAGS
|
||||
DEV:
|
||||
ref: .DEV
|
||||
SCAN:
|
||||
ref: .SCAN
|
||||
- rm -rf "{{.STAGING_DIR}}"
|
||||
- mkdir -p "{{.STAGING_DIR}}"
|
||||
- cp "{{.OUTPUT}}" "{{.STAGING_DIR}}/"
|
||||
- (cd "{{.STAGING_DIR}}" && zip -qry "../{{.ZIP_NAME}}" .)
|
||||
- rm -rf "{{.STAGING_DIR}}"
|
||||
- rm -f "{{.OUTPUT}}"
|
||||
|
||||
run:
|
||||
summary: 运行 Windows 可执行文件(仅在 Windows 可用)
|
||||
vars:
|
||||
OUTPUT: '{{.OUTPUT | default (printf "%s/%s.exe" .BIN_DIR .APP_NAME)}}'
|
||||
cmds:
|
||||
- '{{.OUTPUT}}'
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 29 KiB |
@@ -0,0 +1,15 @@
|
||||
{
|
||||
"fixed": {
|
||||
"file_version": "0.0.38"
|
||||
},
|
||||
"info": {
|
||||
"0000": {
|
||||
"ProductVersion": "0.0.38",
|
||||
"CompanyName": "Cursor助手",
|
||||
"FileDescription": "Cursor助手",
|
||||
"LegalCopyright": "© 2026, Cursor助手",
|
||||
"ProductName": "Cursor助手",
|
||||
"Comments": "Cursor助手"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,55 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Package
|
||||
xmlns="http://schemas.microsoft.com/appx/manifest/foundation/windows10"
|
||||
xmlns:uap="http://schemas.microsoft.com/appx/manifest/uap/windows10"
|
||||
xmlns:uap3="http://schemas.microsoft.com/appx/manifest/uap/windows10/3"
|
||||
xmlns:rescap="http://schemas.microsoft.com/appx/manifest/foundation/windows10/restrictedcapabilities"
|
||||
xmlns:desktop="http://schemas.microsoft.com/appx/manifest/desktop/windows10"
|
||||
IgnorableNamespaces="uap3">
|
||||
|
||||
<Identity
|
||||
Name="com.cursor.wuxianxubei"
|
||||
Publisher="CN=Cursor助手"
|
||||
Version="0.1.0.0"
|
||||
ProcessorArchitecture="x64" />
|
||||
|
||||
<Properties>
|
||||
<DisplayName>Cursor助手</DisplayName>
|
||||
<PublisherDisplayName>Cursor助手</PublisherDisplayName>
|
||||
<Description>Cursor助手</Description>
|
||||
<Logo>Assets\StoreLogo.png</Logo>
|
||||
</Properties>
|
||||
|
||||
<Dependencies>
|
||||
<TargetDeviceFamily Name="Windows.Desktop" MinVersion="10.0.17763.0" MaxVersionTested="10.0.19041.0" />
|
||||
</Dependencies>
|
||||
|
||||
<Resources>
|
||||
<Resource Language="zh-cn" />
|
||||
</Resources>
|
||||
|
||||
<Applications>
|
||||
<Application Id="com.cursor.wuxianxubei" Executable="Cursor助手" EntryPoint="Windows.FullTrustApplication">
|
||||
<uap:VisualElements
|
||||
DisplayName="Cursor助手"
|
||||
Description="本地 MITM 代理客户端,支持中转转发与托盘控制"
|
||||
BackgroundColor="transparent"
|
||||
Square150x150Logo="Assets\Square150x150Logo.png"
|
||||
Square44x44Logo="Assets\Square44x44Logo.png">
|
||||
<uap:DefaultTile Wide310x150Logo="Assets\Wide310x150Logo.png" />
|
||||
<uap:SplashScreen Image="Assets\SplashScreen.png" />
|
||||
</uap:VisualElements>
|
||||
|
||||
<Extensions>
|
||||
<desktop:Extension Category="windows.fullTrustProcess" Executable="Cursor助手" />
|
||||
|
||||
|
||||
</Extensions>
|
||||
</Application>
|
||||
</Applications>
|
||||
|
||||
<Capabilities>
|
||||
<rescap:Capability Name="runFullTrust" />
|
||||
|
||||
</Capabilities>
|
||||
</Package>
|
||||
@@ -0,0 +1,54 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<MsixPackagingToolTemplate
|
||||
xmlns="http://schemas.microsoft.com/msix/packaging/msixpackagingtool/template/2022">
|
||||
<Settings
|
||||
AllowTelemetry="false"
|
||||
ApplyACLsToPackageFiles="true"
|
||||
GenerateCommandLineFile="true"
|
||||
AllowPromptForPassword="false">
|
||||
</Settings>
|
||||
<Installer
|
||||
Path="Cursor助手"
|
||||
Arguments=""
|
||||
InstallLocation="C:\Program Files\Cursor助手\Cursor助手">
|
||||
</Installer>
|
||||
<PackageInformation
|
||||
PackageName="Cursor助手"
|
||||
PackageDisplayName="Cursor助手"
|
||||
PublisherName="CN=Cursor助手"
|
||||
PublisherDisplayName="Cursor助手"
|
||||
Version="0.1.0.0"
|
||||
PackageDescription="Cursor助手">
|
||||
<Capabilities>
|
||||
<Capability Name="runFullTrust" />
|
||||
|
||||
</Capabilities>
|
||||
<Applications>
|
||||
<Application
|
||||
Id="com.cursor.wuxianxubei"
|
||||
Description="Cursor助手"
|
||||
DisplayName="Cursor助手"
|
||||
ExecutableName="Cursor助手"
|
||||
EntryPoint="Windows.FullTrustApplication">
|
||||
|
||||
</Application>
|
||||
</Applications>
|
||||
<Resources>
|
||||
<Resource Language="en-us" />
|
||||
</Resources>
|
||||
<Dependencies>
|
||||
<TargetDeviceFamily Name="Windows.Desktop" MinVersion="10.0.17763.0" MaxVersionTested="10.0.19041.0" />
|
||||
</Dependencies>
|
||||
<Properties>
|
||||
<Framework>false</Framework>
|
||||
<DisplayName>Cursor助手</DisplayName>
|
||||
<PublisherDisplayName>Cursor助手</PublisherDisplayName>
|
||||
<Description>Cursor助手</Description>
|
||||
<Logo>Assets\AppIcon.png</Logo>
|
||||
</Properties>
|
||||
</PackageInformation>
|
||||
<SaveLocation PackagePath="Cursor助手.msix" />
|
||||
<PackageIntegrity>
|
||||
<CertificatePath></CertificatePath>
|
||||
</PackageIntegrity>
|
||||
</MsixPackagingToolTemplate>
|
||||
Binary file not shown.
@@ -0,0 +1,116 @@
|
||||
Unicode true
|
||||
|
||||
####
|
||||
## Please note: Template replacements don't work in this file. They are provided with default defines like
|
||||
## mentioned underneath.
|
||||
## If the keyword is not defined, "wails_tools.nsh" will populate them.
|
||||
## If they are defined here, "wails_tools.nsh" will not touch them. This allows you to use this project.nsi manually
|
||||
## from outside of Wails for debugging and development of the installer.
|
||||
##
|
||||
## For development first make a wails nsis build to populate the "wails_tools.nsh":
|
||||
## > wails build --target windows/amd64 --nsis
|
||||
## Then you can call makensis on this file with specifying the path to your binary:
|
||||
## For a AMD64 only installer:
|
||||
## > makensis -DARG_WAILS_AMD64_BINARY=..\..\bin\app.exe
|
||||
## For a ARM64 only installer:
|
||||
## > makensis -DARG_WAILS_ARM64_BINARY=..\..\bin\app.exe
|
||||
## For a installer with both architectures:
|
||||
## > makensis -DARG_WAILS_AMD64_BINARY=..\..\bin\app-amd64.exe -DARG_WAILS_ARM64_BINARY=..\..\bin\app-arm64.exe
|
||||
####
|
||||
## The following information is taken from the wails_tools.nsh file, but they can be overwritten here.
|
||||
####
|
||||
## !define INFO_PROJECTNAME "my-project" # Default "cursorclient"
|
||||
## !define INFO_COMPANYNAME "My Company" # Default "My Company"
|
||||
## !define INFO_PRODUCTNAME "My Product Name" # Default "My Product"
|
||||
## !define INFO_PRODUCTVERSION "1.0.0" # Default "0.1.0"
|
||||
## !define INFO_COPYRIGHT "(c) Now, My Company" # Default "© 2026, My Company"
|
||||
###
|
||||
## !define PRODUCT_EXECUTABLE "Application.exe" # Default "${INFO_PROJECTNAME}.exe"
|
||||
## !define UNINST_KEY_NAME "UninstKeyInRegistry" # Default "${INFO_COMPANYNAME}${INFO_PRODUCTNAME}"
|
||||
####
|
||||
## !define REQUEST_EXECUTION_LEVEL "admin" # Default "admin" see also https://nsis.sourceforge.io/Docs/Chapter4.html
|
||||
####
|
||||
## Include the wails tools
|
||||
####
|
||||
!include "wails_tools.nsh"
|
||||
|
||||
# The version information for this two must consist of 4 parts
|
||||
VIProductVersion "${INFO_PRODUCTVERSION}.0"
|
||||
VIFileVersion "${INFO_PRODUCTVERSION}.0"
|
||||
|
||||
VIAddVersionKey "CompanyName" "${INFO_COMPANYNAME}"
|
||||
VIAddVersionKey "FileDescription" "${INFO_PRODUCTNAME} Installer"
|
||||
VIAddVersionKey "ProductVersion" "${INFO_PRODUCTVERSION}"
|
||||
VIAddVersionKey "FileVersion" "${INFO_PRODUCTVERSION}"
|
||||
VIAddVersionKey "LegalCopyright" "${INFO_COPYRIGHT}"
|
||||
VIAddVersionKey "ProductName" "${INFO_PRODUCTNAME}"
|
||||
|
||||
# Enable HiDPI support. https://nsis.sourceforge.io/Reference/ManifestDPIAware
|
||||
ManifestDPIAware true
|
||||
|
||||
!include "MUI.nsh"
|
||||
|
||||
!define MUI_ICON "..\icon.ico"
|
||||
!define MUI_UNICON "..\icon.ico"
|
||||
# !define MUI_WELCOMEFINISHPAGE_BITMAP "resources\leftimage.bmp" #Include this to add a bitmap on the left side of the Welcome Page. Must be a size of 164x314
|
||||
!define MUI_FINISHPAGE_NOAUTOCLOSE # Wait on the INSTFILES page so the user can take a look into the details of the installation steps
|
||||
!define MUI_ABORTWARNING # This will warn the user if they exit from the installer.
|
||||
|
||||
!insertmacro MUI_PAGE_WELCOME # Welcome to the installer page.
|
||||
# !insertmacro MUI_PAGE_LICENSE "resources\eula.txt" # Adds a EULA page to the installer
|
||||
!insertmacro MUI_PAGE_DIRECTORY # In which folder install page.
|
||||
!insertmacro MUI_PAGE_INSTFILES # Installing page.
|
||||
!insertmacro MUI_PAGE_FINISH # Finished installation page.
|
||||
|
||||
!insertmacro MUI_UNPAGE_INSTFILES # Uninstalling page
|
||||
|
||||
!insertmacro MUI_LANGUAGE "English" # Set the Language of the installer
|
||||
|
||||
## The following two statements can be used to sign the installer and the uninstaller. The path to the binaries are provided in %1
|
||||
#!uninstfinalize 'signtool --file "%1"'
|
||||
#!finalize 'signtool --file "%1"'
|
||||
|
||||
Name "${INFO_PRODUCTNAME}"
|
||||
OutFile "..\..\..\bin\${INFO_PROJECTNAME}-${ARCH}-installer.exe" # Name of the installer's file.
|
||||
InstallDir "$PROGRAMFILES64\${INFO_COMPANYNAME}\${INFO_PRODUCTNAME}" # Default installing folder ($PROGRAMFILES is Program Files folder).
|
||||
ShowInstDetails show # This will always show the installation details.
|
||||
|
||||
Function .onInit
|
||||
!insertmacro wails.checkArchitecture
|
||||
FunctionEnd
|
||||
|
||||
Section
|
||||
!insertmacro wails.setShellContext
|
||||
|
||||
!insertmacro wails.webview2runtime
|
||||
|
||||
SetOutPath $INSTDIR
|
||||
|
||||
!insertmacro wails.files
|
||||
|
||||
SetOutPath $INSTDIR
|
||||
|
||||
CreateShortcut "$SMPROGRAMS\${INFO_PRODUCTNAME}.lnk" "$INSTDIR\${PRODUCT_EXECUTABLE}"
|
||||
CreateShortCut "$DESKTOP\${INFO_PRODUCTNAME}.lnk" "$INSTDIR\${PRODUCT_EXECUTABLE}"
|
||||
|
||||
!insertmacro wails.associateFiles
|
||||
!insertmacro wails.associateCustomProtocols
|
||||
|
||||
!insertmacro wails.writeUninstaller
|
||||
SectionEnd
|
||||
|
||||
Section "uninstall"
|
||||
!insertmacro wails.setShellContext
|
||||
|
||||
RMDir /r "$AppData\${PRODUCT_EXECUTABLE}" # Remove the WebView2 DataPath
|
||||
|
||||
RMDir /r $INSTDIR
|
||||
|
||||
Delete "$SMPROGRAMS\${INFO_PRODUCTNAME}.lnk"
|
||||
Delete "$DESKTOP\${INFO_PRODUCTNAME}.lnk"
|
||||
|
||||
!insertmacro wails.unassociateFiles
|
||||
!insertmacro wails.unassociateCustomProtocols
|
||||
|
||||
!insertmacro wails.deleteUninstaller
|
||||
SectionEnd
|
||||
@@ -0,0 +1,236 @@
|
||||
# DO NOT EDIT - Generated automatically by `wails build`
|
||||
|
||||
!include "x64.nsh"
|
||||
!include "WinVer.nsh"
|
||||
!include "FileFunc.nsh"
|
||||
|
||||
!ifndef INFO_PROJECTNAME
|
||||
!define INFO_PROJECTNAME "Cursor助手"
|
||||
!endif
|
||||
!ifndef INFO_COMPANYNAME
|
||||
!define INFO_COMPANYNAME "Cursor助手"
|
||||
!endif
|
||||
!ifndef INFO_PRODUCTNAME
|
||||
!define INFO_PRODUCTNAME "Cursor助手"
|
||||
!endif
|
||||
!ifndef INFO_PRODUCTVERSION
|
||||
!define INFO_PRODUCTVERSION "0.0.38"
|
||||
!endif
|
||||
!ifndef INFO_COPYRIGHT
|
||||
!define INFO_COPYRIGHT "© 2026, Cursor助手"
|
||||
!endif
|
||||
!ifndef PRODUCT_EXECUTABLE
|
||||
!define PRODUCT_EXECUTABLE "${INFO_PROJECTNAME}.exe"
|
||||
!endif
|
||||
!ifndef UNINST_KEY_NAME
|
||||
!define UNINST_KEY_NAME "${INFO_COMPANYNAME}${INFO_PRODUCTNAME}"
|
||||
!endif
|
||||
!define UNINST_KEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\${UNINST_KEY_NAME}"
|
||||
|
||||
!ifndef REQUEST_EXECUTION_LEVEL
|
||||
!define REQUEST_EXECUTION_LEVEL "admin"
|
||||
!endif
|
||||
|
||||
RequestExecutionLevel "${REQUEST_EXECUTION_LEVEL}"
|
||||
|
||||
!ifdef ARG_WAILS_AMD64_BINARY
|
||||
!define SUPPORTS_AMD64
|
||||
!endif
|
||||
|
||||
!ifdef ARG_WAILS_ARM64_BINARY
|
||||
!define SUPPORTS_ARM64
|
||||
!endif
|
||||
|
||||
!ifdef SUPPORTS_AMD64
|
||||
!ifdef SUPPORTS_ARM64
|
||||
!define ARCH "amd64_arm64"
|
||||
!else
|
||||
!define ARCH "amd64"
|
||||
!endif
|
||||
!else
|
||||
!ifdef SUPPORTS_ARM64
|
||||
!define ARCH "arm64"
|
||||
!else
|
||||
!error "Wails: Undefined ARCH, please provide at least one of ARG_WAILS_AMD64_BINARY or ARG_WAILS_ARM64_BINARY"
|
||||
!endif
|
||||
!endif
|
||||
|
||||
!macro wails.checkArchitecture
|
||||
!ifndef WAILS_WIN10_REQUIRED
|
||||
!define WAILS_WIN10_REQUIRED "This product is only supported on Windows 10 (Server 2016) and later."
|
||||
!endif
|
||||
|
||||
!ifndef WAILS_ARCHITECTURE_NOT_SUPPORTED
|
||||
!define WAILS_ARCHITECTURE_NOT_SUPPORTED "This product can't be installed on the current Windows architecture. Supports: ${ARCH}"
|
||||
!endif
|
||||
|
||||
${If} ${AtLeastWin10}
|
||||
!ifdef SUPPORTS_AMD64
|
||||
${if} ${IsNativeAMD64}
|
||||
Goto ok
|
||||
${EndIf}
|
||||
!endif
|
||||
|
||||
!ifdef SUPPORTS_ARM64
|
||||
${if} ${IsNativeARM64}
|
||||
Goto ok
|
||||
${EndIf}
|
||||
!endif
|
||||
|
||||
IfSilent silentArch notSilentArch
|
||||
silentArch:
|
||||
SetErrorLevel 65
|
||||
Abort
|
||||
notSilentArch:
|
||||
MessageBox MB_OK "${WAILS_ARCHITECTURE_NOT_SUPPORTED}"
|
||||
Quit
|
||||
${else}
|
||||
IfSilent silentWin notSilentWin
|
||||
silentWin:
|
||||
SetErrorLevel 64
|
||||
Abort
|
||||
notSilentWin:
|
||||
MessageBox MB_OK "${WAILS_WIN10_REQUIRED}"
|
||||
Quit
|
||||
${EndIf}
|
||||
|
||||
ok:
|
||||
!macroend
|
||||
|
||||
!macro wails.files
|
||||
!ifdef SUPPORTS_AMD64
|
||||
${if} ${IsNativeAMD64}
|
||||
File "/oname=${PRODUCT_EXECUTABLE}" "${ARG_WAILS_AMD64_BINARY}"
|
||||
${EndIf}
|
||||
!endif
|
||||
|
||||
!ifdef SUPPORTS_ARM64
|
||||
${if} ${IsNativeARM64}
|
||||
File "/oname=${PRODUCT_EXECUTABLE}" "${ARG_WAILS_ARM64_BINARY}"
|
||||
${EndIf}
|
||||
!endif
|
||||
!macroend
|
||||
|
||||
!macro wails.writeUninstaller
|
||||
WriteUninstaller "$INSTDIR\uninstall.exe"
|
||||
|
||||
SetRegView 64
|
||||
WriteRegStr HKLM "${UNINST_KEY}" "Publisher" "${INFO_COMPANYNAME}"
|
||||
WriteRegStr HKLM "${UNINST_KEY}" "DisplayName" "${INFO_PRODUCTNAME}"
|
||||
WriteRegStr HKLM "${UNINST_KEY}" "DisplayVersion" "${INFO_PRODUCTVERSION}"
|
||||
WriteRegStr HKLM "${UNINST_KEY}" "DisplayIcon" "$INSTDIR\${PRODUCT_EXECUTABLE}"
|
||||
WriteRegStr HKLM "${UNINST_KEY}" "UninstallString" "$\"$INSTDIR\uninstall.exe$\""
|
||||
WriteRegStr HKLM "${UNINST_KEY}" "QuietUninstallString" "$\"$INSTDIR\uninstall.exe$\" /S"
|
||||
|
||||
${GetSize} "$INSTDIR" "/S=0K" $0 $1 $2
|
||||
IntFmt $0 "0x%08X" $0
|
||||
WriteRegDWORD HKLM "${UNINST_KEY}" "EstimatedSize" "$0"
|
||||
!macroend
|
||||
|
||||
!macro wails.deleteUninstaller
|
||||
Delete "$INSTDIR\uninstall.exe"
|
||||
|
||||
SetRegView 64
|
||||
DeleteRegKey HKLM "${UNINST_KEY}"
|
||||
!macroend
|
||||
|
||||
!macro wails.setShellContext
|
||||
${If} ${REQUEST_EXECUTION_LEVEL} == "admin"
|
||||
SetShellVarContext all
|
||||
${else}
|
||||
SetShellVarContext current
|
||||
${EndIf}
|
||||
!macroend
|
||||
|
||||
# Install webview2 by launching the bootstrapper
|
||||
# See https://docs.microsoft.com/en-us/microsoft-edge/webview2/concepts/distribution#online-only-deployment
|
||||
!macro wails.webview2runtime
|
||||
!ifndef WAILS_INSTALL_WEBVIEW_DETAILPRINT
|
||||
!define WAILS_INSTALL_WEBVIEW_DETAILPRINT "Installing: WebView2 Runtime"
|
||||
!endif
|
||||
|
||||
SetRegView 64
|
||||
# If the admin key exists and is not empty then webview2 is already installed
|
||||
ReadRegStr $0 HKLM "SOFTWARE\WOW6432Node\Microsoft\EdgeUpdate\Clients\{F3017226-FE2A-4295-8BDF-00C3A9A7E4C5}" "pv"
|
||||
${If} $0 != ""
|
||||
Goto ok
|
||||
${EndIf}
|
||||
|
||||
${If} ${REQUEST_EXECUTION_LEVEL} == "user"
|
||||
# If the installer is run in user level, check the user specific key exists and is not empty then webview2 is already installed
|
||||
ReadRegStr $0 HKCU "Software\Microsoft\EdgeUpdate\Clients\{F3017226-FE2A-4295-8BDF-00C3A9A7E4C5}" "pv"
|
||||
${If} $0 != ""
|
||||
Goto ok
|
||||
${EndIf}
|
||||
${EndIf}
|
||||
|
||||
SetDetailsPrint both
|
||||
DetailPrint "${WAILS_INSTALL_WEBVIEW_DETAILPRINT}"
|
||||
SetDetailsPrint listonly
|
||||
|
||||
InitPluginsDir
|
||||
CreateDirectory "$pluginsdir\webview2bootstrapper"
|
||||
SetOutPath "$pluginsdir\webview2bootstrapper"
|
||||
File "MicrosoftEdgeWebview2Setup.exe"
|
||||
ExecWait '"$pluginsdir\webview2bootstrapper\MicrosoftEdgeWebview2Setup.exe" /silent /install'
|
||||
|
||||
SetDetailsPrint both
|
||||
ok:
|
||||
!macroend
|
||||
|
||||
# Copy of APP_ASSOCIATE and APP_UNASSOCIATE macros from here https://gist.github.com/nikku/281d0ef126dbc215dd58bfd5b3a5cd5b
|
||||
!macro APP_ASSOCIATE EXT FILECLASS DESCRIPTION ICON COMMANDTEXT COMMAND
|
||||
; Backup the previously associated file class
|
||||
ReadRegStr $R0 SHELL_CONTEXT "Software\Classes\.${EXT}" ""
|
||||
WriteRegStr SHELL_CONTEXT "Software\Classes\.${EXT}" "${FILECLASS}_backup" "$R0"
|
||||
|
||||
WriteRegStr SHELL_CONTEXT "Software\Classes\.${EXT}" "" "${FILECLASS}"
|
||||
|
||||
WriteRegStr SHELL_CONTEXT "Software\Classes\${FILECLASS}" "" `${DESCRIPTION}`
|
||||
WriteRegStr SHELL_CONTEXT "Software\Classes\${FILECLASS}\DefaultIcon" "" `${ICON}`
|
||||
WriteRegStr SHELL_CONTEXT "Software\Classes\${FILECLASS}\shell" "" "open"
|
||||
WriteRegStr SHELL_CONTEXT "Software\Classes\${FILECLASS}\shell\open" "" `${COMMANDTEXT}`
|
||||
WriteRegStr SHELL_CONTEXT "Software\Classes\${FILECLASS}\shell\open\command" "" `${COMMAND}`
|
||||
!macroend
|
||||
|
||||
!macro APP_UNASSOCIATE EXT FILECLASS
|
||||
; Backup the previously associated file class
|
||||
ReadRegStr $R0 SHELL_CONTEXT "Software\Classes\.${EXT}" `${FILECLASS}_backup`
|
||||
WriteRegStr SHELL_CONTEXT "Software\Classes\.${EXT}" "" "$R0"
|
||||
|
||||
DeleteRegKey SHELL_CONTEXT `Software\Classes\${FILECLASS}`
|
||||
!macroend
|
||||
|
||||
!macro wails.associateFiles
|
||||
; Create file associations
|
||||
|
||||
!macroend
|
||||
|
||||
!macro wails.unassociateFiles
|
||||
; Delete app associations
|
||||
|
||||
!macroend
|
||||
|
||||
!macro CUSTOM_PROTOCOL_ASSOCIATE PROTOCOL DESCRIPTION ICON COMMAND
|
||||
DeleteRegKey SHELL_CONTEXT "Software\Classes\${PROTOCOL}"
|
||||
WriteRegStr SHELL_CONTEXT "Software\Classes\${PROTOCOL}" "" "${DESCRIPTION}"
|
||||
WriteRegStr SHELL_CONTEXT "Software\Classes\${PROTOCOL}" "URL Protocol" ""
|
||||
WriteRegStr SHELL_CONTEXT "Software\Classes\${PROTOCOL}\DefaultIcon" "" "${ICON}"
|
||||
WriteRegStr SHELL_CONTEXT "Software\Classes\${PROTOCOL}\shell" "" ""
|
||||
WriteRegStr SHELL_CONTEXT "Software\Classes\${PROTOCOL}\shell\open" "" ""
|
||||
WriteRegStr SHELL_CONTEXT "Software\Classes\${PROTOCOL}\shell\open\command" "" "${COMMAND}"
|
||||
!macroend
|
||||
|
||||
!macro CUSTOM_PROTOCOL_UNASSOCIATE PROTOCOL
|
||||
DeleteRegKey SHELL_CONTEXT "Software\Classes\${PROTOCOL}"
|
||||
!macroend
|
||||
|
||||
!macro wails.associateCustomProtocols
|
||||
; Create custom protocols associations
|
||||
|
||||
!macroend
|
||||
|
||||
!macro wails.unassociateCustomProtocols
|
||||
; Delete app custom protocol associations
|
||||
|
||||
!macroend
|
||||
@@ -0,0 +1,22 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
||||
<assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1" xmlns:asmv3="urn:schemas-microsoft-com:asm.v3">
|
||||
<assemblyIdentity type="win32" name="com.cursor.wuxianxubei" version="0.0.38" processorArchitecture="*"/>
|
||||
<dependency>
|
||||
<dependentAssembly>
|
||||
<assemblyIdentity type="win32" name="Microsoft.Windows.Common-Controls" version="6.0.0.0" processorArchitecture="*" publicKeyToken="6595b64144ccf1df" language="*"/>
|
||||
</dependentAssembly>
|
||||
</dependency>
|
||||
<asmv3:application>
|
||||
<asmv3:windowsSettings>
|
||||
<dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">true/pm</dpiAware> <!-- fallback for Windows 7 and 8 -->
|
||||
<dpiAwareness xmlns="http://schemas.microsoft.com/SMI/2016/WindowsSettings">permonitorv2,permonitor</dpiAwareness> <!-- falls back to per-monitor if per-monitor v2 is not supported -->
|
||||
</asmv3:windowsSettings>
|
||||
</asmv3:application>
|
||||
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
|
||||
<security>
|
||||
<requestedPrivileges>
|
||||
<requestedExecutionLevel level="asInvoker" uiAccess="false"/>
|
||||
</requestedPrivileges>
|
||||
</security>
|
||||
</trustInfo>
|
||||
</assembly>
|
||||
Reference in New Issue
Block a user