Đi cài đặt không thành công với lỗi: không có vị trí cài đặt cho thư mục xxx bên ngoài GOPATH


152
~/src/go-statsd-client> echo $GOPATH
/Users/me/gopath
~/src/go-statsd-client> echo $GOROOT
/usr/local/Cellar/go/1.1.1\
~/src/go-statsd-client> go install
go install: no install location for directory /Users/me/src/go-statsd-client outside GOPATH

Bất kể cấu trúc nào của dự án là trong điều này luôn luôn thất bại với cùng một thông điệp. Đi xây dựng công trình hoàn hảo.

Đây là go env

GOARCH="amd64"
GOBIN=""
GOCHAR="6"
GOEXE=""
GOHOSTARCH="amd64"
GOHOSTOS="darwin"
GOOS="darwin"
GOPATH="/Users/me/gopath"
GORACE=""
GOROOT="/usr/local/Cellar/go/1.1.1"
GOTOOLDIR="/usr/local/Cellar/go/1.1.1/pkg/tool/darwin_amd64"
CC="gcc"
GOGCCFLAGS="-g -O2 -fPIC -m64 -pthread -fno-common"
CGO_ENABLED="1"

Đây là trên Mac OSX Mountain Lion và go đã được cài đặt với homebrew.

Câu trả lời:


116

Khi bạn cung cấp không có đối số go install, nó mặc định cố gắng cài đặt gói trong thư mục hiện tại. Thông báo lỗi cho bạn biết rằng nó không thể làm điều đó, vì thư mục hiện tại không phải là một phần của bạn $GOPATH.

Bạn có thể:

  • Xác định $GOPATH$ HOME ( export GOPATH=$HOME) của bạn.
  • Di chuyển nguồn của bạn đến trong hiện tại $GOPATH( mv ~/src/go-statsd-client /User/me/gopath).

Sau đó, đi vào go-statsd-clientthư mục và gõ go installsẽ hoạt động, và do đó sẽ gõ go install go-statsd-clienttừ bất cứ đâu trong hệ thống tập tin. Các nhị phân được xây dựng sẽ đi vào $GOPATH/bin.

Là một đề xuất không liên quan, có lẽ bạn muốn đặt không gian tên gói của mình bằng một tên miền, để tránh xung đột tên (ví dụ: github.com/you/go-statsd-clientnếu đó là nơi bạn giữ mã nguồn của mình).


5
Trong trường hợp của tôi, lỗi này là do không có một $GOPATH/binthư mục. Tạo thư mục này là cần thiết - tôi không cần phải đặt GOBINenv var.
xentek

4
@RobertReiz trong khi tôi chia sẻ sự thất vọng của bạn, tôi nên chỉ ra rằng hầu hết các ngôn ngữ khác thực tế sử dụng những ngôn ngữ này, nhưng có lẽ chúng không hiển thị. Ví dụ: Python (một ngôn ngữ nổi tiếng vì sự đơn giản) đã PYTHONHOMEthay thế GOROOTPYTHONPATH thay vì GOPATH. Thậm chí (GC) C có LIBRARY_PATH, C_INCLUDE_PATHvv
Hut8

1
Tôi gặp lỗi này sau export GOPATH=$PWD(đứng ở gốc cây nhân bản Golang), câu trả lời của bạn không thể giải thích được lỗi trong trường hợp này.
ulidtko

2
Đối với tôi, đặt nó vào $ GOPATH là không đủ. Nó cần phải nằm trong một thư mục dưới $ GOPATH / src /
Thomas

9
Tôi chắc chắn có một số lý do rất chính đáng để biện minh cho sự tồn tại của nó GOPATH, nhưng từ bên ngoài nhìn vào, điều này dường như hoàn toàn vô nghĩa. Tại sao tôi phải thay đổi các biến môi trường toàn cầu chỉ để xây dựng một gói cục bộ
Alexander - Tái lập Monica

190

Đối với bất kỳ người dùng OS X nào và tôi trong tương lai, bạn cũng cần đặt GOBINđể tránh thông báo khó hiểu này khi cài đặt vàgo get

mkdir bin 
export GOBIN=$GOPATH/bin

4
Bạn không cần phải thiết lậpGOBIN . Nếu cài đặt nó để $GOPATH/bintạo sự khác biệt, thì có gì đó không ổn với thiết lập của bạn hoặc bạn đang làm điều gì đó bạn không nên làm.
Dave C

