ไม่ได้ตั้งค่า GOBIN: ไม่สามารถเรียกใช้ go install


86

ฉันกำลังพยายามติดตั้งแพ็คเกจที่กำหนดเองสำหรับไฟล์ main.go ของฉัน อย่างไรก็ตามเมื่อฉันวิ่ง

go install custom.go

ฉันได้รับข้อผิดพลาดนี้

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

ฉันจะตั้งค่า GOBIN ได้อย่างไร?


16
BTW: นี่เป็นวิธีที่ผิดอย่างสิ้นเชิงในการติดตั้งแพ็คเกจ สิ่งนี้จะไม่ได้ผล go installติดตั้งแพ็กเกจไม่ใช่แต่ละไฟล์ โปรดอ่านgolang.org/cmd/goทั้งหมดและดูวิธีตั้งค่าไฟล์ของคุณ
Volker

ขอบคุณสำหรับหัวขึ้น!
user3918985

2
ฉันคิดว่าคุณกำลังมองหาการสร้างไป
bunnybare

2
ฉันไม่แน่ใจว่าฉันยอมรับว่ามันผิดทั้งหมด เมื่อตั้งค่า GOBIN จะมีลักษณะการทำงานที่แตกต่างกันสองอย่าง: เมื่อใช้ go build <gofile.go> ไฟล์ปฏิบัติการจะถูกสร้างขึ้นในโฟลเดอร์เดียวกัน เมื่อใช้ go install <gofile.go> ไฟล์ปฏิบัติการจะถูกสร้างขึ้นใน GOBIN
Erez A. Korn

2
FWIW - เอกสารเริ่มต้นในการเริ่มต้นแนะนำให้คุณทำเช่นนี้ golang.org/doc/install
Mike Buckbee

คำตอบ:


46

ปรับปรุง 2020: ตั้งแต่ไป 1.11 และการแนะนำของโมดูลไป , GOPATHไม่จำเป็นอีกต่อไปต่อโครงการและค่าเริ่มต้น~/goสำหรับเครื่องมือระดับโลก / go getโครงการที่คุณจะ

ไป 1.16 (Q1 2020)ควรเป็นค่าเริ่มต้นGOBINเป็น GOPATH[0]/bin .

แต่ตอนนี้สำหรับโปรเจ็กต์ใด ๆ ที่ใช้โมดูลคุณจะไม่มีข้อความแสดงข้อผิดพลาดเช่น " go install: no install location ..." อีกต่อไป


คำตอบเดิม 2014:

ตรวจสอบGOPATHตัวแปรของคุณ
ตรวจสอบให้แน่ใจว่า:

  • แหล่งที่มาของคุณอยู่ภายใต้ GOPATH/src
  • คุณมีbinโฟลเดอร์ภายในโฟลเดอร์ GOPATH ของคุณ

ดูตัวแปรสภาพแวดล้อม GOPATH (โดยที่ 'DIR' คือGOPATHโฟลเดอร์):

binไดเรกทอรีถือคำสั่งรวบรวม
แต่ละคำสั่งมีชื่อสำหรับไดเร็กทอรีต้นทาง แต่เป็นเพียงองค์ประกอบสุดท้ายไม่ใช่พา ธ ทั้งหมด นั่นคือคำสั่งที่มีแหล่งที่มาในDIR/src/foo/quuxการติดตั้งลงในไม่DIR/bin/quux DIR/bin/foo/quux"การfoo/" คำนำหน้าเป็นปล้นเพื่อให้คุณสามารถเพิ่มDIR/binที่คุณPATHจะได้รับการติดตั้งคำสั่ง

ถ้าตัวแปรสภาพแวดล้อมมีการตั้งค่าคำสั่งมีการติดตั้งไปยังไดเรกทอรีชื่อมันแทนGOBIN ต้องเป็นเส้นทางที่แน่นอนDIR/binGOBIN


ตัวอย่างเช่นเธรดนี้แสดงให้เห็นถึงสิ่งที่เกิดขึ้นในกรณีที่ go build เสร็จสิ้นภายนอกGOPATH/src:

