# Inner Core Mod Toolchain — конфигурация

Любые операции тулчейна руководствуются файлами конфигураций для сборки проекта, осуществления его создания и заданием базовых свойств шаблонов.

Существует несколько типов конфигураций, описание свойств каждой из которых описано далее. Если существует значение по умолчанию, оно также указано.

Выборки путей могут содержать /\*\*/ для выбора папок и всех подпапок, а также /\* для выбора всех файлов, /\*.js или /\*.jar для выбора всех файлов с нужным разрешением.

## make.json — сборка проекта

Свойства, отмеченные \* могут иметь абсолютные пути к файлам.

```js
.
├─ info: {} // основная информация о проекте, задается на этапе его создания
│  ├─ name: "Mod"
│  ├─ version: "1.0"
│  ├─ author: "ICMods"
│  ├─ description: ""
│  ├─ clientOnly: false
│  └─ *icon: "mod_icon.png"
├─ api: "CoreEngine" // "CoreEngine", "AdaptedScript", "Preloader", "PrefsWinAPI", "Instant"
├─ optimizationLevel: -1 // значение между -1..9, служит для выгрузки скриптов из памяти
├─ setupScript: null // путь до скрипта, срабатывающего при распаковке архива проекта в мод браузере
│
├─ sources: [] // директории для компиляции скриптов, например основного скрипта для запуска или main.js
│  └─ {}
│     ├─ type // "main", "launcher", "preloader", "instant", "custom", "library"
│     ├─ source // относительный путь до скрипта или папки, поддерживается формат /* для включения подпапок в папке
│     ├─ language: "javascript" // либо "typescript"
│     ├─ target: basename(this.source) + ".js" // имя файла скрипта для выходной компиляции
│     ├─ sourceName: null // экслюзивно для "custom" типов сборки, однако имя скрипта также отображается, например, и при ошибках
│     ├─ includes: ".includes" // файл для сборки скриптов, в одной папке их может быть несколько
│     ├─ api: api // "CoreEngine", "AdaptedScript", "Preloader", "PrefsWinAPI"
│     └─ optimizationLevel: optimizationLevel // значение между -1..9, служит для выгрузки скриптов из памяти
│
├─ compile: [] // директории для компиляции C++ и Java кода, это конечно, не означает что вы можете просто взять исходный код с Forge, однако это не менее интересная вещь
│  └─ {}
│     ├─ type // "native", "java"
│     ├─ source // относительный путь до папки, поддерживается формат /* для включения подпапок в папке
│     └─ rules: {} // экслюзивно для нативного моддинга
│        ├─ keepSources: false // оставлять ли исходники в проекте после компиляции
│        ├─ keepIncludes: true // оставлять ли заголовки (инклюды, хедеры) в проекте после компиляции
│        └─ link: [] // дополнительная слинковка лишь для этого исходника
│
├─ resources: [] // директории для сборки ресурсов, например текстур предметов или интерфейса
│  └─ {}
│     ├─ type // "resource_directory", "gui", "minecraft_resource_pack", "minecraft_behavior_pack"
│     ├─ path // относительный путь до папки с ресурсами
│     └─ target: basename(this.path) // путь в проекте после сборки
│
├─ additional: [] // дополнительные директории, которые необходимо включить в проект после сборки
│  └─ {}
│     ├─ sources // относительный путь до папки, поддерживается формат /* для включения подпапок в папке
│     └─ pushTo // выходной путь в проекте после сборки
├─ excludeFromRelease: [] // относительные пути до папок, исключаемых из проекта при сборке в релиз, поддерживается формат /* для включения подпапок в папке
│
├─ gradle: {} // эксклюзивно для жабного моддинга
│  ├─ keepLibraries: true // оставлять ли библиотеки в проекте после компиляции
│  ├─ keepSources: false // оставлять ли исходники в проекте после компиляции
│  └─ classpath: [] // дополнительные пути для включения в системные библиотеки, они не будут включены в сам архив
├─ linkNative: [] // пути, которые будут слинкованы для всех нативных исходников
│
└─ target: {} // пути для выходной сборки по умолчанию
   ├─ source: "source" // все скрипты кроме библиотек
   ├─ library: "library" // только библиотеки скриптов
   ├─ native: "native" // нативный моддинг
   ├─ java: "java" // жабный моддинг
   ├─ resource_directory: "resources" // ресурсы текстур блоков, предметов и различных атласов
   ├─ gui: "gui" // встроенный интерфейс Inner Core
   ├─ minecraft_resource_pack: "minecraft_packs/resource" // ресурспаки, включаемые в игру после входа в мир
   └─ minecraft_behavior_pack: "minecraft_packs/behavior" // аддоны, включаемые в игру после входа в мир
```

