Windows 下 tusd 编译安装全流程

原文连接:https://github.com/Dream4ever...前端

项目简介

tus/tusd,这是项目官网,该项目是一个后端服务,用于接收从前端页面所上传的文件。搭配前端 JS 库 transloadit/uppy,便可实现完整的文件上传功能。git

tusd 这个库的一大亮点,是能够实现文件的断点续传。github

项目克隆

需已在 Windows 上安装 Go

进入 $GOPATH\src 目录,$GOPATH 一般位于 C:\Users\XXX\go。若是没有的话,就新建对应目录,路径里的 XXX 是当前用户名。golang

执行下面的命令,将项目克隆至当前目录中。shell

git clone https://github.com/tus/tusd.git

第一个坑:注意上面的克隆地址和 GitHub 官网给出的不同,若是用的是官网给出的地址 git@github.com:tus/tusd.git,会报下面的错误:windows

git@github.com: Permission denied (publickey).
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.

安装依赖

执行下面两条命令,下载并安装 tusd 所需的依赖。后端

go get -u github.com/aws/aws-sdk-go/
go get -u github.com/prometheus/client_golang/prometheus

第二个坑:为保证依赖可以正常下载,请参照 解决 go get 太慢的问题 一文中所说的方法,配置 GOPROXY 参数,并在终端开启代理。bash

经实际测试,在配置了 GOPROXY 并在终端开启代理以后,第一个依赖 aws-sdk-go 可正常下载编译。tcp

第三个坑:即便配置了 GOPROXY 并在终端开启代理,安装第二个依赖 prometheus 的时候仍是会报错。这里并非说所作的设置出了问题,而是由于这个依赖须要从 golang.org/x 这个网站上下载包。奇怪的是,在终端所开启的代理对 GitHub 有效,对这个网站就无效,因此才有了这个坑。测试

既然如此,就只能曲线救国了,按照 解决 go get 太慢的问题 一文中所说的另外一个方法,去 golang 在 GitHub 上的镜像项目里下载对应的包。

好比在安装第二个依赖 prometheus 的时候,给出了下面的提示,意思就是没能下载到 sys/windows 这个包。

package golang.org/x/sys/windows: unrecognized import path "golang.org/x/sys/windows" (https fetch: Get https://golang.org/x/sys/windows?go-get=1: dial tcp 216.239.37.1:443: connectex: A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond.)

那就去 golang 在 GitHub 上面的网站看看,能够找到 sys/windows 这个包,先把它下载过来:

go get -u github.com/golang/sys/windows

上面的命令会把 sys/windows 这个包下载到 $GOPATH\src\github.com\golang\sys 目录下,而前面安装依赖 prometheus 的时候,所提到的包的名称是 golang.org/x/sys/windows,那就须要把刚下载过来的这个包放到提示信息中所说的目录下面。

为了省事,直接把 $GOPATH\src\github.com\golang\sys 这个文件夹,复制到 $GOPATH\src\golang.org\x 下面。

这个时候,再执行一遍下面的命令,继续安装第二个依赖。

go get -u github.com/prometheus/client_golang/prometheus

此次的安装之因此能成功,是由于 go get -u 中的 -u 参数,对于已经下载到本地的包,不会重复下载,这样前面手动把 sys/windws 这个包下载过来了,因此此次安装第二个依赖的时候,就能直接使用已经下载过来的这个包了。

编译项目

执行下面的命令,开始编译生成 tusd 对应的可执行文件。

cd $GOPATH\src\tusd
go build -o tusd.exe cmd/tusd/main.go

第四个坑:执行 go build 命令以后,会再次报错:

cmd\tusd\main.go:4:2: cannot find package "github.com/tus/tusd/cmd/tusd/cli" in any of:
        C:\Users\Administrator\go\src\tusd\vendor\github.com\tus\tusd\cmd\tusd\cli (vendor tree)
        c:\go\src\github.com\tus\tusd\cmd\tusd\cli (from $GOROOT)
        C:\Users\Administrator\go\src\github.com\tus\tusd\cmd\tusd\cli (from $GOPATH)

上网查了查,原来有人已经遇到过这个问题了,说是再手动安装一下 github.com/tus/tusd/cmd/tusd/cli 这个包就行。好吧,那就执行下面的命令,手动安装一下这个包:

go get -u github.com/tus/tusd/cmd/tusd/cli

安装完所需的包以后,再次执行下面的命令,编译代码:

go build -o tusd.exe cmd/tusd/main.go

第五个坑:这回终于可以成功编译了,不过这里的命令和官网的仍是有点不同。go build 命令的 -o 参数后面必须指定文件名,在 Unix/Linux 系统里,可执行文件是没有扩展名的,可是在 Windows 上就不同了,一般是 .exe,而 go build 命令的 -o 参数是按照 Unix/Linux 的习惯来的,因此在 Windows 下使用 go build -o abc 这样的命令来编译的话,是不会自动加上 .exe 这个扩展名的,须要明确写上扩展名才能够。

项目运行

执行下面的命令,便可将 tusd 运行在指定的 IP 和端口上:

.\tusd.exe -host 127.0.0.1 -port 1088

参考资料

  • Are there "always on" module repositories and enterprise proxies?:列表中包含国内的几个 Go 镜像站。
  • 没法安装 golang.org/x/tools/的库:golang.org/x 或者 go.googlesource.com 上面的包没法下载的话,均可以用这个曲线救国的办法,去 GitHub 上找对应的镜像项目下过来,而后放到这个包在 golang.org/x 或者 go.googlesource.com 上的对应位置下。
  • Compile from source on MacOS:明明是这个项目里的包,却仍是报错,就由于路径不对,也是够坑的。用 git clone 就是把当前项目下载到当前路径,好比本项目 tusd,就是下载到当前目录的 tusd 文件夹下。用 go get 则是把当前项目下载到相对路径下,好比本项目就是下载到 $GOPATH\src\github.com\tus\tusd 这个路径下。等等,若是我最开始不是克隆项目,而是用 go get 来下载安装这个项目的话,是否是会省事不少?大坑啊!
  • go build: Compile packages and dependencies:看了官方文档,才知道 go build-o 参数在 Windows 下,不会自动附加可执行文件的 .exe 扩展名。
相关文章
相关标签/搜索