ดูเหมือนว่าคุณGOPATHตั้งค่าเป็น~/goแต่คุณรันgo installคำสั่ง~/dev/go

ดูGo Build

เส้นทางไปคือรายการของแผนผังไดเรกทอรีที่มีรหัสแหล่งที่มาของ Go มีการปรึกษาเพื่อแก้ไขการนำเข้าที่ไม่พบในแผนภูมิ Go มาตรฐาน

หากคุณทำเสร็จgo buildแล้วคุณสามารถลองgo install(ไม่custom.go): คุณต้องการติดตั้งแพ็กเกจไม่ใช่ไฟล์เดียว


คุณหมายถึงสิ่งนี้หรือเปล่า ฉันทำ echo $ PATH และได้รับสิ่งนี้: / Users / apple / bin: / usr / bin: / bin: / usr / sbin: / sbin: / usr / local / bin: / usr / local / git / bin: / usr / local / go / bin: / usr / local / mysql / bin
user3918985

76

ฉันกำหนดเส้นทาง GOBIN และนั่นก็เหมาะกับฉัน

export GOBIN=[WorkspacePath]/bin

2
ใช่นี่คือคำตอบที่ถูกต้อง เพียงสร้าง / bin ใน GOPATH นั้น
swdev

7
หลังจากเส้นทางการส่งออกฉันได้รับข้อผิดพลาดcannot install, GOBIN must be an absolute path:(
lee

@lee คุณใช้..หรือ~อยู่ในเส้นทางที่คุณระบุหรือไม่? ผมได้รับข้อผิดพลาดที่และเพียงแค่เปลี่ยนไปเส้นทางที่แน่นอนเช่นหรือแม้กระทั่ง/home/ben/bin/ $HOME/bin/คำสั่งเต็มรูปแบบของฉันคือ (ใน fishshell ไป env GOBIN=$HOME/bin/ go install testfile.gov1.11)
Benny Jobigan

40

ในฐานะผู้เริ่มต้นฉันพบข้อผิดพลาดนี้เมื่อฉันพยายามใช้คำสั่ง go ต่างๆ (สร้างเรียกใช้และติดตั้ง) ในระยะสั้นที่คุณไม่สามารถไปติดตั้งfilename.go filename.goคุณสามารถติดตั้งแพ็คเกจเท่านั้น

สิ่งนี้ทำให้สับสนเพราะฉันได้เรียนรู้ว่า:

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

ใช้งานได้ดี แต่ฉันคิดไม่ออกว่าทำไมการติดตั้งถึงใช้ไม่ได้:

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)

ไม่ว่าฉันจะอยู่ในไดเรกทอรีใด:

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)

ความสับสนนี้เป็นเพราะgo run ใช้ได้กับไฟล์ต้นฉบับของ Go เท่านั้น (ชื่อไฟล์ที่ลงท้ายด้วย. go ) และgo installยอมรับเฉพาะแพ็กเกจ แพ็กเกจตั้งชื่อตามพา ธ อิมพอร์ตหรือพา ธ ระบบไฟล์ ดังนั้น:

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

ทั้งหมดทำงานได้ดี อย่างแรกอ้างถึงแพ็กเกจตามเส้นทางการนำเข้า (กำหนดให้ $ GOPATH = "/ home / nate / work" เครื่องมือ go ค้นหาซอร์สโค้ดใน / home / nate / work / src) ส่วนอื่น ๆ จะถูกตีความว่าเป็นระบบไฟล์ เส้นทางเนื่องจากช่วงเวลานำหน้า

ดูเอกสาร GOPATHด้วย


1
นี่คือทางออกที่แท้จริง IMO go installทำงานกับไดเร็กทอรีและหากคุณระบุไฟล์ go โดยเฉพาะอาจทำให้เกิดปัญหานี้ได้
senseiwu

13

จริงๆแล้วมีพฤติกรรม 2 ประเภทที่แตกต่างกัน

go install <package>

