Saat ini saya sedang menulis beberapa skrip untuk Bot Land . Bot Land adalah gim strategi real-time di mana alih-alih mengendalikan unit Anda dengan mouse dan keyboard, Anda menulis kode untuk mengontrol bot Anda melalui API, dan kemudian bot Anda bertarung melawan bot orang lain. Jika Anda terbiasa dengan unit di SC2, Anda dapat membuat bot yang mirip dengan penguntit kedip, tangki pengepungan, petugas medis, dan ultralis. (Ini adalah permainan yang cukup menyenangkan untuk insinyur perangkat lunak, tapi itu di luar cakupan pertanyaan ini.)
Kontrol bot memiliki tiga tingkat peningkatan kompleksitas: AI default, bahasa pemrograman seperti Scratch , dan serangkaian JavaScript yang dikurangi yang disebut BotLandScript. Meskipun editor bawaan untuk BotLandScript masuk akal, Anda harus mengunggah semua kode Anda sebagai satu file tunggal dengan fungsi tingkat global di mana-mana. Secara alami, ini mulai menyakitkan setelah beberapa saat jika kode Anda mulai menjadi panjang dan berbagai bot berbagi fungsi yang sama.
Untuk memfasilitasi penulisan kode untuk banyak bot, kurangi peluang untuk kesalahan yang tidak disengaja saat pengkodean di bare JS, dan tingkatkan peluang saya untuk mengalahkan pemain lain, saya menyiapkan proyek TypeScript di atas untuk menyediakan perpustakaan umum serta kode untuk setiap bot saya . Struktur direktori saat ini terlihat kira-kira seperti berikut ini:
lib/
bot.land.d.ts
common.ts
BlinkStalker/
BlinkStalker.ts
tsconfig.json
Artillery/
Artillery.ts
tsconfig.json
SmartMelee/
SmartMelee.ts
tsconfig.json
lib
adalah kode umum yang dibagikan di antara bot, dan memberikan definisi TypeScript untuk API Bot Tanah (non-TS). Setiap bot kemudian mendapatkan foldernya sendiri, dengan satu file yang berisi kode bot dan satunya lagi adalah boilerplate tsconfig.json
:
{
"compilerOptions": {
"target": "es3",
"module": "none",
"sourceMap": false,
"outFile": "bot.js"
},
"files": [
"MissileKite.ts"
],
"include": [
"../lib/**/*"
]
}
Ketika masing tsconfig.json
- masing dibangun, itu menciptakan yang sesuai bot.js
yang berisi kode yang diubah dari bot itu sendiri serta semua kode di dalamnya common.js
. Pengaturan ini tidak optimal karena beberapa alasan, antara lain: memerlukan banyak duplikat boilerplate, membuatnya sulit untuk menambahkan bot baru, termasuk banyak kode yang tidak perlu untuk setiap bot, dan mengharuskan setiap bot dibangun secara terpisah.
Namun, berdasarkan penelitian saya sejauh ini , sepertinya tidak ada cara mudah untuk melakukan apa yang saya inginkan. Secara khusus, menggunakan tsc -b
opsi baru dan referensi tidak berfungsi, karena itu memerlukan kode untuk dimodulasi dan Bot Land memerlukan satu file dengan semua fungsi yang didefinisikan di tingkat atas.
Apa cara terbaik untuk mencapai sebanyak mungkin hal berikut ini?
- Tidak diperlukan boilerplate baru untuk menambahkan bot baru (mis. Tidak ada
tsconfig.json
per bot) - Gunakan
import
untuk fungsi-fungsi umum untuk menghindari mengeluarkan kode yang tidak digunakan, tetapi kemudian ... - Masih menampilkan semua fungsi sebagai satu file tunggal dalam format spesifik Bot Land
- Langkah build tunggal yang menghasilkan banyak file output, satu untuk setiap bot
- Bonus: mengintegrasikan proses pembuatan dengan VS Code. Ada boilerplate saat ini sesuai
tasks.json
untuk membangun setiap sub-proyek.
Samar-samar aku menduga jawabannya mungkin melibatkan sesuatu seperti Grunt tsc
, tapi aku tidak cukup tahu tentang itu.
bot.js
?
tsconfig.json
. File bot yang di-transpile dapat dinamai apa saja, lebih disukai versi .js dari file asli. Saya sudah mengaturnya sekarang di repo keluaran ke build/MissileKite.js
.
tsconfig-gas.json
hal yang relevan untuk dilihat di sana?
<root>/MissileKite.ts
)