原文鏈接:https://github.com/Dream4ever...
項目簡介
tus/tusd,這是項目官網,該項目是一個後端服務,用於接收從前端頁面所上傳的文件。搭配前端 JS 庫 transloadit/uppy,即可實現完整的文件上傳功能。
tusd 這個庫的一大亮點,是可以實現文件的斷點續傳。
項目克隆
需已在 Windows 上安裝 Go
進入 $GOPATH\src
目錄,$GOPATH
通常位於 C:\Users\XXX\go
。如果沒有的話,就新建對應目錄,路徑裏的 XXX
是當前用戶名。
執行下面的命令,將項目克隆至當前目錄中。
git clone github.com/tus/tusd
第一個坑:注意上面的克隆地址和 GitHub 官網給出的不一樣,如果用的是官網給出的地址 [email protected]:tus/tusd.git
,會報下面的錯誤:
[email protected]: 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
參數,並在終端開啓代理。
經實際測試,在配置了 GOPROXY
並在終端開啓代理之後,第一個依賴 aws-sdk-go
可正常下載編譯。
第三個坑:即使配置了 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
擴展名。