สิ่งนี้จัดทำเป็นเอกสารในการคอมไพล์และติดตั้งแพ็คเกจและการอ้างอิง คุณไม่จำเป็นต้องใช้ GOBIN หากคุณตั้งค่า GOPATH อย่างถูกต้อง

go install <gofile>

สิ่งนี้ไม่ได้จัดทำเป็นเอกสารและคุณต้องใช้ตัวแปร GOBIN env ในโหมดนี้


1
go install <gofile>ได้รับการจัดทำเป็นเอกสารgo help packagesซึ่งgo install --helpอ้างถึง ปัญหาคือgo install(ใน 1.9.2 และก่อนหน้า) มีพฤติกรรมที่ไม่สอดคล้องกันในกรณีหนึ่งต้องใช้และอีกกรณีหนึ่งไม่จำเป็นต้องตั้งค่า GOBIN อย่างชัดเจน
Stevo Slavić

7

ตามคำตอบที่ชัดเจนหาก GOPATH env ของคุณถูกตั้งค่าอย่างถูกต้องในพื้นที่ทำงานของคุณคุณไม่จำเป็นต้องตั้งค่าตัวแปร GOBIN env

โปรดตรวจสอบตัวแปรสภาพแวดล้อม go ของคุณโดยเรียกใช้ $ go env | grep -i "^ GO" และมองหา GOROOT และ GOPATH เพื่อตรวจสอบว่า GOROOT ชี้ไปที่การติดตั้งแหล่งที่มาของ GO หรือไม่และ GOPATH ชี้ไปที่พื้นที่ทำงานของคุณหรือไม่

หากทุกอย่างถูกต้องให้ไปที่ subdir ที่ yourpkg.go อยู่จากนั้นเรียกใช้ $ go build (ไม่มีชื่อไฟล์) ก่อนและ $ go install (อีกครั้งด้วยชื่อไฟล์ของเรา) ที่สองหากคุณไม่เห็นข้อความแสดงข้อผิดพลาดใด ๆ บนหน้าจอของคุณ แพคเกจพร้อมที่พื้นที่ทำงานของคุณ / pkg / youros /../ yourpackage.a


7

บน windows ที่มี cygwin เป็นความคิดที่ดีที่จะตั้งค่า GOBIN เป็น $ GOPATH / bin

และอย่าลืมหลีกเลี่ยงตัวคั่นชื่อไฟล์ 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

สำหรับ*nixระบบให้ดูตำแหน่งที่goติดตั้งดำเนินการคำสั่งต่อไปนี้:

$ which go

ผลลัพธ์ใดที่สมมติว่า:

/usr/local/go/bin/go

จากนั้นเพิ่มรายการต่อไปนี้ใน~/.bash_profileหรือใน~/.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:อย่าลืมที่มา~/.bash_profileหรือ~/.zshrcดังต่อไปนี้:

$ source ~/.bash_profile

5
คุณต้องการให้ไฟล์ปฏิบัติการสำหรับการพัฒนาลดลงจริง/usr/local/go/binหรือ?
Dolph

1

เกี่ยวกับการตั้งค่าGOBINเวอร์ชันตัวแปรที่ไม่ต้องการและอาศัยเพียงGOPATH:

  1. GOBINเป็นสิ่งจำเป็นหากเราไม่มีแพ็คเกจนั่นคือไฟล์อยู่ในGOPATHไดเร็กทอรีโดยตรง นี่เป็นไปได้ว่าเรากำลังทดลองใช้คุณลักษณะ Go ในฐานะผู้เรียน

  2. สำหรับโครงการ Go ทั่วไปไฟล์จะอยู่ภายใต้ไดเร็กทอรีแพ็กเกจ สำหรับสิ่งเหล่านี้GOPATHดีพอ

  3. กล่าวอีกนัยหนึ่งทั้งสองวิธีแก้ไขปัญหาต่อไปนี้จะได้ผล: ตั้งค่าGOBINอย่างชัดเจนเป็น $ GOPATH / bin [เพื่อการเรียนรู้เท่านั้นที่สามารถหลีกเลี่ยงได้] b. สร้างไดเร็กทอรีย่อยซึ่งจะเป็นชื่อแพ็กเกจของคุณและย้ายไฟล์. go ไปที่มัน

  4. ฉันเดาว่าโปรแกรมอรรถประโยชน์ Go ควรลบข้อผิดพลาดข้างต้นและจัดการสถานการณ์ได้ดีขึ้น - ขึ้นอยู่กับว่าอาร์กิวเมนต์เป็นไดเร็กทอรีหรือซอร์สไฟล์


