配置具有公共依赖项的TypeScript项目,以构建多个普通JavaScript输出文件

配置具有公共依赖项的TypeScript项目,以构建多个普通JavaScript输出文件,javascript,typescript,visual-studio-code,tsconfig,Javascript,Typescript,Visual Studio Code,Tsconfig,我现在正在为你写作。Bot Land是一款实时战略游戏,你不用鼠标和键盘来控制你的单位,而是通过API编写代码来控制你的机器人,然后你的机器人去对抗其他机器人。如果您熟悉SC2中的单位,您可以创建类似于眨眼跟踪者、攻城坦克、医疗兵和超级蜥蜴的机器人。(对于软件工程师来说,这是一个相当有趣的游戏,但这超出了这个问题的范围。) Bot控件有三个日益复杂的级别:默认AI、类似a的编程语言和一组称为BotLandScript的简化JavaScript。尽管BotLandScript的内置编辑器是合理的

我现在正在为你写作。Bot Land是一款实时战略游戏,你不用鼠标和键盘来控制你的单位,而是通过API编写代码来控制你的机器人,然后你的机器人去对抗其他机器人。如果您熟悉SC2中的单位,您可以创建类似于眨眼跟踪者、攻城坦克、医疗兵和超级蜥蜴的机器人。(对于软件工程师来说,这是一个相当有趣的游戏,但这超出了这个问题的范围。)

Bot控件有三个日益复杂的级别:默认AI、类似a的编程语言和一组称为BotLandScript的简化JavaScript。尽管BotLandScript的内置编辑器是合理的,但您必须将所有代码作为一个文件上传,其中包含全局顶级函数。当然,如果您的代码开始变长,并且不同的机器人共享相同的功能,那么过一段时间后,这会变得很痛苦

为了便于为多个机器人编写代码,减少在裸JS中编写代码时出现意外错误的机会,并增加击败其他玩家的机会,我设置了,以便为我的每个机器人提供一个公共库和代码。当前目录结构大致如下所示:

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
这是我的回答你的要求

值得注意的文件:

  • src/tsconfig botland.json
    保存任何bot.land脚本的设置(包括我移动到
    types/bot-land/index.d.ts的自定义声明)。您可能需要更改我使用的
    严格设置
  • src/tsconfig.json
    保存对所有机器人程序的引用。这是每当您要添加另一个bot脚本时要编辑的文件
bot脚本至少包含两个文件:一个最小值
tsconfig.json
和一个或多个
.ts
脚本文件

例如
src/AggroMiner/tsconfig.json

{
    "extends": "../tsconfig-botland",
    "compilerOptions": {
        "outFile": "../../build/AggroMiner.js"
    },
    "files": ["index.ts"],
    "include": ["**/*.ts", "../lib/**/*.ts"]
}
在大多数情况下,要启动新的bot脚本,您应该:

  • 将任何bot文件夹(即
    src/AggroMiner
    )复制到
    src
  • 编辑
    src//tsconfig.json
    以编辑带有机器人名称的
    outFile
  • 编辑
    src/tsconfig.json
    并添加对
    src/
  • 已设置以下
    npm
    /
    warn
    脚本:

    • build
      生成所有机器人程序
    • build clean
      在运行
      build
    • format
      src
    • lint
      对所有bot脚本运行tslint检查
    现在列出您的需求:

    • 添加新bot不需要新的样板文件(例如,每个bot不需要tsconfig.json)
    要实现这一点,需要创建一些脚本来枚举您的机器人文件夹/脚本。。。并设置相关的per bot
    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"]
    }