Golang构建.exe文件的方法

Golang构建.exe文件的方法 大家好,我有一个程序,我想为它构建一个 .exe 文件,然后提供给另一个人,这样他就可以直接使用这个 .exe 文件。

但在我的程序中,我安装了 KingPin v2,并且用它定义了几个用例。如果我尝试从文件资源管理器启动 .exe 文件,什么也不会发生;但当我在 bash 中启动它时,系统会询问我要使用哪个用例:解析、下载等等。

我的问题是:

  1. 我能否制作一个可以处理特定用例的 .exe 文件?例如:parse.exe,它将执行程序的解析部分。
  2. 如何从文件资源管理器(而不是 bash)以 .exe 文件的形式启动我的程序?
3 回复

@MantasSilanskas,当你在Windows资源管理器中双击你的程序时,你期望看到什么?根据答案的不同,可能有不同的实现方法。现在当你双击时,Windows会尝试在没有任何参数的情况下执行程序,因此会创建一个命令提示符窗口,程序以其默认参数运行然后关闭。如果你希望程序在完成后等待,以便你能看到输出,你可以改为运行一个批处理或PowerShell脚本,该脚本运行你的程序,然后在程序结束后等待。如果你希望在从资源管理器双击时提示输入KingPin的参数,你可以使用PowerShell或通过在你的程序中编写GUI来提示选项。

更多关于Golang构建.exe文件的方法的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


某些Go程序是命令行应用程序,因此不会在图形用户界面中打开,而kingpin看起来是一个纯粹的命令行工具,你必须使用像PowerShell或cmd这样的程序来运行。

或者,如果你每次只需要执行单个命令, 这个程序会读取同一文件夹中的 settings.json 文件。

package main

import (
	"encoding/json"
	"fmt"
	"io/ioutil"
	"os"
	"os/exec"
)

type jsonFile struct {
	Application     string            `json:"application"`
	ApplicationArgs string            `json:"applicationArgs"`
	Environment     map[string]string `json:"environment"`
}

var err error
var settings jsonFile

func main() {

在Go中构建包含Kingpin v2的Windows可执行文件时,需要处理命令行参数传递的问题。以下是具体解决方案:

1. 构建特定用例的独立可执行文件

你可以为每个用例创建独立的入口点,然后分别构建:

// main_parse.go
package main

import (
    "gopkg.in/alecthomas/kingpin.v2"
    "os"
)

func main() {
    app := kingpin.New("myapp", "My application")
    
    // 只定义parse命令
    parseCmd := app.Command("parse", "Parse data")
    inputFile := parseCmd.Flag("input", "Input file").Required().String()
    outputFile := parseCmd.Flag("output", "Output file").Required().String()
    
    kingpin.MustParse(app.Parse(os.Args[1:]))
    
    // 执行解析逻辑
    executeParse(*inputFile, *outputFile)
}

func executeParse(input, output string) {
    // 你的解析逻辑
}
// main_download.go
package main

import (
    "gopkg.in/alecthomas/kingpin.v2"
    "os"
)

func main() {
    app := kingpin.New("myapp", "My application")
    
    // 只定义download命令
    downloadCmd := app.Command("download", "Download data")
    url := downloadCmd.Flag("url", "URL to download").Required().String()
    
    kingpin.MustParse(app.Parse(os.Args[1:]))
    
    // 执行下载逻辑
    executeDownload(*url)
}

func executeDownload(url string) {
    // 你的下载逻辑
}

构建命令:

# 构建parse.exe
go build -o parse.exe main_parse.go

# 构建download.exe
go build -o download.exe main_download.go

2. 从文件资源管理器启动程序

创建Windows批处理文件或使用快捷方式传递参数:

方法1:创建批处理文件

@echo off
REM parse.bat
myapp.exe parse --input "data.txt" --output "result.txt"
pause

方法2:使用快捷方式

  1. 创建myapp.exe的快捷方式
  2. 右键快捷方式 → 属性
  3. 在"目标"字段末尾添加参数:
"C:\path\to\myapp.exe" parse --input "data.txt" --output "result.txt"

方法3:创建带GUI参数输入的程序

package main

import (
    "fmt"
    "gopkg.in/alecthomas/kingpin.v2"
    "os"
    "syscall"
    "github.com/lxn/walk"
    . "github.com/lxn/walk/declarative"
)

func main() {
    // 检查是否从资源管理器启动(无命令行参数)
    if len(os.Args) == 1 {
        showGUI()
        return
    }
    
    // 正常命令行处理
    app := kingpin.New("myapp", "My application")
    
    parseCmd := app.Command("parse", "Parse data")
    inputFile := parseCmd.Flag("input", "Input file").String()
    outputFile := parseCmd.Flag("output", "Output file").String()
    
    downloadCmd := app.Command("download", "Download data")
    url := downloadCmd.Flag("url", "URL to download").String()
    
    switch kingpin.MustParse(app.Parse(os.Args[1:])) {
    case parseCmd.FullCommand():
        executeParse(*inputFile, *outputFile)
    case downloadCmd.FullCommand():
        executeDownload(*url)
    }
}

func showGUI() {
    var inputFile, outputFile *walk.LineEdit
    
    MainWindow{
        Title:  "My Application",
        Size:   Size{400, 200},
        Layout: VBox{},
        Children: []Widget{
            GroupBox{
                Title:  "Parse Options",
                Layout: Grid{Columns: 2},
                Children: []Widget{
                    Label{Text: "Input File:"},
                    LineEdit{AssignTo: &inputFile},
                    Label{Text: "Output File:"},
                    LineEdit{AssignTo: &outputFile},
                    PushButton{
                        Text: "Parse",
                        OnClicked: func() {
                            // 重新启动程序并传递参数
                            syscall.Exec(os.Args[0], 
                                []string{os.Args[0], "parse", 
                                    "--input", inputFile.Text(),
                                    "--output", outputFile.Text()}, 
                                os.Environ())
                        },
                    },
                },
            },
        },
    }.Run()
}

方法4:构建时设置默认命令

package main

import (
    "gopkg.in/alecthomas/kingpin.v2"
    "os"
)

func main() {
    app := kingpin.New("myapp", "My application")
    
    parseCmd := app.Command("parse", "Parse data").Default()
    inputFile := parseCmd.Flag("input", "Input file").Default("default.txt").String()
    outputFile := parseCmd.Flag("output", "Output file").Default("output.txt").String()
    
    downloadCmd := app.Command("download", "Download data")
    url := downloadCmd.Flag("url", "URL to download").String()
    
    // 如果没有参数,使用默认命令
    if len(os.Args) == 1 {
        os.Args = append(os.Args, "parse")
    }
    
    switch kingpin.MustParse(app.Parse(os.Args[1:])) {
    case parseCmd.FullCommand():
        executeParse(*inputFile, *outputFile)
    case downloadCmd.FullCommand():
        executeDownload(*url)
    }
}

构建命令:

# 设置Windows目标
GOOS=windows GOARCH=amd64 go build -o myapp.exe

# 或者交叉编译到Windows
env GOOS=windows GOARCH=amd64 go build -o myapp.exe

这样用户就可以直接双击exe文件运行默认命令,或者通过批处理文件/快捷方式运行特定命令。

回到顶部