วิธีการคอมไพล์โปรแกรม Go ประกอบด้วยไฟล์หลาย ๆ ไฟล์?


89

ฉันมีโปรแกรมขนาดเล็กที่ประกอบด้วยไฟล์สามไฟล์ซึ่งทั้งหมดอยู่ในแพ็คเกจเดียวกัน (หลัก) แต่เมื่อฉันทำ "go build main.go" การสร้างไม่สำเร็จ เมื่อเป็นเพียงไฟล์เดียว (main.go) ทุกอย่างทำงานได้ดี ตอนนี้ฉันใช้ความพยายามในการแยกโค้ดดูเหมือนว่าคอมไพเลอร์ไม่สามารถค้นหาสิ่งที่นำออกจาก main.go และใส่ลงในไฟล์อื่น ๆ อีกสองไฟล์นี้ (ซึ่งอยู่ในไดเร็กทอรีเดียวกับ main.go) . ซึ่งส่งผลให้เกิดข้อผิดพลาด "ไม่ได้กำหนด" ประเภท "

จะคอมไพล์โปรแกรมที่ประกอบด้วยไฟล์หลาย ๆ ไฟล์ได้อย่างไร?

คำตอบ:


87

วิธีใหม่ ( แนะนำ ):

โปรดดูคำตอบนี้

ทางเก่า:

สมมติว่าคุณกำลังเขียนโปรแกรมชื่อ myprog:

ใส่ไฟล์ทั้งหมดของคุณในไดเร็กทอรีแบบนี้

myproject/go/src/myprog/xxx.go

จากนั้นเพิ่มmyproject/goไปที่ GOPATH

และเรียกใช้

go install myprog

ด้วยวิธีนี้คุณจะสามารถเพิ่มแพ็คเกจและโปรแกรมอื่น ๆ ใน myproject / go / src ได้หากต้องการ

อ้างอิง: http://golang.org/doc/code.html

(เอกสารนี้มักจะพลาดโดยผู้มาใหม่และมักจะเข้าใจไม่ดีในตอนแรกเอกสารนี้ควรได้รับความสนใจมากที่สุดจาก IMO ของทีม Go)


5
ทำไมไม่กำจัด / go / และทำ myproject / src
Alexander Mills

นอกจากนี้ฉันถือว่า "go install myprog" เขียนแหล่งที่มาของโครงการในตำแหน่ง $ GOPATH อย่างใด นั่นถูกต้องใช่ไหม? ถ้าเป็นเช่นนั้นก็คงจะดีหากมีคำอธิบายเป็นส่วนหนึ่งของคำตอบเช่นกัน
Alexander Mills

1
@AlexanderMills มีเพียงโครงการเล็ก ๆ ที่ใช้เทคโนโลยีเพียงอย่างเดียว
Denys Séguret

2
@ DenysSéguretไม่แน่ใจว่าฉันเห็นด้วยกับสิ่งนั้น แต่อย่างไรก็ตามนี่เป็นโครงการที่เรียบง่ายคุณสามารถทิ้งส่วนไปได้ - ผู้คนอาจคิดว่าสิ่งที่ต้องไปเป็นสิ่งที่จำเป็นและไม่ใช่ คุณบอกฉันว่าแบบไหนง่ายกว่าไปหรือไม่ไป? :)
Alexander Mills

1
ฉันยังไม่เข้าใจว่าทำไมโครงสร้างโฟลเดอร์นี้?
Madeo

67

main.goตัวอย่างเช่นเมื่อคุณแยกโค้ดออกจากmore.goกันคุณก็เพียงแค่ส่งไฟล์นั้นไปที่go build/ go run/ go installด้วย

ดังนั้นหากคุณเคยวิ่งมาก่อน

go build main.go

ตอนนี้คุณเพียงแค่

go build main.go more.go

เป็นข้อมูลเพิ่มเติม:

go build --help

รัฐ:

หากอาร์กิวเมนต์เป็นรายการของไฟล์. go ให้ build ถือว่าเป็นรายการของไฟล์ต้นฉบับที่ระบุแพ็กเกจเดียว


ขอให้สังเกตว่าgo buildและgo installแตกต่างจากgo runในการที่รัฐสองคนแรกที่คาดว่าจะชื่อแพคเกจเป็นข้อโต้แย้งในขณะที่คาดว่าหลังไปไฟล์ อย่างไรก็ตามสองรายการแรกจะยอมรับไฟล์ go เมื่อ go ติดตั้ง

หากคุณสงสัย: build จะเป็นเพียงbuildแพ็กเกจ / ไฟล์installจะสร้างอ็อบเจ็กต์และไฟล์ไบนารีใน GOPATH ของคุณและrunจะคอมไพล์และรันโปรแกรมของคุณ


6
หากคุณไม่ต้องการเพิ่มไฟล์มากขึ้นเรื่อย ๆ ให้ใช้ regex ด้วย: go run *
.go