28
@DaveC Tôi cũng gặp vấn đề tương tự trên OS X. Đặt GOBIN đã sửa nó.
nJoshi

2
Cảm ơn bạn rất nhiều, có vẻ như một cái gì đó với gói OS X chính thức thực sự sai khi yêu cầu bạn đặt GOBIN, vẫn còn hiệu lực cho 10.11.4 (El Capitan)
Jonas D.

3
Đây cũng là bản sửa lỗi chính xác cho Ubuntu 16.04, với gói nhị phân từ http://golang.org/dl/
suside

1
Điều này hoạt động hoàn hảo trên maOS Sierra 10.12.3 Cảm ơn!
Greg Hilston

30

Bạn đang sử dụng go install trên một thư mục bên ngoài thư mục GOPATH. Đặt biến env GOBIN của bạn hoặc di chuyển thư mục src bên trong GOPATH.

GOPATH/
     bin/
     src/
       go-statsd-client/

Thông tin thêm: GO BUILD Mã nguồn , dòng 296


Tôi đã thử đề xuất ở trên (xuất GOPATH = $ HOME), sau đó chuyển vào thư mục có liên quan của tôi (nơi tôi đang viết mã) và nhập vào cài đặt ... kết quả tương tự đi cài đặt: không cài đặt vị trí cho thư mục ....
stian

Dòng 296 chỉ là một tuyên bố trở lại?
Felix Rabe

1
Tôi đã quên cài đặt GOBIN env
cevaris

Tôi đã đi cho giải pháp này.
Mihamina Rakotomandimby 30/03/18

19

Bạn cần thiết lập cả hai GOPATHGOBIN. Hãy chắc chắn rằng bạn đã thực hiện những điều sau đây (vui lòng thay thế ~/gobằng ưu tiên của bạn GOPATHvà sau đó thay đổi GOBIN). Điều này đã được thử nghiệm trên Ubuntu 16.04 LTS.

export GOPATH=~/go 

mkdir ~/go/bin

export GOBIN=$GOPATH/bin

Câu trả lời được chọn không giải quyết được vấn đề cho tôi.


Tôi đã xác định cả hai trong 16.04 và điều này không làm việc cho tôi.
Catskul

5

Bạn sẽ muốn có 3 thư mục trong thư mục GOPATH đã chọn của bạn.

GOPATH
     /bin
     /src
       /someProgram
        program.go
       /someLibrary
        library.go
     /pkg

Sau đó, bạn sẽ chạy go installtừ bên trong một số Chương trình (đặt một tệp thực thi trong thùng) hoặc một số Thư viện (sẽ đặt một thư viện trong pkg).


1
Điều này làm việc cho tôi sau khi tìm kiếm 2 giờ trên internet.
vishalkquerad

3

Tôi đã có vấn đề này trên Windows.

Vấn đề của tôi %GOPATH%là biến môi trường của tôi đã được đặt thành

C:\Users\john\src\goworkspace

thay vì

C:\Users\john\src\goworkspace\

Thêm dấu gạch chéo bị thiếu ở cuối cố định nó cho tôi.


1
con bò thần thánh bạn vừa cứu tôi khỏi cơn đau đầu tiềm ẩn nhiều giờ. Tôi đang dùng Ubuntu nhưng gặp vấn đề tương tự. Rất siêng năng về tên thư mục, cấu trúc thư mục, mở đầu bằng src / github.com / xyabz / và mọi thứ nhưng cài đặt cứ liên tục đưa ra lỗi cho tôi.
anon58192932

3

Để biết giá trị của nó, đây là .bash_profile của tôi, hoạt động tốt với tôi trên máy Mac với Atom, sau khi cài đặt, hãy đi với Homebrew:

export GOROOT=`go env GOROOT`
export GOPATH=/Users/yy/Projects/go
export GOBIN=$GOPATH/bin
export PATH=$PATH:$GOBIN

2

Trong trường hợp của tôi (OS X) nó được bởi vì tôi đã đặt GOPATHđể /home/username/go(theo sách) thay vì/Users/username/go


2

Tôi đang dùng Windows và tôi đã nhận được nó bằng cách ra lệnh go help gopath cho cmd và đọc văn bản in đậm trong hướng dẫn,

đó là nếu mã bạn muốn cài đặt là ..BaseDir...\SomeProject\src\basic\set, GOPATH không nên ở cùng vị trí với mã, nó chỉ là Base Project DIR : ..BaseDir...\SomeProject.

