2016-07-25 173 views
0

我对系统编程非常陌生。使用内置依赖关系构建

我有一个Go程序,它使用net/http并启动一个http服务器。

当我构建Windows二进制文件并在目标Windows机器上尝试时,在启动服务器之前没有任何工作,除了Printf

只要我在目标Windows机器上安装Go,一切都开始工作!

这里是我的程序:

package main 

import (
    "fmt" 
    "log" 
    "os/exec" 
    "net/http" 
) 

func handler(w http.ResponseWriter, r *http.Request) { 
    fmt.Fprintf(w, "Hi there @%s!", r.URL.Path[1:]) 
} 

func main() { 

    path, err := exec.LookPath("go") 
    if err != nil { 
     log.Fatal("Go is not your fortune :|") 
    } 
    fmt.Printf("Go is available at %s\n", path) 

    http.HandleFunc("/", handler) 
    http.ListenAndServe(":8080", nil) 
} 

如果go不建全,且其程序的依赖关系,然后我该怎么办呢?如果是这样,为什么它不工作?

在运行任何Go程序之前,目标系统是否必须安装go

请帮忙!谢谢。

+0

看起来像加载动态库时崩溃了。也许在安装完'go'之后,必要的二进制文件就会进入win32/wow64目录,因此它有效吗?您可以尝试将必要的运行时动态库添加到二进制目录(或PATH)并查看是否足够。 – hauron

+1

运行时不需要安装源代码。您需要展示如何构建二进制文件以及您收到的输出内容。 – JimB

+0

@JimB我已经添加了我的程序。如果'Go'没有安装,它只记录错误并退出! – Mehulkumar

回答

2

,因为你叫log.Fatal()如果没有找到go工具您的应用程序并没有去工作,log.Fatal()终止您的应用程序:

致命相当于打印(),其次是调用os.Exit(1)。如果你从你贴要么go buildgo install(见What does go build build?了解详细信息)的源代码编译这个

你的二进制可执行文件将包含它所需要的一切。只是不要拨打log.Fatal(),它应该工作。

而且在一个侧面说明:您应该http.ListenAndServe()返回检查和打印错误,如:

panic(http.ListenAndServe(":8080", nil)) 

因为如果失败,你不会知道为什么它不工作(例如,你已经启动了该应用程序,并且端口被使用/正在使用)。

+0

注意!非常感谢您的帮助! – Mehulkumar

2

不,目标系统不需要为Go编译的可执行文件安装Go编译器来运行。您可以在一台Windows计算机上使用go installgo build编译您的程序,将其复制到另一个安装了Go并且在那里运行的而不是

确保您编译的程序从package main语句开始 - 否则只编译一个库文件。

请务必检查运行程序的用户是否有权监听http服务器使用的端口。端口0-1023 - “已知端口” - “只能由系统(或根)进程或由特权用户执行的程序使用”(https://support.microsoft.com/en-us/kb/174904),因此请尝试以特权用户身份启动程序(例如,管理员)或使用非特权端口> = 1024(例如:http.ListenAndServe(":8080", nil)应该在非特权端口上启动服务器,请参阅一个非常简单的示例 - 例如https://golang.org/doc/articles/wiki/),并查看是否可以使其工作。