โอเคขอบคุณ Go เขียนไฟล์ปฏิบัติการเพียงไฟล์เดียวหรือไม่? มันไม่แยกไฟล์ปฏิบัติการออกจากกัน (เหมือนใน Java)?
Alexander Mills

@AlexanderMills เพราะ windows ฉันคิดว่าใช้ nix หรืออย่างน้อย mingw
Sergey Gorlanov

ใช่ฉันใช้ MacOS แต่บางทีมันอาจจะเป็น Bash เวอร์ชัน 3 ที่กำลังมีปัญหาฉันควรอัปเกรดเป็น Bash 4
Alexander Mills

30

คุณยังสามารถเรียกใช้

go build

ในโฟลเดอร์โครงการของคุณ myproject / go / src / myprog

จากนั้นคุณสามารถพิมพ์

./myprog

เพื่อเรียกใช้แอปของคุณ


3
ผลลัพธ์เป็นวัตถุ go ไม่ใช่ไฟล์ปฏิบัติการ
user2284570

@ user2284570 เพียงแค่เพิ่มchmod +xสิทธิ์ให้ไฟล์นั้นทำงานได้
dalmate

21

ตั้งแต่ Go 1.11+ จึงไม่แนะนำให้ใช้ GOPATH อีกต่อไปวิธีใหม่คือการใช้ Go Modules

สมมติว่าคุณกำลังเขียนโปรแกรมชื่อsimple:

  1. สร้างไดเร็กทอรี:

    mkdir simple
    cd simple
    
  2. สร้างโมดูลใหม่:

    go mod init github.com/username/simple
    # Here, the module name is: github.com/username/simple.
    # You're free to choose any module name.
    # It doesn't matter as long as it's unique.
    # It's better to be a URL: so it can be go-gettable.
    
  3. ใส่ไฟล์ทั้งหมดของคุณในไดเร็กทอรีนั้น

  4. สุดท้ายเรียกใช้:

    go run .
    
  5. หรือคุณสามารถสร้างโปรแกรมปฏิบัติการได้โดยการสร้าง:

    go build .
    
    # then:
    ./simple     # if you're on xnix
    
    # or, just:
    simple       # if you're on Windows
    

สำหรับข้อมูลเพิ่มเติมคุณอาจจะอ่านนี้

Go ได้รวมการสนับสนุนสำหรับโมดูลเวอร์ชันตามที่เสนอไว้ที่นี่ตั้งแต่ 1.11 vgo ต้นแบบเริ่มต้นได้รับการประกาศในเดือนกุมภาพันธ์ 2018 ในเดือนกรกฎาคม 2018 โมดูลที่เป็นเวอร์ชันจะลงจอดในที่เก็บ Go หลัก ใน Go 1.14 การสนับสนุนโมดูลถือว่าพร้อมสำหรับการใช้งานจริงและผู้ใช้ทุกคนควรย้ายไปยังโมดูลจากระบบการจัดการการพึ่งพาอื่น ๆ



6

ขึ้นอยู่กับโครงสร้างโครงการของคุณ แต่ตรงไปตรงมาที่สุดคือ:

go build -o ./myproject ./...

./myprojectจากนั้นก็วิ่ง

สมมติว่าโครงสร้างโครงการของคุณมีลักษณะเช่นนี้

- hello
|- main.go

จากนั้นคุณก็ไปที่ไดเรกทอรีโครงการและเรียกใช้

go build -o ./myproject

จากนั้นรัน./myprojectบนเชลล์

หรือ

# most easiest; builds and run simultaneously
go run main.go

สมมติว่าไฟล์หลักของคุณซ้อนอยู่ในไดเร็กทอรีย่อยเช่นไฟล์ cmd

- hello
|- cmd
 |- main.go

จากนั้นคุณจะวิ่ง

go run cmd/main.go

3

ได้! ตรงไปตรงมามากและนั่นคือจุดเริ่มต้นของกลยุทธ์แพ็กเกจ มีสามวิธีในการหาความรู้ของฉัน โครงสร้างโฟลเดอร์:

คำเตือน GOPATH / src / github.com/ abc / myproject / adapter / main.go pkg1 pkg2: อะแดปเตอร์สามารถมีไดเร็กทอรีหลักของแพ็กเกจเท่านั้นและไดเร็กทอรี sun

  1. ไปที่โฟลเดอร์ "อะแดปเตอร์" วิ่ง:
    go build main.go
  1. ไปที่โฟลเดอร์ "อะแดปเตอร์" วิ่ง:
    go build main.go
  1. ไปที่ GOPATH / src รู้จักพา ธ สัมพัทธ์ไปยังแพ็กเกจหลักที่นี่ "myproject / adapter" วิ่ง:
    go build myproject/adapter

ไฟล์ exe จะถูกสร้างขึ้นที่ไดเร็กทอรีที่คุณอยู่ในขณะนี้

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