1

สำหรับWINDOWSผู้ใช้

เปิดพรอมต์คำสั่ง ( Win+ rแล้วพิมพ์cmd) หรือหน้าต่างพาวเวอร์เชลล์ ( Win+ xแล้วพิมพ์i)

การตั้งค่า GOPATH

หมายเหตุ: GOPATH ต้องไม่ใช่เส้นทางเดียวกับการติดตั้ง Go ของคุณ

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

รายละเอียดเพิ่มเติมในลิงค์ด้านล่าง https://github.com/golang/go/wiki/SettingGOPATH#windows

การตั้งค่า GOBIN

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

ฉันขอแนะนำให้ตรวจสอบตัวอย่างโค้ดที่ให้โดย golang มันช่วยฉันได้มาก https://golang.org/doc/code.html#Command


1

ใน Windows:

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

ยืนยันด้วยgo envคำสั่งว่า GOBIN ถูกตั้งค่าจากนั้นgo installคำสั่งจะบันทึกไฟล์ปฏิบัติการอย่างถูกต้องในไดเร็กทอรี bin


1

ฉันก็มีปัญหาเหมือนกัน (ไม่จำเป็นต้องตั้งค่า GOBIN แยกต่างหาก) โปรดตรวจสอบว่าคุณมีสิ่งต่อไปนี้

  1. มีการตั้งค่า GOPATH (ซึ่งจะตั้งค่า GOBIN เป็น $ GOPATH / bin โดยอัตโนมัติ)
  2. GOPATH มีไดเร็กทอรี bin, pkg, src ดังต่อไปนี้
  3. custom.go อยู่ใต้ src / <your_module>
  4. จากนั้นเรียกใช้ go install <your_module>
  5. คุณสามารถค้นหาการตรวจสอบไบนารีที่คอมไพล์แล้ว (<your_module>) ภายใต้โฟลเดอร์ bin

0

คุณไม่จำเป็นต้องใช้$ GOBINหากคุณตั้งค่า$ GOPATHอย่างถูกต้อง ในกรณีนี้ให้ตรวจสอบอีกครั้งว่าโครงการของคุณอยู่ในโฟลเดอร์$ GOPATH / srcหรือไม่


0

จากhttps://golang.org/cmd/go/#hdr-Environment_variables :

GOBIN ไดเร็กทอรีที่ "go install" จะติดตั้งคำสั่ง

และhttps://golang.org/cmd/go/#hdr-GOPATH_environment_variable :

หากตั้งค่าตัวแปรสภาวะแวดล้อม GOBIN คำสั่งจะถูกติดตั้งลงในไดเร็กทอรีที่ตั้งชื่อแทน DIR / bin GOBIN ต้องเป็นเส้นทางที่แน่นอน

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

ในโหมดรับรู้โมดูล GOPATH ไม่ได้กำหนดความหมายของการนำเข้าในระหว่างการสร้างอีกต่อไป แต่ยังคงเก็บการอ้างอิงที่ดาวน์โหลด (ใน GOPATH / pkg / mod) และคำสั่งที่ติดตั้งไว้ (ใน GOPATH / bin เว้นแต่จะตั้งค่า GOBIN ไว้)

ดังนั้นโดยพื้นฐานแล้วคุณสามารถใช้ GOBIN เพื่อแทนที่ตำแหน่งการติดตั้งไบนารีเริ่มต้นชั่วคราวหรือถาวร (เช่น$GOPATH/bin) ฉันประสบความสำเร็จในการติดตั้ง "script" 1-file go โดยใช้env GOBIN=$HOME/bin/ go install testfile.go. สิ่งนี้ทำได้โดยใช้ go v1.11


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.