使用内置依赖项构建

时间:2016-07-25 13:42:46

标签: http go server dependencies

我对系统编程很陌生。

我有一个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

请帮忙!感谢。

2 个答案:

答案 0 :(得分:2)

如果没有Go,您的应用无法运行,因为如果找不到go工具,并且log.Fatal() 终止,则会致电log.Fatal() >你的应用:

  

致命等同于Print(),然后调用os.Exit(1)

如果您使用go buildgo install发布来源,可执行二进制文件将包含所需的所有内容(有关详细信息,请参阅What does go build build?)。不要打电话给log.Fatal(),它应该有用。

并注意:检查并打印http.ListenAndServe()返回的错误,例如:

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

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

答案 1 :(得分:2)

不,目标系统不必为使用Go to run编译的可执行文件安装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/ - 看看你是否能让它发挥作用。