GOBIN chưa được đặt: không thể chạy, hãy cài đặt


86

Tôi đang cố gắng cài đặt gói tùy chỉnh cho tệp main.go của mình. Tuy nhiên, khi tôi chạy

go install custom.go

Tôi gặp lỗi này

go install: no install location for .go files listed on command line (GOBIN not set)

Làm cách nào để đặt GOBIN?


16
BTW: Đây là một cách hoàn toàn sai để cài đặt một gói. Điều này sẽ không bao giờ hiệu quả. go installcài đặt các gói không phải các tệp riêng lẻ. Vui lòng đọc tất cả golang.org/cmd/go và xem cách thiết lập tệp của bạn.
Volker

cảm ơn cho những người đứng đầu lên!
user3918985

2
Tôi nghĩ bạn đang muốn xây dựng.
bunnybare

2
Tôi không chắc tôi đồng ý rằng nó hoàn toàn sai. Khi GOBIN được thiết lập, có hai hành vi khác biệt: Khi sử dụng go build <gofile.go>, tệp thực thi được tạo trong cùng một thư mục. Khi sử dụng go install <gofile.go>, tệp thực thi được tạo trong GOBIN.
Erez A. Korn

2
FWIW - tài liệu mặc định để bắt đầu khuyên bạn nên thực hiện chính xác điều này. golang.org/doc/install
Mike Buckbee

Câu trả lời:


46

Cập nhật năm 2020: kể từ phiên bản Go 1.11 và sự ra đời của mô-đun Go , GOPATHkhông cần thiết nữa cho mỗi dự án và được đặt mặc định~/go cho các công cụ / dự án toàn cầu mà bạn muốn go get.

Go 1.16 (Q1 2020) sẽ được đặt mặc định GOBINthành GOPATH[0]/bin .

Nhưng hiện tại, đối với bất kỳ dự án nào sử dụng mô-đun, bạn sẽ không gặp phải thông báo lỗi như " go install: no install location ..." nữa.


Câu trả lời gốc năm 2014:

Kiểm tra GOPATHbiến của bạn .
Bảo đảm:

  • nguồn của bạn dưới GOPATH/src
  • bạn có một binthư mục trong thư mục GOPATH của mình.

Xem biến môi trường GOPATH (trong đó 'DIR' là một GOPATHthư mục):

Thư mục binchứa các lệnh đã 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. Có nghĩa 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. Các " foo/" tiền tố là tước do đó bạn có thể thêm DIR/bincho bạn PATHđể có được các lệnh cài đặt.

Nếu GOBINbiến môi trường được đặt, các lệnh sẽ được cài đặt vào thư mục mà nó đặt tên thay vì DIR/bin. GOBINphải là một con đường tuyệt đối.


Ví dụ: chuỗi này minh họa điều gì sẽ xảy ra trong trường hợp bản dựng go được thực hiện bên ngoài GOPATH/src:

Có vẻ như của bạn GOPATHđược đặt thành ~/gonhưng bạn đã chạy go installlệnh trên~/dev/go

Xem Go Build

Đường dẫn Go là một danh sách các cây thư mục chứa mã nguồn Go. Nó được tư vấn để giải quyết các nhập khẩu không thể tìm thấy trong cây cờ vây tiêu chuẩn.

Nếu bạn đã làm xong go build, bạn cũng có thể thử một go install(không custom.go): bạn muốn cài đặt gói chứ không phải một tệp duy nhất.


bạn có hiểu cái này không? Tôi đã echo $ PATH và nhận được điều này: / Users / apple / bin: / usr / bin: / bin: / usr / sbin: / sbin: / usr / local / bin: / usr / local / git / bin: / usr / local / đi / bin: / usr / local / mysql / bin
user3918985

76

Tôi đặt đường dẫn GOBIN và điều đó đã hiệu quả với tôi

export GOBIN=[WorkspacePath]/bin

2
vâng, đây là câu trả lời chính xác. chỉ cần tạo / bin trong GOPATH đó
swdev

