Bagaimana cara mengkompilasi program Go yang terdiri dari banyak file?


89

Saya memiliki program kecil yang terdiri dari tiga file, semuanya termasuk dalam paket yang sama (utama), tetapi ketika saya melakukan "go build main.go", build tidak berhasil. Ketika itu hanya satu file (main.go) semuanya bekerja dengan baik. Sekarang setelah saya berusaha untuk memisahkan kode, sepertinya kompiler tidak dapat menemukan hal-hal yang dikeluarkan dari main.go dan dimasukkan ke dalam dua file lainnya (yang berada di direktori yang sama dengan main.go) . Yang menghasilkan kesalahan "jenis 'tidak ditentukan".

Bagaimana cara mengkompilasi program ini yang terdiri dari banyak file?

Jawaban:


87

Cara Baru ( Disarankan ):

Silakan lihat jawaban ini .

Cara Lama:

Misalkan Anda sedang menulis program bernama myprog:

Letakkan semua file Anda dalam direktori seperti ini

myproject/go/src/myprog/xxx.go

Kemudian tambahkan myproject/goke GOPATH

Dan lari

go install myprog

Dengan cara ini Anda akan dapat menambahkan paket dan program lain di myproject / go / src jika Anda mau.

Referensi: http://golang.org/doc/code.html

(dokumen ini selalu dirindukan oleh pendatang baru, dan sering kali tidak dipahami pada awalnya. Dokumen ini harus mendapat perhatian terbesar dari tim Go IMO)


5
mengapa tidak menyingkirkan / go / dan lakukan saja myproject / src?
Alexander Mills

juga, saya berasumsi "go install myprog" entah bagaimana menulis sumber proyek ke lokasi $ GOPATH? Apakah itu benar? jika demikian, alangkah baiknya memiliki penjelasan itu sebagai bagian dari jawaban juga
Alexander Mills

1
@AlexanderMills Hanya proyek kecil yang menggunakan hanya satu teknologi.
Denys Séguret

2
@ DenysSéguret tidak yakin saya setuju dengan itu, tapi bagaimanapun ini untuk proyek sederhana, Anda bisa melepaskan bagian go - orang mungkin berasumsi bahwa hal pergi itu perlu dan sebenarnya tidak. Anda beri tahu saya, mana yang lebih sederhana, pergi atau tidak? :)
Alexander Mills

1
Saya masih tidak mengerti mengapa struktur folder ini?
Madeo

67

Saat Anda memisahkan kode dari main.gomenjadi misalnya more.go, Anda cukup meneruskan file itu ke go build/ go run/ go installjuga.

Jadi jika sebelumnya Anda berlari

go build main.go

Anda sekarang sederhana

go build main.go more.go

Sebagai informasi lebih lanjut:

go build --help

menyatakan:

Jika argumennya adalah daftar file .go, build akan memperlakukannya sebagai daftar file sumber yang menentukan satu paket.


Perhatikan bahwa go builddan go installberbeda dari go rundua status pertama yang mengharapkan nama paket sebagai argumen, sedangkan yang terakhir mengharapkan file go . Namun, dua yang pertama juga akan menerima file go seperti halnya go install.

Jika Anda bertanya-tanya: build hanya akan buildpaket / file, installakan menghasilkan objek dan file biner di GOPATH Anda, dan runakan mengkompilasi dan menjalankan program Anda.


6
Jika Anda tidak ingin terus menambahkan lebih banyak file, gunakan regex, dengan: go run * .go
NateW

ok terima kasih, apakah Go selalu menulis hanya satu file yang dapat dieksekusi? Itu tidak memisahkan file yang dapat dieksekusi (seperti di Java)?
Alexander Mills

@AlexanderMills karena windows, saya pikir, gunakan nix. atau setidaknya mingw.
Sergey Gorlanov

ya saya menggunakan MacOS, tapi mungkin Bash versi 3 yang kacau, saya harus meningkatkan ke Bash 4.
Alexander Mills

30

Anda juga bisa lari

go build

di folder proyek Anda myproject / go / src / myprog

Kemudian Anda tinggal mengetik

./myprog

untuk menjalankan aplikasi Anda


3
outputnya adalah go object, bukan executable.
pengguna2284570

@ user2284570 cukup tambahkan chmod +xizin untuk file itu untuk menjalankannya
dalmate

21

Sejak Go 1.11+, GOPATH tidak lagi direkomendasikan, cara baru menggunakan Go Modules.

Misalkan Anda sedang menulis program bernama simple:

  1. Buat direktori:

    mkdir simple
    cd simple
    
  2. Buat modul baru:

    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. Letakkan semua file Anda di direktori itu.

  4. Terakhir, jalankan:

    go run .
    
  5. Alternatifnya, Anda dapat membuat program yang dapat dieksekusi dengan membangunnya:

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

Untuk informasi lebih lanjut, Anda dapat membaca ini .

Go telah menyertakan dukungan untuk modul berversi seperti yang diusulkan di sini sejak 1.11. Prototipe awal vgo diumumkan pada Februari 2018. Pada Juli 2018, modul berversi mendarat di gudang Go utama. Di Go 1.14, dukungan modul dianggap siap untuk penggunaan produksi, dan semua pengguna didorong untuk bermigrasi ke modul dari sistem manajemen ketergantungan lainnya.


7

Kamu dapat memakai

go build *.go 
go run *.go

keduanya akan bekerja juga dapat Anda gunakan

go build .
go run .

6

Itu tergantung pada struktur proyek Anda. Tapi yang paling mudah adalah:

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

lalu lari ./myproject.

Misalkan struktur proyek Anda terlihat seperti ini

- hello
|- main.go

lalu Anda hanya pergi ke direktori proyek dan menjalankan

go build -o ./myproject

lalu jalankan ./myprojectdi shell.

atau

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

misalkan file utama Anda berada di sub-direktori seperti cmd

- hello
|- cmd
 |- main.go

maka kamu akan lari

go run cmd/main.go

3

Ya! Itu sangat mudah dan di situlah strategi paket berperan. ada tiga cara untuk pengetahuan saya. struktur folder:

GOPATH / src / github.com/ abc / myproject / adapter / main.go pkg1 pkg2 peringatan: adaptor hanya dapat berisi paket utama dan direktori sun

  1. arahkan ke folder "adaptor". Lari:
    go build main.go
  1. arahkan ke folder "adaptor". Lari:
    go build main.go
  1. arahkan ke GOPATH / src mengenali jalur relatif ke paket utama, di sini "myproject / adapter". Lari:
    go build myproject/adapter

File exe akan dibuat di direktori Anda saat ini.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.