golang安装第三包报错 exec: "hg": executable file not found in %PATH%

Python017

golang安装第三包报错 exec: "hg": executable file not found in %PATH%,第1张

【解决过程】

1.很明显,是在windows的cmd中,找不到hg。

而对于hg,如果是cygwin等环境,那肯定没问题,但是此处是cmd,所以没法用hg。

2.参考:

``

[package code.google.com/p/go.example/hello: exec: “hg”: executable file not found in %PATH%. How to get remote golang packages?]`

go get code.google.com/p/log4go

要先进到ngrok.cfg的路径下,在执行命令才行。

ngrok配置方法

1、下载ngrok源码

(GOPATH=~/goproj)

$ mkdir ~/goproj/src/github.com/inconshreveable

$ git clone https://github.com/inconshreveable/ngrok.git

$ export GOPATH=~/goproj/src/github.com/inconshreveable/ngrok

2、生成自签名证书

使用ngrok.com官方服务时,我们使用的是官方的SSL证书。自建ngrokd服务,我们需要生成自己的证书,并提供携带该证书的ngrok客户端。

证书生成过程需要一个NGROK_BASE_DOMAIN。 以ngrok官方随机生成的地址693c358d.ngrok.com为例,其NGROK_BASE_DOMAIN就是"ngrok.com",如果你要 提供服务的地址为"example.tunnel.tonybai.com",那NGROK_BASE_DOMAIN就应该 是"tunnel.tonybai.com"。

我们这里以NGROK_BASE_DOMAIN="tunnel.tonybai.com"为例,生成证书的命令如下:

$ cd ~/goproj/src/github.com/inconshreveable/ngrok

$ openssl genrsa -out rootCA.key 2048

$ openssl req -x509 -new -nodes -key rootCA.key -subj "/CN=tunnel.tonybai.com" -days 5000 -out rootCA.pem

$ openssl genrsa -out device.key 2048

$ openssl req -new -key device.key -subj "/CN=tunnel.tonybai.com" -out device.csr

$ openssl x509 -req -in device.csr -CA rootCA.pem -CAkey rootCA.key -CAcreateserial -out device.crt -days 5000

执行完以上命令,在ngrok目录下就会新生成6个文件:

-rw-rw-r– 1 ubuntu ubuntu 1001 Mar 14 02:22 device.crt

-rw-rw-r– 1 ubuntu ubuntu 903 Mar 14 02:22 device.csr

-rw-rw-r– 1 ubuntu ubuntu 1679 Mar 14 02:22 device.key

-rw-rw-r– 1 ubuntu ubuntu 1679 Mar 14 02:21 rootCA.key

-rw-rw-r– 1 ubuntu ubuntu 1119 Mar 14 02:21 rootCA.pem

-rw-rw-r– 1 ubuntu ubuntu 17 Mar 14 02:22 rootCA.srl

ngrok通过bindata将ngrok源码目录下的assets目录(资源文件)打包到可执行文件(ngrokd和ngrok)中 去,assets/client/tls和assets/server/tls下分别存放着用于ngrok和ngrokd的默认证书文件,我们需要将它们替换成我们自己生成的:(因此这一步务必放在编译可执行文件之前)

cp rootCA.pem assets/client/tls/ngrokroot.crt

cp device.crt assets/server/tls/snakeoil.crt

cp device.key assets/server/tls/snakeoil.key

3、编译ngrokd和ngrok

在ngrok目录下执行如下命令,编译ngrokd:

$ make release-server

不过在我的AWS上,出现如下错误:

GOOS="" GOARCH="" go get github.com/jteeuwen/go-bindata/go-bindata

bin/go-bindata -nomemcopy -pkg=assets -tags=release \

-debug=false \

-o=src/ngrok/client/assets/assets_release.go \

assets/client/…

make: bin/go-bindata: Command not found

make: *** [client-assets] Error 127

go-bindata被安装到了$GOBIN下了,go编译器找不到了。修正方法是将$GOBIN/go-bindata拷贝到当前ngrok/bin下。

$ cp /home/ubuntu/.bin/go14/bin/go-bindata ./bin

再次执行make release-server。

~/goproj/src/github.com/inconshreveable/ngrok$ make release-server

bin/go-bindata -nomemcopy -pkg=assets -tags=release \

-debug=false \

-o=src/ngrok/client/assets/assets_release.go \

assets/client/…

bin/go-bindata -nomemcopy -pkg=assets -tags=release \

-debug=false \

-o=src/ngrok/server/assets/assets_release.go \

assets/server/…

go get -tags 'release' -d -v ngrok/…

code.google.com/p/log4go (download)

go: missing Mercurial command. See http://golang.org/s/gogetcmd

package code.google.com/p/log4go: exec: "hg": executable file not found in $PATH

github.com/gorilla/websocket (download)

github.com/inconshreveable/go-update (download)

github.com/kardianos/osext (download)

github.com/kr/binarydist (download)

github.com/inconshreveable/go-vhost (download)

github.com/inconshreveable/mousetrap (download)

github.com/nsf/termbox-go (download)

github.com/mattn/go-runewidth (download)

github.com/rcrowley/go-metrics (download)

Fetching https://gopkg.in/yaml.v1?go-get=1

Parsing meta tags from https://gopkg.in/yaml.v1?go-get=1 (status code 200)

get "gopkg.in/yaml.v1": found meta tag main.metaImport{Prefix:"gopkg.in/yaml.v1", VCS:"git", RepoRoot:"https://gopkg.in/yaml.v1"} at https://gopkg.in/yaml.v1?go-get=1

gopkg.in/yaml.v1 (download)

make: *** [deps] Error 1

又出错!提示找不到hg,原来是aws上没有安装hg。install hg后(sudo apt-get install mercurial),再编译。

$ make release-server

bin/go-bindata -nomemcopy -pkg=assets -tags=release \

-debug=false \

-o=src/ngrok/client/assets/assets_release.go \

assets/client/…

bin/go-bindata -nomemcopy -pkg=assets -tags=release \

-debug=false \

-o=src/ngrok/server/assets/assets_release.go \

assets/server/…

go get -tags 'release' -d -v ngrok/…

code.google.com/p/log4go (download)

go install -tags 'release' ngrok/main/ngrokd

同样编译ngrok:

$ make release-client

bin/go-bindata -nomemcopy -pkg=assets -tags=release \

-debug=false \

-o=src/ngrok/client/assets/assets_release.go \

assets/client/…

bin/go-bindata -nomemcopy -pkg=assets -tags=release \

-debug=false \

-o=src/ngrok/server/assets/assets_release.go \

assets/server/…

go get -tags 'release' -d -v ngrok/…

go install -tags 'release' ngrok/main/ngrok

AWS上ngrokd和ngrok被安装到了$GOBIN下。

三、调试

1、启动ngrokd

$ ngrokd -domain="tunnel.tonybai.com" -httpAddr=":8080" -httpsAddr=":8081"

[03/14/15 04:47:24] [INFO] [registry] [tun] No affinity cache specified

[03/14/15 04:47:24] [INFO] [metrics] Reporting every 30 seconds

[03/14/15 04:47:24] [INFO] Listening for public http connections on [::]:8080

[03/14/15 04:47:24] [INFO] Listening for public https connections on [::]:8081

[03/14/15 04:47:24] [INFO] Listening for control and proxy connections on [::]:4443

1、安装google go

2、安装git

3、安装Mingw

4、把go的bin目录添加到PATH环境变量,可以直接在CMD中执行

SET PATH=%PATH%C:\go\bin

5、把mingw的bin目录添加到PATH路径

SET PATH=%PATH%C:\go\bin

6、下载ngrok源码,

7、将下载的zip解压出来,修改Makefile

将 export GOPATH:=$(shell pwd)

改为 export GOPATH:=C:\Users\Administrator\Desktop\ngork\ngrok-src

将 bin/go-bindata:

GOOS="" GOARCH="" go get github.com/jteeuwen/go-bindata/go-bindata

这段改为 bin/go-bindata:

GOOS=windows GOARCH=amd64 go get github.com/jteeuwen/go-bindata/go-bindata

8、修改log4go的路径

修改src\ngrok\log\logger.go中log4o那段代码为

log "github.com/keepeye/log4go"

9、cmd执行

make release-all