配置具有公共依赖项的TypeScript项目,以构建多个普通JavaScript输出文件
我现在正在为你写作。Bot Land是一款实时战略游戏,你不用鼠标和键盘来控制你的单位,而是通过API编写代码来控制你的机器人,然后你的机器人去对抗其他机器人。如果您熟悉SC2中的单位,您可以创建类似于眨眼跟踪者、攻城坦克、医疗兵和超级蜥蜴的机器人。(对于软件工程师来说,这是一个相当有趣的游戏,但这超出了这个问题的范围。) Bot控件有三个日益复杂的级别:默认AI、类似a的编程语言和一组称为BotLandScript的简化JavaScript。尽管BotLandScript的内置编辑器是合理的,但您必须将所有代码作为一个文件上传,其中包含全局顶级函数。当然,如果您的代码开始变长,并且不同的机器人共享相同的功能,那么过一段时间后,这会变得很痛苦 为了便于为多个机器人编写代码,减少在裸JS中编写代码时出现意外错误的机会,并增加击败其他玩家的机会,我设置了,以便为我的每个机器人提供一个公共库和代码。当前目录结构大致如下所示:配置具有公共依赖项的TypeScript项目,以构建多个普通JavaScript输出文件,javascript,typescript,visual-studio-code,tsconfig,Javascript,Typescript,Visual Studio Code,Tsconfig,我现在正在为你写作。Bot Land是一款实时战略游戏,你不用鼠标和键盘来控制你的单位,而是通过API编写代码来控制你的机器人,然后你的机器人去对抗其他机器人。如果您熟悉SC2中的单位,您可以创建类似于眨眼跟踪者、攻城坦克、医疗兵和超级蜥蜴的机器人。(对于软件工程师来说,这是一个相当有趣的游戏,但这超出了这个问题的范围。) Bot控件有三个日益复杂的级别:默认AI、类似a的编程语言和一组称为BotLandScript的简化JavaScript。尽管BotLandScript的内置编辑器是合理的
lib/
bot.land.d.ts
common.ts
BlinkStalker/
BlinkStalker.ts
tsconfig.json
Artillery/
Artillery.ts
tsconfig.json
SmartMelee/
SmartMelee.ts
tsconfig.json
lib
是机器人程序之间共享的通用代码,并为(非TS)机器人程序陆地API提供类型脚本定义。然后,每个bot都会获得自己的文件夹,其中一个文件包含bot代码,另一个文件包含样板文件tsconfig.json
:
{
"extends": "../tsconfig-botland",
"compilerOptions": {
"outFile": "../../build/AggroMiner.js"
},
"files": ["index.ts"],
"include": ["**/*.ts", "../lib/**/*.ts"]
}
{
“编译器选项”:{
“目标”:“es3”,
“模块”:“无”,
“sourceMap”:false,
“outFile”:“bot.js”
},
“文件”:[
“MissileKite.ts”
],
“包括”:[
“./lib/***”
]
}
当构建每个tsconfig.json
时,它会创建一个相应的bot.js
,其中包含bot自身传输的代码以及common.js
中的所有代码。此设置不太理想,原因包括:它需要大量重复的样板文件,很难添加新的bot,每个bot都包含大量不必要的代码,并且需要单独构建每个bot
然而,根据我的经验,似乎没有一个简单的方法来做我想做的事情。特别是,使用新的tsc-b
选项和引用不起作用,因为这需要将代码模块化,而Bot-Land需要一个文件,其中所有函数都在顶层定义
实现以下目标的最佳方法是什么
- 添加新bot不需要新的样板文件(例如,每个bot不需要
tsconfig.json
- 对常用函数使用
,以避免输出未使用的代码,但import
- 仍然以Bot Land的特定格式将所有函数作为一个文件输出
- 生成多个输出文件的单个构建步骤,每个bot一个输出文件
- 好处:将构建过程与VS代码集成。目前,每个子项目都有相应的样板文件
我模模糊糊地猜测,答案可能是除了
tsc
之外,还涉及到咕噜之类的东西,但我对这方面的了解还不够确定。您实际上可以使用项目参考。按照以下步骤获得与原始文件相同的结果,所有函数都位于一个文件的顶层。然而,我找不到一个只在机器人程序中导入所需功能的解决方案。也就是说,不使用进口和出口
在根目录下的tsconfig.json中
{
"files": [],
"references": [
{ "path": "./lib" }
{ "path": "./AggroMiner" }
{ "path": "./ArtilleryMicro" }
{ "path": "./MissileKite" }
{ "path": "./SmartMelee" }
{ "path": "./ZapKite" }
]
}
接下来,在lib文件夹中,添加一个tsconfig.json,如下所示
{
"compilerOptions": {
"declaration": true,
"declarationMap": true,
"composite": true,
"rootDir": ".",
"outFile": "../build/lib.js",
"target": "es3",
"removeComments": true,
"sourceMap": false,
},
"files": [
"data.ts",
"movement.ts",
"utils.ts"
]
}
我们需要对data.ts、movement.ts和utils.ts进行一些调整,这样ts就不会因为编译错误而困扰我们
data.ts
/// <reference path="./bot.land.d.ts"/>
(...)
以及机器人程序的tsconfig.json(根据机器人程序进行调整)
就这样。现在快跑
tsc -b
这是我的回答你的要求
值得注意的文件:
保存任何bot.land脚本的设置(包括我移动到src/tsconfig botland.json
types/bot-land/index.d.ts的自定义声明)。您可能需要更改我使用的
严格设置
保存对所有机器人程序的引用。这是每当您要添加另一个bot脚本时要编辑的文件src/tsconfig.json
tsconfig.json
和一个或多个.ts
脚本文件
例如src/AggroMiner/tsconfig.json
:
{
"extends": "../tsconfig-botland",
"compilerOptions": {
"outFile": "../../build/AggroMiner.js"
},
"files": ["index.ts"],
"include": ["**/*.ts", "../lib/**/*.ts"]
}
在大多数情况下,要启动新的bot脚本,您应该:
src/AggroMiner
)复制到src
src//tsconfig.json
以编辑带有机器人名称的outFile
src/tsconfig.json
并添加对src/
npm
/warn
脚本:
生成所有机器人程序build
在运行build clean
build
在format
src
对所有bot脚本运行tslint检查lint
- 添加新bot不需要新的样板文件(例如,每个bot不需要tsconfig.json)
tsconfig.json
并运行tsc
。除非严格必要,否则最低限度的设置(如上所述)可能就足够了
- 对常用函数使用导入以避免输出未使用的代码,但
export
/
{
"extends": "../base",
"compilerOptions": {
"outFile": "../build/AggroMiner.js",
},
"files": [
"AggroMiner.ts"
],
"references": [
{ "path": "../lib", "prepend": true } //note the prepend: true
]
}
tsc -b
{
"extends": "../tsconfig-botland",
"compilerOptions": {
"outFile": "../../build/AggroMiner.js"
},
"files": ["index.ts"],
"include": ["**/*.ts", "../lib/**/*.ts"]
}