J'écris actuellement des scripts pour Bot Land . Bot Land est un jeu de stratégie en temps réel où au lieu de contrôler vos unités avec une souris et un clavier, vous écrivez du code pour contrôler vos bots via une API, puis vos bots vont combattre les bots des autres. Si vous connaissez les unités de SC2, vous pouvez créer des robots similaires aux harceleurs clignotants, aux chars de siège, aux médecins et aux ultralisks. (C'est un jeu assez amusant pour les ingénieurs logiciels, mais cela sort du cadre de cette question.)
Le contrôle des bots a trois niveaux de complexité croissante: une IA par défaut, un langage de programmation de type Scratch et un ensemble réduit de JavaScript appelé BotLandScript. Bien que l'éditeur intégré pour BotLandScript soit raisonnable, vous devez télécharger tout votre code en un seul fichier avec des fonctions globales de premier niveau partout. Naturellement, cela commence à devenir douloureux après un certain temps si votre code commence à devenir long et que des robots différents partagent les mêmes fonctions.
Pour faciliter l'écriture de code pour plusieurs robots, réduire le risque d'erreurs involontaires lors du codage en JS nu et augmenter mes chances de battre les autres joueurs, j'ai configuré le projet TypeScript ci - dessus pour fournir une bibliothèque commune ainsi que du code pour chacun de mes robots . La structure de répertoire actuelle ressemble approximativement à la suivante:
lib/
bot.land.d.ts
common.ts
BlinkStalker/
BlinkStalker.ts
tsconfig.json
Artillery/
Artillery.ts
tsconfig.json
SmartMelee/
SmartMelee.ts
tsconfig.json
lib
est le code commun qui est partagé entre les bots et fournit des définitions TypeScript pour l'API Bot Land (non-TS). Chaque bot obtient alors son propre dossier, avec un fichier contenant le code du bot et l'autre un passe-partout tsconfig.json
:
{
"compilerOptions": {
"target": "es3",
"module": "none",
"sourceMap": false,
"outFile": "bot.js"
},
"files": [
"MissileKite.ts"
],
"include": [
"../lib/**/*"
]
}
Quand chacun tsconfig.json
est construit, il crée un correspondant bot.js
qui contient le code transpilé du bot lui-même ainsi que tout le code common.js
. Cette configuration est sous-optimale pour plusieurs raisons, entre autres: elle nécessite beaucoup de passe-partout en double, rend difficile l'ajout de nouveaux bots, inclut beaucoup de code inutile pour chaque bot et nécessite que chaque bot soit construit séparément.
Cependant, d'après mes recherches jusqu'à présent , il ne semble pas qu'il existe un moyen facile de faire ce que je veux. En particulier, l'utilisation de la nouvelle tsc -b
option et des nouvelles références ne fonctionne pas, car cela nécessite une modularisation du code et Bot Land nécessite un fichier unique avec toutes les fonctions définies au niveau supérieur.
Quelle est la meilleure façon d'obtenir le plus grand nombre possible des éléments suivants?
- Aucun nouveau passe-partout requis pour ajouter un nouveau bot (par exemple, aucun
tsconfig.json
par bot) - Utilisez
import
pour les fonctions courantes pour éviter de sortir du code inutilisé, mais alors ... - Toujours afficher toutes les fonctions dans un seul fichier au format spécifique de Bot Land
- Une seule étape de génération qui produit plusieurs fichiers de sortie, un pour chaque bot
- Bonus: intégration du processus de construction avec VS Code. Il existe actuellement un passe-partout correspondant
tasks.json
pour la construction de chaque sous-projet.
Je suppose vaguement que la réponse implique probablement quelque chose comme Grunt en plus tsc
, mais je n'en sais pas assez pour en être sûr.
bot.js
?
tsconfig.json
. Les fichiers bots transpilés peuvent être nommés n'importe quoi, de préférence la version .js du fichier d'origine. Je l'ai configuré de cette façon maintenant dans le repo en sortie vers build/MissileKite.js
.
tsconfig-gas.json
la chose pertinente à regarder là-bas?
<root>/MissileKite.ts
)