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?
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?
Câu trả lời:
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 , GOPATH
khô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 GOBIN
thà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 GOPATH
biến của bạn .
Bảo đảm:
- nguồn của bạn dưới
GOPATH/src
bin
thư mục trong thư mục GOPATH của mình.Xem biến môi trường GOPATH (trong đó 'DIR' là một GOPATH
thư mục):
Thư mục
bin
chứ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 trongDIR/src/foo/quux
được cài đặt vàoDIR/bin/quux
, không phảiDIR/bin/foo/quux
. Các "foo/
" tiền tố là tước do đó bạn có thể thêmDIR/bin
cho bạnPATH
để có được các lệnh cài đặt.
Nếu
GOBIN
biế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
.GOBIN
phả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~/go
nhưng bạn đã chạygo install
lệ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.
Tôi đặt đường dẫn GOBIN và điều đó đã hiệu quả với tôi
export GOBIN=[WorkspacePath]/bin
cannot install, GOBIN must be an absolute path
:(
..
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
.
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 .
go install
hoạ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.
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.
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.
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
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
Đối với *nix
hệ 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_profile
hoặ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_profile
hoặc ~/.zshrc
, như sau:
$ source ~/.bash_profile
/usr/local/go/bin
không?
Về việc thiết lập GOBIN
phiên bản biến không yêu cầu nó và chỉ dựa vào GOPATH
:
GOBIN
là 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 GOPATH
thư 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
Đố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, GOPATH
là đủ tốt.
Nói cách khác, cả hai giải pháp sau sẽ hoạt động: a. Đặt GOBIN
rõ 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 đó
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
Đối với người dùng WINDOWS
Mở dấu nhắc lệnh ( Win
+ r
rồi nhập cmd
) hoặc cửa sổ powershell ( Win
+ x
sau đó 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
Trong Windows:
go env -w GOBIN=C:\Users\yourname\go\bin
Xác nhận bằng go env
lệnh rằng GOBIN đã được đặt, sau đó go install
lệnh đúng cách sẽ lưu tệp thực thi đúng cách trong thư mục bin.
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
go install <your_module>
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.
và 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.
và 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.
Thử
export GOROOT=""
export PATH=$PATH:$GOROOT/bin
go install
cà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.