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.