Catatan: pertanyaan ini terkait dengan yang satu ini , tetapi dua tahun adalah waktu yang sangat lama dalam sejarah Go.
Apa cara standar untuk mengatur proyek Go selama pengembangan?
Proyek saya adalah satu paket mypack
, jadi saya kira saya meletakkan semua file .go di mypack
direktori.
Tapi kemudian, saya ingin mengujinya selama pengembangan sehingga saya membutuhkan setidaknya file yang menyatakan main
paket, sehingga saya bisa melakukannyago run trypack.go
Bagaimana saya mengaturnya? Apakah saya perlu melakukannya go install mypack
setiap kali ingin mencobanya?
Jawaban:
Saya akan merekomendasikan meninjau halaman ini tentang Cara Menulis Kode Pergi
Ini mendokumentasikan baik bagaimana menyusun proyek Anda dengan
go build
cara yang ramah, dan juga bagaimana menulis tes. Tes tidak perlu cmd menggunakanmain
paket. Mereka hanya bisa menjadi fungsi bernama TestX sebagai bagian dari setiap paket, dan kemudiango test
akan menemukannya.Struktur yang disarankan dalam tautan itu dalam pertanyaan Anda agak ketinggalan jaman, sekarang dengan rilis Go 1. Anda tidak lagi perlu menempatkan
pkg
direktori di bawahsrc
. Hanya 3 direktori yang berhubungan dengan spesifikasi adalah 3 di root GOPATH Anda: bin, pkg, src. Di bawah src, Anda cukup menempatkan proyek Andamypack
, dan di bawahnya semua file .go Anda termasuk mypack_test.gogo build
kemudian akan membangun pkg dan bin level root.Jadi GOPATH Anda mungkin terlihat seperti ini:
export GOPATH=$HOME/projects
Pembaruan: pada> = Go 1.11, sistem Modul sekarang menjadi bagian standar dari perkakas dan konsep GOPATH hampir menjadi usang.
sumber
~
ketika mengatur variabel lingkungan , dan begitu pula shell bourne busybox, misalnya. Cobalah sendiri:export BOB=~ && env | grep ^BOB
akan menghasilkanBOB=/your/homedir
$HOME
bekerja di lebih banyak kerang kemudian~
, misalnya difish
jdi memiliki informasi yang benar mengenai penggunaan
GOPATH
. Saya akan menambahkan bahwa jika Anda berniat untuk memiliki biner juga, Anda mungkin ingin menambahkan satu level tambahan ke direktori.running
go build myproj/mypack
akan membangunmypack
paket beserta dependensinya menjalankan,go build myproj/myapp
akan membangunmyapp
biner beserta dependensinya yang mungkin termasukmypack
pustaka.sumber
Saya telah mempelajari sejumlah proyek Go dan ada sedikit variasi. Anda dapat memberi tahu siapa yang datang dari C dan siapa yang datang dari Jawa, karena mantan membuang hampir semua yang ada di direktori root proyek dalam sebuah
main
paket, dan yang terakhir cenderung untuk meletakkan semuanya disrc
direktori. Namun tidak ada yang optimal. Masing-masing memiliki konsekuensi karena mereka memengaruhi jalur impor dan bagaimana orang lain dapat menggunakannya kembali.Untuk mendapatkan hasil terbaik saya telah mengerjakan pendekatan berikut.
Di mana
mypack.go
adalahpackage mypack
danmain/mypack.go
(jelas)package main
.Jika Anda memerlukan file dukungan tambahan, Anda memiliki dua pilihan. Simpan semuanya di direktori root, atau letakkan file dukungan pribadi di
lib
subdirektori. MisalnyaAtau
Hanya masukkan file dalam
lib
direktori jika tidak dimaksudkan untuk diimpor oleh proyek lain. Dengan kata lain, jika itu file pendukung pribadi . Itulah ide di balik memilikilib
- untuk memisahkan publik dari antarmuka pribadi.Melakukan hal-hal seperti ini akan memberi Anda jalur impor yang bagus,
myproj.org/mypack
untuk menggunakan kembali kode dalam proyek lain. Jika Anda menggunakanlib
maka file dukungan internal akan memiliki jalur impor yang menunjukkan itumyproj.org/lib/mysupport
,.Saat membangun proyek, gunakan
main/mypack
, misalnyago build main/mypack
. Jika Anda memiliki lebih dari satu yang dapat dieksekusi, Anda juga dapat memisahkannya di bawahmain
tanpa harus membuat proyek terpisah. misalnyamain/myfoo/myfoo.go
danmain/mybar/mybar.go
.sumber
cmd/nameOfMyExecutable
sub-direktori untuk paket utama (hanya perlucmd/…
jika Anda memiliki banyak perintah; lihatgolang.org/x/tools/cmd
; jika tidak, itu umum untuk bertukar sekitar dan adamain.go
di tingkat atas). Cara Anda memilikinyago install
akan membuat executable "main" (atau "main.exe"). Juga, idiomatic adalah menggunakaninternal
sub-direktori untuk sub-paket internal ke paket / program yang tidak dimaksudkan untuk digunakan di tempat lain (diharapkan versi Go di masa depan akan memberlakukan tidak ada orang lain yang mengimporinternal
paket yang dilakukan dengan cara ini).Saya merasa sangat berguna untuk memahami bagaimana mengatur kode di Golang bab ini http://www.golang-book.com/11 dari buku yang ditulis oleh Caleb Doxsey
sumber
Tampaknya tidak ada cara standar untuk mengatur proyek Go tetapi https://golang.org/doc/code.html menetapkan praktik terbaik untuk sebagian besar proyek. Jawaban jdi baik tetapi jika Anda menggunakan github atau bitbucket dan Anda memiliki perpustakaan tambahan juga, Anda harus membuat struktur berikut:
Dengan melakukannya dengan cara ini, Anda dapat memiliki repositori terpisah untuk mylib yang dapat digunakan untuk proyek lain dan dapat diambil dengan "go get". Proyek mypack Anda dapat mengimpor perpustakaan Anda menggunakan "github.com/username/mylib". Untuk informasi lebih lanjut:
http://www.alexvictorchan.com/2014/11/06/go-project-structure/
sumber
Simpan file dalam direktori yang sama dan gunakan
package main
di semua file.Lalu lari:
sumber
Mari kita menjelajahi bagaimana
go get repository_remote_url
perintah mengelola struktur proyek di bawah$GOPATH
. Jika kita lakukan,go get github.com/gohugoio/hugo
itu akan mengkloning repositori di bawahIni adalah cara yang bagus untuk membuat jalur proyek awal Anda . Sekarang mari kita menjelajahi apa jenis proyek di luar sana dan bagaimana struktur bagian dalamnya diorganisir. Semua proyek golang di komunitas dapat dikategorikan dalam
Libraries
(tidak ada binari yang dapat dieksekusi)Single Project
(hanya mengandung 1 biner yang dapat dieksekusi)Tooling Projects
(mengandung beberapa binari yang dapat dieksekusi)Umumnya file proyek golang dapat dikemas dalam prinsip desain seperti DDD , POD
Sebagian besar proyek go yang tersedia mengikuti Desain Berorientasi Paket ini
Desain Berorientasi Paket mendorong pengembang untuk menjaga implementasi hanya di dalam paket itu sendiri, selain
/internal
paket paket-paket itu tidak dapat berkomunikasi satu sama lainPerpustakaan
/internal
Paket ini terutama digunakan untuk menyembunyikan implementasi dari proyek lain.Proyek tunggal
Proyek Perkakas
cmd/
paket mengatur jumlah binari (alat) yang ingin kita bangunsumber