Biến môi trường GOPATH liệt kê các vị trí cần tìm mã Go. Trên Unix, giá trị là một chuỗi phân tách bằng dấu hai chấm. Trên Windows, giá trị là một chuỗi được phân tách bằng dấu chấm phẩy. Trên Kế hoạch 9, giá trị là một danh sách.

Nếu biến môi trường không được đặt, GOPATH mặc định là thư mục con có tên "go" trong thư mục chính của người dùng ($ HOME / đi trên Unix,% USERPROFILE% \ go trên Windows), trừ khi thư mục đó giữ bản phân phối Go. Chạy "go env GOPATH" để xem GOPATH hiện tại.

Xem https://golang.org/wiki/SettingGOPATH để đặt GOPATH tùy chỉnh.

Mỗi thư mục được liệt kê trong GOPATH phải có cấu trúc quy định:

Thư mục src chứa mã nguồn. Đường dẫn bên dưới src xác định đường dẫn nhập hoặc tên thực thi.

Thư mục pkg chứa các đối tượng gói được cài đặt. Như trong cây Go, mỗi cặp hệ điều hành và kiến ​​trúc đích có thư mục con riêng của pkg (pkg / GOOS_GOARCH).

Nếu DIR là thư mục được liệt kê trong GOPATH, gói có nguồn trong DIR / src / foo / bar có thể được nhập dưới dạng "foo / bar" và có dạng được biên dịch được cài đặt thành "DIR / pkg / GOOS_GOARCH / foo / bar.a ".

Thư mục bin chứa các lệnh được biên dịch. Mỗi lệnh được đặt tên cho thư mục nguồn của nó, nhưng chỉ phần tử cuối cùng, không phải toàn bộ đường dẫn. Đó là, lệnh có nguồn trong DIR / src / foo / quux được cài đặt vào DIR / bin / quux, không phải DIR / bin / foo / quux. Tiền tố "foo /" bị tước để bạn có thể thêm DIR / bin vào PATH của mình để nhận các lệnh đã cài đặt. Nếu biến môi trường GOBIN được đặt, các lệnh được cài đặt vào thư mục mà nó đặt tên thay vì DIR / bin. GOBIN phải là một con đường tuyệt đối.

Đây là một bố cục thư mục ví dụ:

GOPATH=/home/user/go

/home/user/go/
    src/
        foo/
            bar/               (go code in package bar)
                x.go
            quux/              (go code in package main)
                y.go
    bin/
        quux                   (installed command)
    pkg/
        linux_amd64/
            foo/
                bar.a          (installed package object)

..........

nếu GOPATH đã được đặt thành Base Project DIR và vẫn gặp sự cố này, trong các cửa sổ, bạn có thể thử đặt GOBINBase Project DIR\binhoặc %GOPATH%\bin.


1

Cẩn thận khi chạy

export GOPATH=$HOME

Giả sử rằng mã của bạn tồn tại ở những nơi cụ thể liên quan đến GOPATH. Vì vậy, thay vào đó, bạn có thể sử dụng docker để chạy bất kỳ lệnh go nào:

docker run -it -v $(pwd):/go/src/github.com/<organization name>/<repository name> golang

Và bây giờ bạn có thể sử dụng bất kỳ lệnh golang nào, ví dụ:

go test github.com/<organization name>/<repository name> 

0

Trong các cửa sổ, cửa sổ cmd của tôi đã mở khi tôi đặt biến môi trường GOPATH. Đầu tiên tôi phải đóng cmd và sau đó mở lại để nó có hiệu lực.


0

Vấn đề là bạn không có trong thư mục gói có tệp go với chức năng chính và đi cài đặt không thể tìm thấy lệnh (đi tệp với chức năng chính) mà bạn muốn cài đặt.

$ cd /path/to/file-with-main-function.go

và sau đó chạy:

$ go install 

-1

Trên OSX Mojave 10,14, gođược thường được lắp đặt tại /usr/local/go.

Do đó, thiết lập các ENV này và bạn nên đi.

export GOPATH=/usr/local/go && export GOBIN=/usr/local/go/bin

Ngoài ra, thêm chúng vào bash_profilehoặc zsh_profilenếu nó hoạt động.

echo "export GOPATH=/usr/local/go && export GOBIN=/usr/local/go/bin" >> ~/.bash_profile && source ~/.bash_profile

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.