Gambaran
Ini adalah tata letak dasar untuk proyek aplikasi Go. Ini bukan standar yang secara resmi ditentukan oleh tim pengembangan inti Go
; ini adalah tata letak direktori yang umum digunakan untuk proyek-proyek komunitas Go.
Jika Anda sedang belajar Go atau membuat bukti konsep (PoC) atau proyek pribadi sederhana, tata letak proyek ini terlalu rumit. Sebaliknya, mulailah dengan tata letak yang benar-benar sederhana (hanya berkas
main.go dan
go.mod cukup).
Saat proyek Anda berkembang, pastikan struktur kode Anda baik, jika tidak, Anda akan berakhir dengan kode yang berantakan yang mengandung banyak ketergantungan tersembunyi dan status global. Ketika lebih banyak orang terlibat dalam proyek, Anda memerlukan cara yang lebih terstruktur. Dalam hal ini, penting untuk memperkenalkan cara umum untuk mengelola paket/pustaka. Ketika Anda memiliki proyek open-source atau mengetahui bahwa proyek lain mengimpor kode dari repositori proyek Anda, memiliki paket dan kode pribadi (juga dikenal sebagai paket internal
) menjadi penting. Klona repositorinya, simpan bagian yang Anda butuhkan, dan hapus segala sesuatu yang lain! Hanya karena itu ada, tidak berarti Anda harus menggunakannya semua. Tidak satu pun dari pola ini digunakan dalam setiap proyek. Bahkan pola vendor
pun tidak universal.
Tata letak proyek ini sengaja dirancang untuk sangat umum dan tidak berusaha untuk menegakkan struktur paket Go tertentu.
Spesifikasi Direktori Proyek Go
Berikut adalah spesifikasi direktori proyek Go yang direkomendasikan.
.
├── go.mod
├── api
├── assets
├── build
├── cmd
├── configs
├── deployments
├── docs
├── examples
├── githooks
├── go.mod
├── init
├── internal
├── pkg
├── scripts
├── test
├── third_party
├── tools
├── vendor
├── web
└── website
Arti dari setiap direktori dijelaskan di bawah ini.
/cmd
Aplikasi utama untuk proyek, yaitu, titik masuk dari program. Berkas Go dalam direktori ini biasanya menghasilkan berkas eksekusi. Dalam proyek sederhana, sebuah berkas seperti /test/main.go dapat berfungsi sebagai titik masuk.
Nama direktori untuk setiap aplikasi harus sesuai dengan nama berkas eksekusi yang Anda inginkan (mis., /cmd/myapp
).
Jangan letakkan terlalu banyak kode dalam direktori aplikasi. Jika Anda berpikir kode tersebut dapat diimpor dan digunakan di proyek lain, letakkan di direktori /pkg
. Jika kode tersebut tidak dapat digunakan kembali atau Anda tidak ingin orang lain menggunakannya kembali, letakkan kode di direktori /internal
. Anda akan terkejut dengan perilaku orang lain, jadi sampaikan niat Anda dengan jelas!
Biasanya ada fungsi main
kecil yang mengimpor dan memanggil kode dari direktori /internal
dan /pkg
, dan tidak ada yang lain.
/internal
Kode aplikasi dan pustaka pribadi. Ini adalah kode yang tidak ingin Anda diimpor oleh orang lain ke aplikasi atau pustaka mereka. Perlu diingat bahwa pola tata letak ini ditegakkan oleh kompilator Go itu sendiri. Untuk informasi lebih detail, silakan merujuk ke catatan rilis untuk Go 1.4. Perlu diingat bahwa ini tidak terbatas pada direktori internal
tingkat atas. Anda dapat memiliki beberapa direktori internal
di setiap tingkat pohon proyek.
Anda dapat memilih untuk menambahkan beberapa struktur tambahan untuk paket internal untuk membedakan antara kode internal yang dibagikan dan tidak dibagikan. Ini tidak diperlukan (terutama untuk proyek-proyek kecil), tetapi secara visual menunjukkan penggunaan yang dimaksud dari paket adalah praktek yang baik. Kode aplikasi aktual Anda dapat ditempatkan di dalam direktori /internal/app
(misalnya, /internal/app/myapp
), dan kode yang dibagikan untuk aplikasi ini dapat ditempatkan di dalam direktori /internal/pkg
(misalnya, /internal/pkg/myprivlib
).
/pkg
Kode pustaka yang dapat digunakan oleh aplikasi eksternal (mis., /pkg/mypubliclib
). Proyek lain akan mengimpor pustaka-pustaka ini dan mengharapkan agar pustaka-pustaka tersebut berfungsi dengan baik, jadi pertimbangkan dengan seksama sebelum menempatkan konten di sini :-) Perlu diingat bahwa direktori internal
adalah cara yang lebih baik untuk memastikan bahwa paket-paket pribadi tidak dapat diimpor, karena hal ini ditegakkan oleh Go itu sendiri. Direktori /pkg
masih merupakan cara yang baik untuk secara eksplisit menyampaikan bahwa kode dalam direktori ini aman digunakan oleh orang lain.
Jika proyek aplikasi Anda sangat kecil dan penanaman bertingkat tidak menambah banyak nilai, tidak apa-apa untuk tidak menggunakannya (kecuali jika Anda benar-benar ingin menggunakannya :-)). Ketika proyek menjadi cukup besar dan direktori akar menjadi sangat sibuk, pertimbangkan untuk menggunakannya (terutama jika Anda memiliki banyak komponen aplikasi non-Go).
/vendor
Ketergantungan aplikasi (dikelola secara manual atau menggunakan alat manajemen ketergantungan pilihan Anda, seperti fitur bawaan Go Modules
). Perintah go mod vendor
akan membuat direktori /vendor
untuk Anda. Perhatikan bahwa jika Anda tidak menggunakan versi Go 1.14 yang default diaktifkan, Anda mungkin perlu menambahkan flag -mod=vendor
ke perintah go build
.
Jika Anda membangun sebuah pustaka, jangan meng-commit ketergantungan aplikasi Anda.
Direktori Aplikasi Layanan
/api
Spesifikasi OpenAPI/Swagger, file skema JSON, file definisi protokol, dan direktori protokol API.
Direktori Aplikasi Web
/web
Komponen-komponen khusus untuk aplikasi web: aset-aset situs web statis, template sisi server, dan aplikasi satu halaman (SPA).
Direktori Aplikasi Umum
/configs
Template file konfigurasi atau konfigurasi default.
Letakkan file template confd
atau consul-template
di sini.
/init
Inisialisasi sistem (systemd, upstart, sysv) dan konfigurasi manajer proses/daemon (runit, supervisord).
/scripts
Skrip untuk berbagai operasi pembangunan, instalasi, analisis, dan lainnya.
/build
Pengemasan dan integrasi berkelanjutan.
Letakkan konfigurasi paket cloud (AMI), kontainer (Docker), paket sistem operasi (deb, rpm, pkg), dan skrip di direktori /build/package
.
Letakkan konfigurasi integrasi berkelanjutan (travis, circle, drone) dan skrip di direktori /build/ci
. Harap dicatat bahwa beberapa alat integrasi berkelanjutan (seperti Travis CI) sangat spesifik tentang lokasi file konfigurasi mereka. Cobalah untuk menempatkan file konfigurasi di direktori /build/ci
dan gunakan tautan untuk menghubungkannya ke lokasi yang diharapkan oleh alat integrasi berkelanjutan (jika memungkinkan).
/deployments
Konfigurasi pemasangan dan template untuk IaaS, PaaS, sistem, dan orkestrasi kontainer (docker-compose, kubernetes/helm, terraform). Harap dicatat bahwa dalam beberapa repositori (terutama untuk aplikasi yang diimplementasikan menggunakan Kubernetes), direktori ini disebut /deploy
.
/test
Aplikasi pengujian eksternal dan data uji lainnya. Silakan atur direktori /test
sesuai kebutuhan Anda. Untuk proyek yang lebih besar, mengatur data ke dalam subdirektori masuk akal. Misalnya, Anda dapat membuat direktori /test/data
atau /test/testdata
di dalam /test
untuk membuat Go mengabaikan isinya. Harap dicatat bahwa Go juga mengabaikan direktori atau file yang diawali dengan "." atau "_", memberikan fleksibilitas yang lebih besar saat memberi nama direktori data uji.
Direktori Lainnya
/docs
Dokumentasi desain dan penggunaan (selain dokumen godoc yang Anda hasilkan).
/tools
Alat penunjang untuk proyek ini. Harap dicatat bahwa alat-alat ini dapat mengimpor kode dari direktori /pkg
dan /internal
.
/examples
Contoh aplikasi dan/atau pustaka publik.
/third_party
Alat bantu eksternal, kode bercabang, dan alat utilitas pihak ketiga lainnya (misalnya, Swagger UI).
/githooks
Git hooks.
/assets
Aset tambahan (gambar, logo, dll.) yang disediakan dengan repositori.
/website
Tempat untuk menyimpan data situs proyek jika Anda tidak menggunakan GitHub Pages.
/src
Beberapa proyek Go mungkin memiliki folder src
, tetapi ini biasanya karena pengembang berasal dari dunia Java, di mana itu adalah pola umum. Jika memungkinkan, hindari mengadopsi pola mirip Java ini. Anda benar-benar tidak ingin kode atau proyek Go Anda terlihat seperti Java :-)
Jangan bingungkan direktori /src
tingkat proyek dengan direktori /src
yang digunakan untuk ruang kerja Go, seperti yang dijelaskan dalam Cara Menulis Kode Go
. Variabel lingkungan $GOPATH
menunjuk ke ruang kerja (saat ini) Anda (secara default, pada sistem non-Windows, itu menunjuk ke direktori $HOME/go
). Ruang kerja ini mencakup direktori tingkat atas /pkg
, /bin
, dan /src
. Proyek aktual Anda akan menjadi subdirektori di bawah direktori /src
, jadi jika proyek Anda memiliki direktori /src
, jalur proyek akan terlihat seperti ini: /beberapa/path/ke/ruang_kerja/src/proyek_anda/src/kode_anda.go
. Harap dicatat bahwa mulai dari Go 1.11, proyek Anda dapat berada di luar GOPATH
, tetapi itu tidak berarti menggunakan pola layout ini adalah ide bagus.