Artikel ini akan menjawab pertanyaan yang menyebabkan hilangnya waktu bagi banyak programmer: struktur direktori apa yang harus digunakan untuk proyek masa depan atau yang sudah ada? Struktur mana yang paling optimal tidak hanya untuk konsepsi proyek saat ini, tetapi tidak akan begitu menyakitkan di masa depan dalam hal memperluas proyek atau membaginya menjadi beberapa bagian?
Rooting
Jadi kami memulai proyek. Biarkan itu menjadi proyek termudah myapp. Kami membuat direktori untuk itu di folder utama untuk pengembangan (saya punya Devel ini).
mkdir myapp cd myapp
Di masa depan, semua tindakan akan berada di dalam katalog proyek utama
Git
Inisialisasi repositori kosong
git init
.gitignore
# *.pyc *.pyo **/__pycache__/ # **/config/ # **/data/ **/logs/ # ( ) **/bin/
Baca saya
Langkah selanjutnya adalah membuat file README yang dibutuhkan. File ini berisi deskripsi utama dan kunci dari proyek kami di masa depan. Beberapa membuat file teks / biasa yang disebut README.txt. Pada portal besar, repositori diterima untuk standar penurunan harga dengan nama README.md. Saya lebih suka html, karena lebih mudah bagi saya untuk membuat pilihan warna, tautan embed, gambar dan multimedia lainnya, buka di browser, sematkan potongan kode dalam tag <pre> dan <code>, gunakan kerangka kerja yang sudah jadi seperti Bootstrap untuk dekorasi dan keajaiban lain di luar Hogwarts. Dengan demikian, nama README.html
touch README.html
Jika proyek dilakukan oleh beberapa tim, maka saya merekomendasikan bahwa setiap tim memiliki file README sendiri di dalam setiap modul, komponen, pustaka, dll yang dikembangkan secara independen.
Aplikasi
Saya menamai direktori aplikasi utama dengan cara yang sama dengan direktori proyek. Dalam hal artikel ini, myapp
mkdir myapp touch myapp/__init__.py
Modul dan Komponen
Di dalam direktori aplikasi, __init__.py dibuat secara default, berisi kode inisialisasi aplikasi dan menghubungkan semua bagian yang diperlukan ke aplikasi. Secara khusus, ini adalah Cetak Biru untuk URL cabang tunggal atau ruang nama untuk logika layanan terpisah, tetapi dengan URL yang berbeda (contoh sederhana adalah membuat namespace untuk layanan artikel blog, di mana terdapat jalur jalur yang jelas dari formulir / halaman dan / halaman / ID)
mkdir myapp/bp_component touch myapp/bp_component/__init__.py
atau
mkdir myapp/ns_component touch myapp/ns_component/__init__.py
Model DB
Model database berisi kode inisialisasi database serta koneksi. Dan, tentu saja, struktur tabel dan hubungan. Juga diinginkan untuk memilih tabel dalam file yang terpisah berdasarkan pada logika bisnis aplikasi. Deskripsi beberapa kelas tabel dan tautan ke dalam satu file terpisah adalah mudah karena Anda dapat dengan mudah menggunakan kembali kode dengan menyalin file yang diinginkan ke proyek lain atau menggunakan tautan simbolis ke file dari perpustakaan bersama untuk proyek yang berbeda.
mkdir myapp/models touch myapp/models/__init__.py touch myapp/models/page.py
Templat untuk mesin templat
Beberapa aplikasi (terutama aplikasi web) ditandai dengan penggunaan templat untuk menghasilkan halaman daun. Karena tujuan utamanya adalah untuk memisahkan kode yang dapat dieksekusi dari penyajian data, langkah ini akan membantu tim menghemat banyak waktu, tenaga, dan uang dengan menyediakan kemungkinan kerja paralel antara programmer dan desainer.
mkdir myapp/templates mkdir myapp/templates/html mkdir myapp/templates/js mkdir myapp/templates/css
Saya perhatikan bahwa dalam kasus ini, subdirektori js dan css bukan untuk menyimpan pustaka JavaScript statis atau gaya CSS, tetapi untuk kode yang dapat diubah, kode parameter, atau kode semat. Misalnya, jika ada komponen rendering kalender dengan fungsi tambahan yang terhubung ke tombol, akan jauh lebih nyaman untuk meletakkan komponen kalender di js, dan untuk mengaktifkan komponen dalam file html, tetapi dengan parameter yang diperlukan. Mungkin ini akan terasa seperti omong kosong bagi seseorang, tetapi jauh lebih baik daripada membuat perpustakaan kalender statis yang sudah jadi, dan setelah setengah tahun atau setahun untuk memahami bahwa Anda perlu menambahkan beberapa properti dan metode pada komponen (misalnya, membuat datepicker tidak hanya dalam bentuk satu bulan, tetapi dan tambahkan kemampuan untuk mengubahnya menjadi kalender selama setahun), dan jenis sihir apa yang ada di dalamnya, tidak ada yang akan ingat. Sisipan akan memberikan lebih banyak transparansi.
Statika
Di sini, semua gaya utama yang tidak pernah berubah (atau sangat jarang berubah) adalah gaya, gambar, suara, pustaka dan kerangka kerja JS.
mkdir myapp/static mkdir myapp/static/css mkdir myapp/static/js mkdir myapp/static/images
Fungsi perpustakaan
Kemudahan menghubungkan perpustakaan tergantung terutama pada bahasa dan kerangka kerja pada inti aplikasi. TIDAK ada perpustakaan yang terhubung dari repositori dan didukung oleh pengembang independen. Inilah fungsi pembantu Anda sendiri. Sebagai contoh, saya memiliki beberapa fungsi dekorator saat memproses rute, tetapi sebelum memanggil fungsi utama.
mkdir myapp/lib touch myapp/lib/__init__.py
Pengaturan dan konfigurasi
Bagaimana cara menyimpan pengaturan yang menentukan pengaturan aplikasi global? Berapa banyak perkelahian dalam hal ini dan tidak masuk hitungan. Tanpa detail, bagaimana saya melakukannya: Saya menyimpannya sebagai modul Python di direktori terpisah. File di dalam untuk berbagai mode peluncuran.
mkdir config echo "CONFIG = 'config.devel'" > config/__init__.py touch config/devel.py touch config/prod.py
Mengapa py? Ya, karena penguraian XML, YAML, INI, dan omong kosong lainnya, ketika cukup mudah untuk membuat variabel formulir di tangan, belum diteruskan ke siapa pun:
import os DEBUG = True TITLE = 'SpecialistOff.NET' DIR_BASE = '/'.join(os.path.dirname(os.path.abspath(__file__)).split('/')[:-1]) DIR_DATA = DIR_BASE + '/data' DIR_FILES = DIR_DATA + '/files' MIMETYPES = { 'gif': 'image/gif', 'jpg': 'image/jpeg', 'jpeg': 'image/jpeg', 'png': 'image/png', 'txt': 'text/plain' } SERVERS = [ {'name': 'server1', 'IP': '8.8.8.8', 'port': '80'} ]
Data
File, log, dan data lainnya yang dimuat selama operasi disimpan dalam direktori data terpisah
mkdir data mkdir data/files
Pengujian
Modul dan perlengkapan uji
mkdir tests mkdir tests/fixture touch tests/__init__.py touch test.py chmod +x test.py
Dokumentasi
Semua dokumentasi proyek harus disimpan terpisah. Saya menggunakan direktori doc untuk ini dan menyimpannya sebagai halaman web statis dengan titik masuk index.html. Ini nyaman karena saya dapat berbagi direktori dokumentasi terpisah melalui server web apa pun. Atau jelajahi langsung dari direktori dengan peramban web apa pun (termasuk yang konsol seperti lynx, elinks).
mkdir doc touch doc/index.html
Penempatan
Itu semua tergantung tugas. Dan dalam komentar (menurut pendapat saya yang sederhana) tidak terlalu dibutuhkan.
mkdir deploy touch deploy/requirements.txt touch deploy/build.sh mkdir deploy/config touch deploy/config/__init__.py touch deploy/config/demo.py mkdir deploy/cron touch deploy/cron/myapp mkdir deploy/docker touch deploy/docker/Dockerfile touch deploy/docker/docker-compose.yml mkdir deploy/nginx touch deploy/nginx/myapp.conf mkdir deploy/uwsgi touch deploy/uwsgi/conf.ini mkdir deploy/uwsgi/conf.d touch deploy/uwsgi/conf.d/myapp.conf
Penebangan
Di sini Anda dapat menambahkan log untuk peluncuran tes atau kesimpulan dari aplikasi itu sendiri.
mkdir logs
Skrip dan utilitas pembantu
mkdir utils touch utils/useradd.py chmod +x utils/useradd.py
Alih-alih sebuah kesimpulan
Pada prinsipnya, itu saja. Kenapa aku begitu singkat? Karena kode akan berbicara untuk saya lebih baik daripada saya sendiri. Sisa komentar saya dapat membingungkan atau memicu kontroversi tentang pendekatan mana yang lebih baik / lebih buruk.