7
Sau khi xuất đường dẫn, tôi gặp lỗi cannot install, GOBIN must be an absolute path:(
lee

@lee Bạn đã sử dụng ..hoặc ~trong đường dẫn bạn đã chỉ định? Tôi đã gặp lỗi đó và chỉ chuyển sang một đường dẫn tuyệt đối chẳng hạn như /home/ben/bin/hoặc thậm chí $HOME/bin/. Lệnh đầy đủ của tôi là (in fishshell, go v1.11) env GOBIN=$HOME/bin/ go install testfile.go.
Benny Jobigan

40

Là người mới bắt đầu, tôi đã gặp lỗi này khi thử các lệnh go khác nhau (xây dựng, chạy và cài đặt). Nói tóm lại, bạn không thể đi cài đặt một filename.go . Bạn chỉ có thể cài đặt một gói.

Điều này thật khó hiểu, bởi vì tôi đã học được rằng:

nate:~/work/src/dir $ go run hello/hello.go
hello, world.

hoạt động tốt. Nhưng tôi không thể hiểu tại sao cài đặt không hoạt động:

nate:~/work/src/dir $ go install hello/hello.go 
go install: no install location for .go files listed on command line (GOBIN not set)
nate:~/work/src/dir $ go install hello
can't load package: package hello: cannot find package "hello" in any of:
    /opt/go/src/hello (from $GOROOT)
    /home/ubuntu/work/src/hello (from $GOPATH)

Bất kể tôi đang ở thư mục nào:

nate:~/work/src/dir $ cd hello
nate:~/work/src/dir/hello $ go install hello.go 
go install: no install location for .go files listed on command line (GOBIN not set)
nate:~/work/src/dir/hello $ go install hello
can't load package: package hello: cannot find package "hello" in any of:
    /opt/go/src/hello (from $GOROOT)
    /home/ubuntu/work/src/hello (from $GOPATH)

Sự nhầm lẫn này là do go run chỉ hoạt động với các tệp nguồn của Go (tên tệp kết thúc bằng .go) và go install chỉ chấp nhận các gói. Các gói được đặt tên theo đường dẫn nhập hoặc đường dẫn hệ thống tệp của chúng. Như vậy:

nate:~/work/src/dir $ go install dir/hello
nate:~/work/src/dir $ go install ./hello/
nate:~/work/src/dir/hello $ go install .

tất cả đều hoạt động tốt. Đầu tiên đề cập đến gói theo đường dẫn nhập, (cho rằng $ GOPATH = "/ home / nate / work", các công cụ go tìm kiếm mã nguồn trong / home / nate / work / src), các công cụ khác được hiểu là hệ thống tệp đường dẫn vì các thời kỳ dẫn đầu.

Xem thêm tài liệu GOPATH .


1
đây là giải pháp thực sự IMO. go installhoạt động trên các thư mục và nếu bạn chỉ định một tệp go cụ thể, thì nó có thể gây ra sự cố cụ thể này.
senseiwu

13

Trên thực tế có 2 loại hành vi khác nhau.

go install <package>

điều này được ghi lại trong Biên dịch và cài đặt các gói và phụ thuộc Bạn không cần GOBIN nếu bạn đặt GOPATH chính xác.

go install <gofile>

điều này không được ghi lại và bạn cần biến GOBIN env trong chế độ này.


1
go install <gofile>được ghi lại, trong go help packagesđó go install --helpđề cập đến. Vấn đề là go install(trong 1.9.2 trở về trước) có hành vi không nhất quán, trong một trường hợp là nó yêu cầu và trong một trường hợp khác, nó không yêu cầu GOBIN phải được thiết lập rõ ràng.
Stevo Slavić

7

Như các câu trả lời rõ ràng đã chỉ ra, nếu env GOPATH của bạn được đặt chính xác cho không gian làm việc của bạn, bạn không cần đặt biến env GOBIN.

Vui lòng kiểm tra các biến môi trường go của bạn bằng cách chạy $ go env | grep -i "^ GO" và tìm GOROOT và GOPATH để kiểm tra xem GOROOT có trỏ đến cài đặt nguồn GO của bạn hay không và GOPATH trỏ đến không gian làm việc của bạn.

Nếu mọi thứ đều chính xác, hãy điều hướng đến subir nơi yourpkg.go cư trú, sau đó chạy $ go build (không có tên tệp) trước và $ go install (lại với tên tệp của chúng tôi) thứ hai, nếu bạn không thấy bất kỳ thông báo lỗi nào trên màn hình của bạn. gói đã sẵn sàng tại không gian làm việc của bạn / pkg / youros /../ yourpackage.a


7

Trên các cửa sổ có cygwin, có vẻ như bạn nên thiết lập GOBIN thành $ GOPATH / bin.

và nhớ thoát đúng dấu phân cách tên tệp windows:

$ echo $GOROOT
C:\Go\

carl@rainier ~/gocode/src/github.com/user/hello
$ echo $GOPATH
C:\cygwin64\home\carl\gocode

carl@rainier ~/gocode/src/github.com/user/hello
$ echo $GOBIN
C:\cygwin64\home\carl\gocode\bin

5

Đối với *nixhệ thống, hãy xem nơi gođược cài đặt, thực hiện lệnh sau:

$ which go

đầu ra nào giả sử:

/usr/local/go/bin/go

sau đó thêm các mục sau vào ~/.bash_profilehoặc vào ~/.zshrc:

export GOROOT=/usr/local/go
export GOPATH=$GOROOT/src //your-go-workspace
export GOBIN=$GOROOT/bin //where go-generate-executable-binaries

PATH=$PATH:$GOPATH:$GOBIN

export PATH

PS: Đừng quên ghi nguồn ~/.bash_profilehoặc ~/.zshrc, như sau:

$ source ~/.bash_profile

4
Bạn có thực sự muốn các tệp thực thi phát triển được đưa vào /usr/local/go/binkhông?
Dolph

1

Về việc thiết lập GOBINphiên bản biến không yêu cầu nó và chỉ dựa vào GOPATH:

  1. GOBINlà bắt buộc nếu chúng ta không có gói, tức là tệp nằm trực tiếp trong GOPATHthư mục. Điều này có thể xảy ra khi chúng tôi đang thử các tính năng của Go với tư cách là người học

  2. Đối với các dự án Go điển hình, các tệp nằm trong các thư mục gói. Đối với những điều này, GOPATHlà đủ tốt.

  3. Nói cách khác, cả hai giải pháp sau sẽ hoạt động: a. Đặt GOBINrõ ràng là $ GOPATH / bin [chỉ dành cho mục đích học tập, có thể tránh] b. Tạo một thư mục con sẽ là tên gói của bạn và di chuyển các tệp .go vào đó

  4. Tôi đoán các tiện ích Go sẽ loại bỏ lỗi ở trên và xử lý tình huống tốt hơn - dựa trên việc đối số là thư mục hay tệp nguồn


1

Đối với người dùng WINDOWS

Mở dấu nhắc lệnh ( Win+ rrồi nhập cmd) hoặc cửa sổ powershell ( Win+ xsau đó nhập i).

Đặt GOPATH

LƯU Ý: GOPATH không được giống với đường dẫn cài đặt Go của bạn.

go env -w GOPATH=c:\your-go-work

Thông tin chi tiết trong liên kết bên dưới https://github.com/golang/go/wiki/SettingGOPATH#windows

Đặt GOBIN

go env -w GOBIN=C:\somewhere\else\bin

Tôi khuyên bạn nên kiểm tra ví dụ mã do golang cung cấp. Nó đã giúp tôi rất nhiều. https://golang.org/doc/code.html#Command


1

Trong Windows:

go env -w GOBIN=C:\Users\yourname\go\bin

Xác nhận bằng go envlệnh rằng GOBIN đã được đặt, sau đó go installlệnh đúng cách sẽ lưu tệp thực thi đúng cách trong thư mục bin.


1

Tôi cũng gặp phải vấn đề tương tự (GOBIN không cần đặt riêng), hãy đảm bảo bạn có những điều sau

  1. GOPATH được đặt (điều này cũng tự động đặt GOBIN là $ GOPATH / bin)
  2. GOPATH có các thư mục sau bin, pkg, src
  3. custom.go được đặt dưới src / <your_module>
  4. sau đó chạy go install <your_module>
  5. bạn có thể tìm kiểm tra cho tệp nhị phân đã biên dịch (<your_module>) trong thư mục bin

0

Bạn không cần $ GOBIN nếu bạn đã đặt $ GOPATH đúng cách. Nếu vậy, chỉ cần kiểm tra lại xem dự án của bạn có nằm trong thư mục $ GOPATH / src hay không .


0

Từ https://golang.org/cmd/go/#hdr-Enosystem_variables :

GOBIN Thư mục nơi 'go install' sẽ cài đặt một lệnh.

https://golang.org/cmd/go/#hdr-GOPATH_enosystem_variable :

Nếu biến môi trường GOBIN được đặt, các lệnh sẽ được cài đặt vào thư mục mà nó đặt tên thay vì DIR / bin. GOBIN phải là một đường dẫn tuyệt đối.

https://golang.org/cmd/go/#hdr-Modules__module_versions__and_more

Trong chế độ nhận biết mô-đun, GOPATH không còn xác định ý nghĩa của các lần nhập trong quá trình xây dựng, nhưng nó vẫn lưu trữ các phần phụ thuộc đã tải xuống (trong GOPATH / pkg / mod) và các lệnh đã cài đặt (trong GOPATH / bin, trừ khi GOBIN được đặt).

Vì vậy, về cơ bản bạn có thể sử dụng GOBIN để ghi đè tạm thời hoặc vĩnh viễn vị trí cài đặt nhị phân mặc định (tức là $GOPATH/bin). Tôi đã cài đặt thành công "tập lệnh" 1 tệp đi bằng cách sử dụng env GOBIN=$HOME/bin/ go install testfile.go. Điều này đã được thực hiện bằng cách sử dụng go v1.11.


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.