Зараз я пишу кілька сценаріїв для Bot Land . Bot Land - стратегічна гра в реальному часі, де замість того, щоб керувати своїми підрозділами за допомогою миші та клавіатури, ви пишете код, щоб керувати своїми ботами за допомогою API, а потім ваші боти йдуть на боротьбу з іншими ботами. Якщо ви знайомі з підрозділами в SC2, ви можете створити ботів, схожих на моргаючі сталкери, облогові цистерни, медики та ультраліски. (Це досить весела гра для інженерів програмного забезпечення, але це поза сферою цього питання.)
Контроль ботів має три рівні зростаючої складності: AI за замовчуванням, мова програмування, схожа на Scratch , та зменшений набір JavaScript під назвою BotLandScript. Хоча вбудований редактор для BotLandScript розумний, ви повинні завантажувати весь код у вигляді одного файлу з глобальними функціями верхнього рівня скрізь. Звичайно, через деякий час це стає болісним, якщо ваш код починає отримувати довгі і різні боти мають однакові функції.
Щоб полегшити написання коду для декількох ботів, зменшити шанс ненавмисних помилок при кодуванні в голому JS та збільшити шанси на побиття інших гравців, я створив вищевказаний проект TypeScript, щоб забезпечити загальну бібліотеку, а також код для кожного з моїх ботів . Поточна структура каталогу виглядає приблизно так:
lib/
bot.land.d.ts
common.ts
BlinkStalker/
BlinkStalker.ts
tsconfig.json
Artillery/
Artillery.ts
tsconfig.json
SmartMelee/
SmartMelee.ts
tsconfig.json
lib
є загальним кодом, який ділиться між ботами, і дає визначення TypeScript для API (не-TS) Bot Land API. Після цього кожен бот отримує власну папку, в якому один файл містить код бота, а інший - панель котлів tsconfig.json
:
{
"compilerOptions": {
"target": "es3",
"module": "none",
"sourceMap": false,
"outFile": "bot.js"
},
"files": [
"MissileKite.ts"
],
"include": [
"../lib/**/*"
]
}
Коли кожен tsconfig.json
побудований, він створює відповідний, bot.js
який містить перекладений код від самого бота, а також весь код у common.js
. Ця настройка є неоптимальною з кількох причин, серед інших: вона вимагає багато дублікатів котла, ускладнює додавання нових ботів, включає багато непотрібного коду для кожного бота і вимагає, щоб кожен бот був побудований окремо.
Однак, базуючись на моєму дослідженні дотепер , не здається, що існує простий спосіб зробити те, що я хочу. Зокрема, використання нової tsc -b
опції та посилань не працює, тому що для цього потрібно модулювати модуль, а Bot Land вимагає єдиного файлу з усіма функціями, визначеними на верхньому рівні.
Який найкращий спосіб досягти якомога більшої кількості наступного?
- Не потрібно нових котлів для додавання нового бота (наприклад, немає
tsconfig.json
на бота) - Використовуйте
import
для загальних функцій, щоб уникнути виведення невикористаного коду, але потім ... - Все-таки виводите всі функції як один єдиний файл у певному форматі Bot Land
- Один крок збирання, який створює кілька вихідних файлів, по одному для кожного бота
- Бонус: інтеграція процесу складання з кодом VS. Наразі існує котельна плита
tasks.json
для створення кожного підпроекту.
Я невпевнено вважаю, що відповідь, ймовірно, передбачає щось на кшталт Грунта tsc
, але я не знаю про це, щоб бути впевненим.
bot.js
?
tsconfig.json
. Транспільовані ботові файли можуть бути названі будь-якими, бажано, .js версією вихідного файлу. У мене це налаштовано таким чином зараз у репо-репортажі до build/MissileKite.js
.
tsconfig-gas.json
відповідна річ, яку слід подивитися там?
<root>/MissileKite.ts
)