Основная конфигурация для проектов. Каждое из свойств, не заданное здесь, может быть также получено из основной конфигурации как значение по умолчанию.

## toolchain.json — основная конфигурация

Свойства, отмеченные \* могут иметь абсолютные пути к файлам.

```js
.
├─ *projectLocations: [] // относительные или абсолютные пути до проектов, сканируется вся папка на наличие конфигураций make.json и template.json
├─ *workspaceFile: "../toolchain.code-workspace" // путь до файла среды, эксклюзивно для Visual Studio Code, в него добавляются все открытые и созданные проекты
│
├─ ^template: {} // свойство info из make.json, значения автоматически заполняются при создании проекта, перезаписывает свойства из шаблона если они заданы и там
│  └─ ^skipDescription: false // пропускает страницу описания при создании проекта из шаблона, т.е. будет достаточно лишь ввести имя, остальные свойства будут взяты из шаблона или перезаписаны свойствами
├─ *defaultTemplate: "../toolchain-mod" // шаблон, выбранный по умолчанию при создании проекта, может быть относительным или абсолютным путем до него
│
├─ denyJavaScript: true // использует компилятор tsc даже в том случае, если в проекте используется исключительно JavaScript
├─ *debugIncludesExclude: [] // выборка деклараций, исключаемых tsc при компиляции во время разработки, помогает сократить ее время; если путь не найден, будет совершена повторная попытка уже с абсолютным вариантом
│
├─ ^*ndkPath: null // может быть указан если у вас уже установлен NDK для компиляции нативного кода, рекомендуется использовать версию r16b; по умолчанию поиск компилятора будет осуществлен в PATH или установлен самим тулчейном
├─ abis: [] // "armeabi-v7a", "arm64-v8a", "x86", "x86_64"
├─ debugAbi: "armeabi-v7" // основная архитектура для компиляции нативного кода во время разработки
│
├─ pushTo // основная выходная папка модпака на устройстве, выбирается при любом подключении; путь в тулчейне до модпака, в мейке до самого мода
├─ adb: {} // дополнительные настройки моста отладки устройств
│  ├─ pushAnyLocation: false // по умолчанию если свойство pushTo не указывает на установку пака Inner Core, будет выдано предупреждение на отправку в странную локацию; эта настройка отключает его
│  ├─ pushUnchangedFiles: true // нужно ли отправлять все файлы на устройство, либо же только измененные
│  └─ doNothingIfDisconnected: false // вместо предложения настройки устройства в консоли просто завершает процесс сборки если ни одного устройства не подключено
├─ ^devices: [] // список сохраненных устройств, изменяемый при подключении во время настройки ADB; здесь содержится приватная информация, поэтому его изменение невозможно из make.json
│
├─ ^componentInstallationWithoutCommit: false // нужны ли пометки .commit в установленных компонентах; если не нужны, обновления не смогут быть установлены, а компонент будет считаться установленным если существует папка с ним
└─ ^updateAcceptReplaceConfiguration: true // нужно ли заменять файлы конфигураций в основной папке тулчейна, такие как .vscode/tasks.json и прочие; в противном случае ваши изменения останутся неизменными даже с обновлениями
```

Может быть создан лишь один раз в основной директории тулчейна, некоторые из свойств отмеченные ^ не могут быть изменены из *make.json* для сборки.

## template.json — шаблон проекта

 > Наследуется напрямую от *make.json* для сборки проекта, свойство `info` перезаписывается при создании проекта. Помимо этого, свойства из `info` будут применены как значения по умолчанию при использовании шаблона.

Если этот файл существует в директории и проект может быть найден, впоследствии он будет использован как шаблон при создании проекта. Может быть использован совместно с *make.json* для сборки проекта.
